ddd中的值对象设计规则

时间:2015-05-05 15:17:40

标签: php domain-driven-design aggregate value-objects

我的问题很简单,假设我有一个Car实体,其Number值对象,Truck实体也有一个Number值对象,

这是否意味着我的应用程序中有一个名为Number的值对象作为共享值对象?

或者这取决于Number对每个实体有效的原因吗?

3 个答案:

答案 0 :(得分:1)

按定义,值对象是不可变的,应该可以安全地共享。它没有身份。我可以推荐Eric Evans的“Domain Driven Design”一书(第5章详细解释了这些概念)。另请参阅Martin Fowler的article

答案 1 :(得分:0)

  

"这意味着我的应用程序中有一个名为Number for的值对象   两个实体作为共享价值对象?"

Number可能是一个共享概念,如果它们从根本上代表与您的泛在语言相同的东西。如果他们不这样做,则需要区分,例如CarNumberTruckNumber(例如,两者都需要不同的格式)。

但需要注意的是,如果定义良好的上下文通常足以避免术语重载,因此在极限上下文(BC)中很少会遇到诸如UserAccountBankAccount之类的内容。如果你这样做,你的BC边界很可能是错误的。

但是,我相信Number的情况略有不同。因为它是一个众所周知的数学概念,并且很可能会在您的域中使用某些数学数字,我建议更具描述性以避免混淆,也许VehiculeNumber

答案 2 :(得分:0)

首先,Value对象 - 就像大多数ddd实现一样 - 应该被建模以解决域中无处不在的语言的某些部分。

何时创建值对象?在书Implementing Domain Driven Design中,Vaughn Vernon给出了值对象的这些特征

  • 它测量,量化或描述域中的事物。
  • 它 可以维持为不可变的。
  • 它模拟了一个概念整体 将相关属性组成一个整体单元。
  • 完全是 当测量或描述发生变化时可更换。
  • 可以 与使用价值平等的其他人相比。
  • 供应它 具有无副作用行为的合作者

第一个公告意味着VO应该测量,量化或描述域中的事物。

接下来,它应该是不可变的,并且不应该有状态更改方法。这也适用于VO中的任何对象,如果VO使用它们,它们也绝不能改变。

接下来,VO必须在施工后完成。这意味着它所需的所有属性和属性必须处于有效状态。示例:价格VO必须在构造函数中使用正确的值设置currencyamount属性。

可复制性。这意味着可以用另一个相同类型的VO替换VO。如果您的VO可以将currency设置为Yen而不是Dollar,那么在以后尝试替换VO时可能会出现问题,因为您要更改(替换)amount price

示例:实体接受VO Price,其currency美元且amount为100,000。如果我们可以构建一个具有currency日元和amount为200,000的相同类型的新VO,那么此VO可能无法替换。这当然取决于您的域名,但如果实体的意图仅仅是替换VO的货币价值,那么最好分开DollarVOYenVO以避免创建VO阻抗不匹配的属性。

比较:VO应该与同类型的其他VO实例相当。如果VO可以使用currency属性构建,但在其他情况下则不是,那么这可能会违反可比性。 IE浏览器。您应该能够获取相同VO的两个实例并比较它们的属性,仅检查这些属性的不同值。如果某个属性丢失,则比较失败的原因是错误的。

最后一个原则是包含不变性。如果你要给VO的方法,那么确保它们没有改变任何东西。