Domain driven design 为什么我们需要识别实体和价值对象?

Domain driven design 为什么我们需要识别实体和价值对象?,domain-driven-design,Domain Driven Design,在领域驱动设计中,领域对象分为两类,实体和价值对象。很容易区分哪一类是实体,哪一类是价值对象,但我不知道为什么我们必须这样做?在DDD出现之前,我们对没有实体和价值对象的领域进行建模。DDD被提出后,我们使用实体和值对象对域对象进行分类,那么这种分类的优点是什么 域对象分为两类: 实际上,不,对象是域概念的可能实现,它基本上只是信息,而不是代码。一个概念可以是一个实体,因为无论它随时间如何变化,以唯一和一致的方式识别它是有意义的(例如:一个客户可以更改其名称,但它是同一个客户。2个同名客户不一定

在领域驱动设计中,领域对象分为两类,实体和价值对象。很容易区分哪一类是实体,哪一类是价值对象,但我不知道为什么我们必须这样做?在DDD出现之前,我们对没有实体和价值对象的领域进行建模。DDD被提出后,我们使用实体和值对象对域对象进行分类,那么这种分类的优点是什么

域对象分为两类:

实际上,不,对象是域概念的可能实现,它基本上只是信息,而不是代码。一个概念可以是一个实体,因为无论它随时间如何变化,以唯一和一致的方式识别它是有意义的(例如:一个客户可以更改其名称,但它是同一个客户。2个同名客户不一定是同一个人)

一个Value对象(这个名称仍然提醒我们DDD开始时有点过于耦合到OOP)表示一个域概念,它只是一个值。或者更准确地说,企业只关心其价值。如果你改变它,它就是另一个值。基本上,5美元就是5美元,你不在乎哪一个是哪一个,它们中的任何一个都足够好,因为只有是重要的

另一件事是,作为一个领域建模者,您可以根据业务对概念的看法来识别概念的性质。业务告诉你他们关心什么

现在,我们知道一个概念可以是一个实体,我们可以选择它的某个实例(Id为3的用户)。你不能用VO做这件事,因为VO没有身份

更重要的是,当我们识别聚合时,大多数时候,聚合组件(其他概念)主要是VO,因为它们通常只是值(但它们确实尊重业务约束)

总之,我们将概念分为实体和VO,因为

  • 企业以这样的方式看待它们:唯一可识别的,或者仅仅是价值
  • 实体保持其标识,无论它们如何更改(显然标识本身是只读的),我们将每个实体视为唯一的
  • VO是可以互换使用的值,我们不在乎哪个是哪个,只要它们代表相同的值(作为实现细节,它本身可以是复杂的复合值)。此外,VO本质上是不可变的,因此我们知道,如果不改变它,就不能成为另一个值

在DDD出现之前,我们对没有实体和价值对象的领域进行建模,DDD提出之后,我们使用实体和价值对象对领域对象进行分类,这样分类的优点是什么

您应该阅读的第5章(“用软件表示的模型”)

埃文斯写道:

定义明确遵循一种模式或另一种模式的对象可以减少对象的模糊性,并为稳健设计的特定选择规划路径

跟踪实体的标识非常重要,但将标识附加到其他对象可能会影响系统性能,增加分析工作,并通过使所有对象看起来相同来混淆模型

。。。两个值对象之间的双向关联毫无意义。如果没有标识,那么说一个对象指向指向它的同一个值对象是毫无意义的。你最多只能说它指向一个与指向它的对象相等的对象,但你必须在某个地方强制执行该不变量


我自己的总结是:认识到一些领域概念是实体是有用的,因为它鼓励设计师承认身份、连续性和生命周期是该领域实体的重要关注点。类似地,认识到概念是一种价值,立即让你从这些顾虑中解脱出来,让你注意到它们不变的本质和等价性。

你会把人模拟成汽车吗?这会在系统中造成什么问题?这就是你要问的问题。您能解释一下为什么您认为将实体建模为值对象并不重要,反之亦然?这将使答案更加简洁。@plalx在DDD出现之前,我们对没有实体和值对象的域进行建模。在DDD被提出之后,我们使用实体和值对象对域对象进行分类,那么这种分类的优点是什么?“在DDD出现之前,我们对没有实体和值对象的域进行建模”那根本不是真的。自OO诞生之日起,实体和值对象一直是每个OO设计的一部分,只是我们没有使用这些特定的名称来描述这些概念。