DDD - 值对象比。实体对象

时间:2009-01-29 17:36:36

标签: design-patterns domain-driven-design

我是DDD的新手,并努力理解一些概念。您如何在您的域中确定哪些对象是实体对象,哪些是Value对象,以及它们如何区别对待?

2 个答案:

答案 0 :(得分:1)

正如我所看到的,域对象基本上代表业务域的名词而具有身份,而值对象对业务没有任何特殊含义(想想MonetaryAmount)并且没有身份。

答案 1 :(得分:0)

来自Jak Charlton's blog

  

实体“这是我的实体,有很多人喜欢它,但这个是   矿”

     

实体的关键定义特征是它具有   身份 - 它在系统中是唯一的,没有其他实体,没有   重要的是同一个实体,除非它具有相同的身份。

     

身份可以在实体上以多种方式表示 - 它可以是一个   数字标识符(经典的CustomerID),它可能是一个Guid(   经典...哦,没关系),或者它可能是一个自然的关键(像   CustomerNumber是您的客户由您的CRM系统提供的   先从你那里买来的。)

     

无论您选择哪种方式来表示它,实体都是由   拥有一个身份。

     

值对象值对象的关键定义特征是   它没有身份。好吧,也许有点简单,但是   价值对象的意图是通过它来表示某些东西   仅属性。在这种情况下,两个VO可能具有相同的属性   他们是相同的。然而,除了它们之外,它们没有任何价值   凭借其属性。

     

VO常见的另一个方面是它们应该是   不可变的,一旦创建,就不能改变或改变。您可以   创建一个新的,因为他们没有身份,这是一样的   改变另一个。

在汽车工厂系统应用程序(没有牌照)中考虑POO中的汽车类别。即使两辆车相等(相同型号,发动机,颜色,重量等),每辆车都是独一无二的,并且可以通过身份Vehicle Identification Number来区分。

两辆车可以等于,因为它的属性Car1.equals(Car2)但不是同一辆车,因为它的VIN Car1 != Car2。如果汽车改变颜色它不是其他汽车,它是与其他属性相同的汽车。这是一个实体。

现在考虑使用nameRGB字段的Color Class(适用于汽车)。青色的名称为'Cyan'R = 0 G = 255 B = 255。不需要其他身份字段,因为其属性是其身份。颜色是VO并且必须是不可更改的,因为更改名称或RBG(或两者)代表其他颜色...或者在这种情况下如果名称和RGB不匹配则会出现错误;)

Color1.equals(Color)Color1 == Color2必须始终具有相同的结果。