领域驱动设计(下):如何设计金融软件顶层架构?

专有名词

英文解释
entity实体
value object值对象
domain service领域服务
aggregate聚合
aggregation root聚合根节点
factory工厂
repository仓库
event sourcing事件溯源

背景假设

选择债券期权(Bond Option)作为一个金融例子进行讲解。

  • 债券期权,是期权的一种,在期权到期的那一天,选择期权规定的价格购买债券。
  • 期权价格比市场价低,可以用低的期权价格购买债券,然后卖出债券获利。
  • 如果期权的价格比市场高,可以选择什么都不做
  • 可以选择购买债券,然后债券发行人定期给利息。
  • 债券齐全本身是有价格的。
    • 债券齐全的定价过程
      • 输入:债券的所有未来现金流;债券价格的历史数据;无风险利率和债券发行方的信用数据(市场数据)

其他期权:1.看涨期权、2.看跌期权、3.欧式期权、4.美式期权

建模逻辑

实体

实体特点:

  1. 有唯一标识
  2. 用唯一标识符来判断是否是同一个实体
  3. 有生命周期。金融合同从产生到消失的整个过程。

期权代表:未来可能的现金流; 债券资金流:由债券利息构成,利息也算实体。

值对象

面向对象中的OOP对象。比如金融对象中的币种和数值、行权日期、行权方式、市场数据等。

特点:

  1. 没有唯一标识符
  2. 有内部属性
  3. 通过内部属性来判等
  4. 不可修改。修改会返回新的值对象
  5. 不能独立存在,是其他实体或值对象的附属品

一个业务对象,属于实体还是值对象取决于具体业务,需要合理判断。

领域服务

即业务逻辑。 金融行业领域服务特点:

  • 独立存在,不属于任何实体。
  • 无状态。内部不维护全局状态,计算过程不能有任何随机性(不可变架构)
  • 不依附任何实体对象

生命周期管理

实体的生命周期管理

聚合

  1. 规定了一些实体的影响范围和边界。由聚合根描述,通过他可以访问到受影响的实体;
  2. 规定存储边界,聚合内的所有实体在一个事务中操作;
  3. 注意事项
    1. 聚合内的实体,尽量形成有向无环图
    2. 聚合内的实体数量尽量小,方便事务操作
    3. 聚合关系过大,一般通过延时访问做优化

多个聚合

  1. 解决聚合间的引用关系
  2. 一个聚合的内部元素,也可以访问另一个聚合节点

完整的聚合划分结果

工厂

领域驱动设计将业务对象的创建与使用分开。业务对象的使用由领域服务来负责,而创建由工厂来负责。
这里所说的工厂,应该就是工厂模式。

仓库

  1. 业务对象的存储
  2. 聚合序列化和反序列化。即防腐化
    1. 防止协议变更之后的系统间的交互问题
    2. 将老系统和老协议包装成使用新协议的系统;不让外部协议的变化来入侵内部协议。确保数据使用的变化不影响存储协议的变化。
0%