我的问题很简单,假设我有一个Car
实体,其Number
值对象,Truck
实体也有一个Number
值对象,
这是否意味着我的应用程序中有一个名为Number
的值对象作为共享值对象?
或者这取决于Number
对每个实体有效的原因吗?
答案 0 :(得分:1)
按定义,值对象是不可变的,应该可以安全地共享。它没有身份。我可以推荐Eric Evans的“Domain Driven Design”一书(第5章详细解释了这些概念)。另请参阅Martin Fowler的article
答案 1 :(得分:0)
"这意味着我的应用程序中有一个名为Number for的值对象 两个实体作为共享价值对象?"
Number
可能是一个共享概念,如果它们从根本上代表与您的泛在语言相同的东西。如果他们不这样做,则需要区分,例如CarNumber
和TruckNumber
(例如,两者都需要不同的格式)。
但需要注意的是,如果定义良好的上下文通常足以避免术语重载,因此在极限上下文(BC)中很少会遇到诸如UserAccount
和BankAccount
之类的内容。如果你这样做,你的BC边界很可能是错误的。
但是,我相信Number
的情况略有不同。因为它是一个众所周知的数学概念,并且很可能会在您的域中使用某些数学数字,我建议更具描述性以避免混淆,也许VehiculeNumber
?
答案 2 :(得分:0)
首先,Value对象 - 就像大多数ddd实现一样 - 应该被建模以解决域中无处不在的语言的某些部分。
何时创建值对象?在书Implementing Domain Driven Design
中,Vaughn Vernon给出了值对象的这些特征
第一个公告意味着VO应该测量,量化或描述域中的事物。
接下来,它应该是不可变的,并且不应该有状态更改方法。这也适用于VO中的任何对象,如果VO使用它们,它们也绝不能改变。
接下来,VO必须在施工后完成。这意味着它所需的所有属性和属性必须处于有效状态。示例:价格VO必须在构造函数中使用正确的值设置currency
和amount
属性。
可复制性。这意味着可以用另一个相同类型的VO替换VO。如果您的VO可以将currency
设置为Yen而不是Dollar,那么在以后尝试替换VO时可能会出现问题,因为您要更改(替换)amount
price
。
示例:实体接受VO Price
,其currency
美元且amount
为100,000。如果我们可以构建一个具有currency
日元和amount
为200,000的相同类型的新VO,那么此VO可能无法替换。这当然取决于您的域名,但如果实体的意图仅仅是替换VO的货币价值,那么最好分开DollarVO
和YenVO
以避免创建VO阻抗不匹配的属性。
比较:VO应该与同类型的其他VO实例相当。如果VO可以使用currency
属性构建,但在其他情况下则不是,那么这可能会违反可比性。 IE浏览器。您应该能够获取相同VO的两个实例并比较它们的属性,仅检查这些属性的不同值。如果某个属性丢失,则比较失败的原因是错误的。
最后一个原则是包含不变性。如果你要给VO的方法,那么确保它们没有改变任何东西。