Domain driven design 为什么不应该';t值对象引用其所有者?

Domain driven design 为什么不应该';t值对象引用其所有者?,domain-driven-design,Domain Driven Design,我读过,在大多数情况下,值对象不应该引用其所有者 a) 我的解释是,关联应该是单向的,只能从所有者到VO进行遍历 b) 为什么VOs不应该提及他们的所有者 谢谢这是一种代码气味,可供参考其所有者,因为它表明违反了以及。根据定义,值对象是一个除了保存值之外几乎不做其他事情的对象。因此,它是不可变的,没有大多数逻辑(业务逻辑、生命周期逻辑等)。我遵循这一原则,因为我希望我的POJO设计独立于使用它们的客户机,并在代码级别将其与客户机分离。这样,它们就变得便携了 a) 我把这理解为,联想应该是 单向,

我读过,在大多数情况下,值对象不应该引用其所有者

a) 我的解释是,关联应该是单向的,只能从所有者到VO进行遍历

b) 为什么VOs不应该提及他们的所有者


谢谢

这是一种代码气味,可供参考其所有者,因为它表明违反了以及。根据定义,值对象是一个除了保存值之外几乎不做其他事情的对象。因此,它是不可变的,没有大多数逻辑(业务逻辑、生命周期逻辑等)。

我遵循这一原则,因为我希望我的POJO设计独立于使用它们的客户机,并在代码级别将其与客户机分离。这样,它们就变得便携了

a) 我把这理解为,联想应该是 单向,只能从所有者到VO

b) 为什么VOs不应该提及他们的所有者

  • 因为它不需要。值对象是简单的对象,VO中的潜在行为通常只与自身或自身类的另一个实例相关

  • 因为值对象可以包含在多个所有者类型中,可能包含在多个聚合中

  • 因为值对象相等是基于所有字段相等,并且你不希望仅仅因为一个奇怪的所有者字段,John眼睛的绿色被认为与Laura眼睛的绿色有任何不同

  • 因为无论如何都不鼓励双向关联(即使在实体中)


我同意VO应该是不可变的,但不同意它缺少业务逻辑。相反,它是BL的合适位置,特别是在功能风格中。Fowler的定义没有对业务逻辑提出任何要求。此外,PEAA的发布时间略早于DDD书籍,该书扩展了VO的定义。最近对函数式编程的关注也扩展了该定义。但是,该定义非常具体,对象很小,至少在我的经验中,这与重要的业务逻辑不长期兼容。@user437291“我认为是VO违反了SRP,而不是它的所有者?”是。@User437291VO可以引用其父级,但不鼓励这样做,因为附加的依赖关系可能会导致持久性等问题。如果需要,最好将依赖项显式地作为方法参数而不是引用。