问题: DDD 实现中领域对象区分实体 (Entity) 和值对象 (Value Object) 的目的 (Why) 是什么? 或者换一种问法: 领域对象区分实体 (Entity) 和值对象 (Value Object) 之后, 带来的好处和收益是什么?
回答: 从 DDD 的概念上讲, 实体 (Entity) 与值对象 (Value Object) 的本质区别仅在于后者无需 identity(唯一标识). 这其实就是带来的价值 -- 就是你设计的对象不需要去跟踪和管理这个唯一标识.
这是概念划分上, 值对象带来的价值.
再来说设计层面. 通常情况下, 我们建议将值对象设计成一个不变 (Immutable) 对象. 当一个对象是不变的时, 你就基本不需要担心并发带来的诸如同步, 冲突等问题了, 这既降低了编程的难度, 又可以无需引入额外的同步锁影响程序的性能.
反而过来说, 之所以可以将值对象设计成不变的, 其根本原因还是在于我们无需跟踪和管理唯一标识.
在领域驱动设计中, 我们提倡的实践是尽量定义值对象来替代基本类型, 原因在于基本类型无法体现统一语言中的领域概念. 此外, 在多数语言中, 我们无法对基本类型做封装, 就意味着一个领域概念缺乏领域行为来支持. 假设一个实体定义了许多属性, 如果这些属性都是基本类型, 就会导致与这些属性相关的领域行为都要放到实体中, 导致实体的职责变得不够单一.
引入值对象后, 情况就不同了, 因为我们可以利用合理的职责分配, 将这些职责 (领域行为) 按照内聚性分配到各个值对象中, 这个领域模型就能变得协作良好.
当然, 反过来说, 之所以可以这样设计, 还是在于值对象无需承担跟踪和管理唯一标识的职责.
这也是为何 Eric 要将实体和值对象分开的主要原因, 也是值对象给我们带来的价值所在.
来源: https://juejin.im/entry/5c6f39d4e51d4572c95811a7