我是DDD的新手,并努力理解一些概念。您如何在您的域中确定哪些对象是实体对象,哪些是Value对象,以及它们如何区别对待?
答案 0 :(得分:1)
正如我所看到的,域对象基本上代表业务域的名词而做具有身份,而值对象对业务没有任何特殊含义(想想MonetaryAmount)并且没有身份。
答案 1 :(得分:0)
实体“这是我的实体,有很多人喜欢它,但这个是 矿”
实体的关键定义特征是它具有 身份 - 它在系统中是唯一的,没有其他实体,没有 重要的是同一个实体,除非它具有相同的身份。
身份可以在实体上以多种方式表示 - 它可以是一个 数字标识符(经典的CustomerID),它可能是一个Guid( 经典...哦,没关系),或者它可能是一个自然的关键(像 CustomerNumber是您的客户由您的CRM系统提供的 先从你那里买来的。)
无论您选择哪种方式来表示它,实体都是由 拥有一个身份。
值对象值对象的关键定义特征是 它没有身份。好吧,也许有点简单,但是 价值对象的意图是通过它来表示某些东西 仅属性。在这种情况下,两个VO可能具有相同的属性 他们是相同的。然而,除了它们之外,它们没有任何价值 凭借其属性。
VO常见的另一个方面是它们应该是 不可变的,一旦创建,就不能改变或改变。您可以 创建一个新的,因为他们没有身份,这是一样的 改变另一个。
在汽车工厂系统应用程序(没有牌照)中考虑POO中的汽车类别。即使两辆车相等(相同型号,发动机,颜色,重量等),每辆车都是独一无二的,并且可以通过身份Vehicle Identification Number来区分。
两辆车可以等于,因为它的属性Car1.equals(Car2)
但不是同一辆车,因为它的VIN Car1 != Car2
。如果汽车改变颜色它不是其他汽车,它是与其他属性相同的汽车。这是一个实体。
现在考虑使用name
和RGB
字段的Color Class(适用于汽车)。青色的名称为'Cyan'
,R = 0 G = 255 B = 255
。不需要其他身份字段,因为其属性是其身份。颜色是VO并且必须是不可更改的,因为更改名称或RBG(或两者)代表其他颜色...或者在这种情况下如果名称和RGB不匹配则会出现错误;)
Color1.equals(Color)
和Color1 == Color2
必须始终具有相同的结果。