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