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

Standard value types as ValueObjects in DDD?

在使用实体和值对象对域进行建模时,将 "basic" 值类型也定义为值对象有意义吗?

例如,我可以有一个值对象 EmailAddress 或 ProductName。但是如果将 String 作为值对象呢?出于任何充分的理由,它是否违反任何已知原则?我真正想知道的是,如果我 should/could 将所有可能的 属性 值定义为值对象,包括 string、bool、int 等。这是错误的还是只是做得太过分了?不知何故,我觉得我更愿意对任何 "thing" 明确表示,这是某种价值,而不是留下任何可以解释的东西。你怎么看?大师们对此怎么说?


A reference 我无意中发现:

It's often a good idea to replace common primitives, such as strings, with appropriate value objects. While I can represent a telephone number as a string, turning into a telephone number object makes variables and parameters more explicit (with type checking when the language supports it), a natural focus for validation, and avoiding inapplicable behaviors (such as doing arithmetic on integer id numbers).

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

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

但是,如果您不需要以上任何一项,那么您不应该这样做。您不创建新的 Class 只是因为某些 "guru" 这么说,例如 every property of an Aggregate should be a Value object

最重要的方面是,如果你有一些 属性 有数据和行为,你需要为它做一个 Class 那么 class 应该是值对象,特别是,它应该是不可变的(实体除外)。

您可能需要在 DDD 挪威聚会上阅读“Out of the tar pit" whitepaper or watch the talk by Romeu Moura

原始类型有助于使隐式显式。默认情况下,它们是 implicit。这使得系统无限复杂,因为这种系统的状态数是不确定的。

我同意 类 可能感觉像是一种负担。您可能确实避免使用值对象,但您需要接受您的无处不在的语言不再无处不在。无处不在意味着语言无处不在,包括代码。您不能对域 expect 说 "product name",然后返回您的代码并查看 "string"。这也不会将您的领域语言传达给其他开发人员。

Yves Reinhout 在去年的 KanDDDinsly 大会上发表了great talk这些东西,推荐观看。

我个人真的很期待新的 OO 语言特性,比如提议的 C# 记录类型,让事情变得像函数式语言一样简单。顺便说一句,阅读函数式语言中的类型系统也为 OO 程序员提供了许多重要的见解。例如,F# for Fun and Profit 有这个 great article about types and DDD。顺便说一句,它从寻找string开始,真是巧合...