Domain driven design 是否有ID-关于值对象

Domain driven design 是否有ID-关于值对象,domain-driven-design,Domain Driven Design,假设有两个域对象:Product和ProductVariety(包含颜色、大小等数据)。这两者之间的关系是一对多的。从概念上讲,在领域驱动的设计中,ProductVarity应该是一个值对象,一旦其数据发生更改,它就不是同一个对象。然而,从实现的角度来看,最好对ProductVarity进行某种分类标识,以便我们知道选择了哪个ProductVariable等等。是将其转换为实体类的唯一解决方案吗 下面是一段代码来说明这种情况 @Embeddable class ProductVariety {.

假设有两个域对象:Product和ProductVariety(包含颜色、大小等数据)。这两者之间的关系是一对多的。从概念上讲,在领域驱动的设计中,ProductVarity应该是一个值对象,一旦其数据发生更改,它就不是同一个对象。然而,从实现的角度来看,最好对ProductVarity进行某种分类标识,以便我们知道选择了哪个ProductVariable等等。是将其转换为实体类的唯一解决方案吗

下面是一段代码来说明这种情况

@Embeddable
class ProductVariety {...}

@Entity
class Product {

  @ElementCollection
  private Set<ProductVariety> varities;

  ...
}
@可嵌入
类ProductVariation{…}
@实体
类产品{
@元素集合
私有集变量;
...
}
从概念上讲,在域驱动的设计中,ProductVarity应该是一个值对象,一旦其数据发生更改,它就不是同一个对象

那拼写不太正确。几乎在所有情况下(许多情况下),值对象都应该是不可变的;它的数据永远不会改变

是将其转换为实体类的唯一解决方案吗

“视情况而定”

让标识符成为对象不可变状态的一部分在概念上没有什么错。例如,是特定
颜色(值类型)唯一的
标识符(值类型)

然而,像pantone5395c这样的标识符要有值,就需要语义稳定。更改标识符到实际颜色光谱元素的映射会破坏以前有关颜色的消息的含义。如果标识符是“错误的”,那么正确的做法是弃用该标识符并指定替换者

简单地说,你不能把旧油漆罐上的标签摘下来,再换上新的来重新粉刷房子

在这种情况下,使用标识符与使用整个值对象相比没有什么好处。但这样做也没有错

另一方面,如果您真的要对映射进行建模,并且希望跟踪随时间发生的更改——这几乎就是实体的定义

它真正依赖的是“企业成本”。在您试图解决的问题的背景下,所涉及的权衡是什么


注意:如果您真的发现自己正考虑这样的事情,请务必记录您的成本效益分析,以便下一个开发人员可以从中找到一些面包屑。

非常感谢您的输入。不可变是ProductVariation对象的另一个特征。我将在UUID数据类型中向类添加一个ID字段。