标准值类型作为 DDD 中的 ValueObjects?

And*_*ita 4 domain-driven-design value-objects

在对具有实体和值对象的域进行建模时,将“基本”值类型与定义好的值对象一起生成是否有意义?

例如,我可以有一个值对象 EmailAddress 或 ProductName。但是仅将 String 作为值对象呢?它是否出于任何充分的理由违反了任何已知的原则?我真正想知道的是,我是否应该/可以将所有可能的属性值定义为值对象,包括 string、bool、int 等。这是错误的还是只是做得很远?不知何故,我觉得我更喜欢真正明确地表达任何具有某种价值的“事物”,而不是留下任何可以解释的东西。你怎么认为?大师们对此有何看法?


我偶然发现的一个参考

用适当的值对象替换常见的原语(例如字符串)通常是个好主意。虽然我可以将电话号码表示为字符串,但转换为电话号码对象会使变量和参数更加明确(在语言支持时进行类型检查)、验证的自然焦点,并避免不适用的行为(例如对整数 ID 号)。

Con*_*enu 7

DDD 中的值对象是一件很棒的事情,它们是不可变的,因此它们可以安全地传递,它们以一种很好的 OOP 模式(如果您使用 OOP)包含数据及其行为。它们还使隐式显式并提供强类型。

如果您需要上述任何功能,那么您应该为需要它的任何属性创建一个 Value 对象(类、组件......任何存在于您的语言中)。

但是,如果您不需要上述任何一项,那么您不应该这样做。您不会仅仅因为某些“大师”这样说而创建新类,例如every property of an Aggregate should be a Value object.

最重要的方面是,如果您有一些包含数据和行为的属性,并且您需要为它创建一个类,那么该类应该是一个 Value 对象,特别是,它应该是不可变的(实体除外)。

  • 但是,如果我的域中有一个“System.UInt64”类型的属性。领域专家会怎么想?他应该知道那是什么吗?这个 UInt64 的东西在例如 javascript 或任何其他环境而不是 .NET 中转换成什么?我的意思是,这是一个合适的域模型吗?还是我只是挑剔? (2认同)
  • “领域专家会怎么想?” - 如果你没有附加行为,那么领域专家就不关心它 (2认同)
  • “我的意思是,这在任何时候都是正确的领域模型吗?” - 你不会仅仅因为你可能需要它而创造它。亚格尼。如果您需要的话,您可以重构。 (2认同)
  • 如果你有行为,那么你就会创建一个 Value 对象,正如我在回答中所写的那样。 (2认同)
  • 如果你的值对象只有一个属性,除了一个简单的构造函数和一个返回该属性的方法之外没有其他方法,这意味着它没有任何行为,并且创建该值对象是没有用的。如果您可以将某些方法放入值对象中,则意味着它具有行为。 (2认同)
  • @AndreasZita 行为是对该数据进行操作的方法,包括验证器;从一种单位到另一种单位(从米到英寸)的内置转换器、比较器等;getter 不是行为。 (2认同)