领域驱动设计(下):如何设计金融软件顶层架构?
目录
专有名词
英文 | 解释 |
---|---|
entity | 实体 |
value object | 值对象 |
domain service | 领域服务 |
aggregate | 聚合 |
aggregation root | 聚合根节点 |
factory | 工厂 |
repository | 仓库 |
event sourcing | 事件溯源 |
背景假设
选择债券期权(Bond Option)作为一个金融例子进行讲解。
- 债券期权,是期权的一种,在期权到期的那一天,选择期权规定的价格购买债券。
- 期权价格比市场价低,可以用低的期权价格购买债券,然后卖出债券获利。
- 如果期权的价格比市场高,可以选择什么都不做
- 可以选择购买债券,然后债券发行人定期给利息。
- 债券齐全本身是有价格的。
- 债券齐全的定价过程
- 输入:债券的所有未来现金流;债券价格的历史数据;无风险利率和债券发行方的信用数据(市场数据)
- 债券齐全的定价过程
其他期权:1.看涨期权、2.看跌期权、3.欧式期权、4.美式期权
建模逻辑
实体
实体特点:
- 有唯一标识
- 用唯一标识符来判断是否是同一个实体
- 有生命周期。金融合同从产生到消失的整个过程。
期权代表:未来可能的现金流; 债券资金流:由债券利息构成,利息也算实体。
值对象
面向对象中的OOP对象。比如金融对象中的币种和数值、行权日期、行权方式、市场数据等。
特点:
- 没有唯一标识符
- 有内部属性
- 通过内部属性来判等
- 不可修改。修改会返回新的值对象
- 不能独立存在,是其他实体或值对象的附属品
一个业务对象,属于实体还是值对象取决于具体业务,需要合理判断。
领域服务
即业务逻辑。 金融行业领域服务特点:
- 独立存在,不属于任何实体。
- 无状态。内部不维护全局状态,计算过程不能有任何随机性(不可变架构)
- 不依附任何实体对象
生命周期管理
实体的生命周期管理
聚合
- 规定了一些实体的影响范围和边界。由聚合根描述,通过他可以访问到受影响的实体;
- 规定存储边界,聚合内的所有实体在一个事务中操作;
- 注意事项
- 聚合内的实体,尽量形成有向无环图
- 聚合内的实体数量尽量小,方便事务操作
- 聚合关系过大,一般通过延时访问做优化
多个聚合
- 解决聚合间的引用关系
- 一个聚合的内部元素,也可以访问另一个聚合节点
工厂
领域驱动设计将业务对象的创建与使用分开。业务对象的使用由领域服务来负责,而创建由工厂来负责。
这里所说的工厂,应该就是工厂模式。
仓库
- 业务对象的存储
- 聚合序列化和反序列化。即防腐化
- 防止协议变更之后的系统间的交互问题
- 将老系统和老协议包装成使用新协议的系统;不让外部协议的变化来入侵内部协议。确保数据使用的变化不影响存储协议的变化。