【问题标题】:Value object design rules in dddddd中的值对象设计规则
【发布时间】:2015-05-05 15:17:40
【问题描述】:

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

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

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

【问题讨论】:

  • 请不要使用缩写(或至少解释一下),代码示例肯定会帮助您解决问题。
  • 最后一句没看懂。

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


【解决方案1】:

根据定义,值对象是不可变的,应该可以安全地共享。它没有身份。我可以推荐 Eric Evans 的《领域驱动设计》一书(第 5 章详细解释了这些概念)。另请参阅 Martin Fowler 的article

【讨论】:

    【解决方案2】:

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

    Number 可能是一个共享概念,如果它们从根本上代表与您的通用语言相同的事物。如果没有,则需要区分,例如 CarNumberTruckNumber(例如,两者都需要不同的格式)。

    但请注意,如果定义明确,上下文本身通常足以避免术语重载,因此您很少会在有界上下文 (BC) 中遇到诸如 UserAccountBankAccount 之类的内容,如果您这样做了您的 BC 边界很可能是错误的。

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

    【讨论】:

      【解决方案3】:

      首先,值对象 - 就像大多数 ddd 实现一样 - 应该被建模以解决您领域中普遍存在的语言的某些部分。

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

      • 它测量、量化或描述领域中的事物。
      • 它 可以保持不变。
      • 它通过以下方式对概念整体进行建模 将相关属性组成一个整体单元。
      • 完全是 当测量或描述发生变化时可更换。
      • 可以 与其他使用价值平等的人相比。
      • 它提供其 无副作用行为的合作者

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

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

      继续前进,VO 必须在构建后完成。这意味着它需要的所有属性和属性都必须处于有效状态。示例:价格 VO 必须在构造函数中将 currencyamount 属性设置为正确的值。

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

      示例:实体接受 VO Price,其中 currency 为美元,amount 为 100,000。如果我们可以用日元的currency 和 200,000 的amount 构造一个相同类型的新 VO,那么这个 VO 可能是不可替代的。这当然取决于您的领域,但如果实体的意图只是简单地替换 VO 的货币价值,那么最好有单独的 DollarVOYenVO 以避免创建阻抗不匹配的 VO属性。

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

      最后一个原则是不可变性。如果您要提供 VO 的方法,请确保它们不会改变任何内容。

      【讨论】:

        猜你喜欢
        • 2014-06-03
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 2010-10-31
        相关资源
        最近更新 更多