值对象
我们应该优先选择值对象进行来建模而不是实体对象,值对象更容易创建、测试、使用、优化和维护。
值对象的特征
当决定将一个领域概念是否设计为一个值对象时,需要考虑它是否拥有以下特征:
- 它度量或者描述了领域中的一件东西
- 它可以作为不变量
- 它将不同的相关的属性组合成一个概念整体
- 当度量和描述改变时,可用另一个值对象进行替换
- 它可以和其它值对象进行相等性比较
- 它不会对协作对象造成副作用
不变性
除了创建方法之外,不能有其它方法可以对值对象进行修改
可替换性
如果一个实体所引用的值对象能够正确的表达其当前状态,那么这种引用关系可以维持下去。否则,
我们需要将整个值对象替换成一个新的值对象实例
值对象相等性
比较两个值对象实例时,我们需要检查这两个值对象的相等性。
无副作用行为
是指对象的方法只产生输出,不会修改对象的状态。
值对象的设计
- 我们应该尽量让值对象仅依赖于自己的属性,并且只理解自身的状态。(尽量保障,自解性不对外耦合)
- 要增加一个值对象的健壮性,那么传给值对象方法的参数依然应该是值对象
- 对于已经真正简单并且具有整体意义的属性没有必要再封装成值对象的,单一的属性封装成值对象就过度设计了。
- 可以参考策略模式进行实现
参考文献
- 《实现领域驱动设计》 — Vaughn Vernon