Domain driven design DDD中的子实体和值对象之间的差异

Domain driven design DDD中的子实体和值对象之间的差异,domain-driven-design,Domain Driven Design,我发现在上一节中,我可以看到子实体(此处:order item)和值对象(此处:address)之间的区别 我不完全确定它们在架构级别上有什么不同。我想说的是,它们都是值对象(在根顺序中聚合) 我在图片中遗漏了什么?值对象是“带有方法的值”,而不是“对象” “Address”作为一个值,与一个类似于原语的整数没有本质上的区别。两者之间的显著区别在于大多数通用编程语言都没有内置地址类型。所以我们必须推出我们自己的——或者从图书馆重复使用一个 在许多现代语言中,您只能通过使用“对象”习惯用法来创建

我发现在上一节中,我可以看到子实体(此处:order item)和值对象(此处:address)之间的区别

我不完全确定它们在架构级别上有什么不同。我想说的是,它们都是值对象(在根顺序中聚合)

我在图片中遗漏了什么?

值对象是“带有方法的值”,而不是“对象”

“Address”作为一个值,与一个类似于原语的整数没有本质上的区别。两者之间的显著区别在于大多数通用编程语言都没有内置地址类型。所以我们必须推出我们自己的——或者从图书馆重复使用一个

在许多现代语言中,您只能通过使用“对象”习惯用法来创建所需的定制数据结构和查询语义来实现自己的功能

值对象是附加了查询语义的数据

另一方面,实体会随着时间的推移而变化。实体实现的一种思维方式是,在封面下,实体是对值的可变引用

void Entity::onChange(data) {
    // dereference to get the current state value
    val oldState = this.state;

    // use a pure function to compute a new state value
    val newState = stateChange(oldState, data);

    // update the reference
    this.state = newState;
}
用于保存状态的特定数据结构是解决方案中其他元素不感兴趣的实体的实现细节

子实体是一个实体,也就是说它是一个负责管理某些隐式数据结构的对象。它是为改变而设计的

它“就像根一样”,但在更小的范围内——根对整个上下文有更完整的感觉

另见

  • --罗伯特·马丁
  • --斯图尔特·哈洛韦