Domain driven design DDD中作为ValueObject的标准值类型?

Domain driven design DDD中作为ValueObject的标准值类型?,domain-driven-design,value-objects,Domain Driven Design,Value Objects,在用实体和值对象对域进行建模时,将“基本”值类型作为定义良好的值对象是否有意义 例如,我可以有一个值对象EmailAddress或ProductName。但是把字符串作为值对象怎么样?是否有任何正当理由违反任何已知的原则?我真正想知道的是,我是否应该/能够将所有可能的属性值定义为值对象,包括string、bool、int等。这是错误的,还是只是做得太远了?不知何故,我觉得我更愿意对任何具有某种价值的“东西”都直截了当,而不是把任何东西留给解释。你怎么认为?大师对此怎么说 A我偶然发现: 替换常

在用实体和值对象对域进行建模时,将“基本”值类型作为定义良好的值对象是否有意义

例如,我可以有一个值对象EmailAddress或ProductName。但是把字符串作为值对象怎么样?是否有任何正当理由违反任何已知的原则?我真正想知道的是,我是否应该/能够将所有可能的属性值定义为值对象,包括string、bool、int等。这是错误的,还是只是做得太远了?不知何故,我觉得我更愿意对任何具有某种价值的“东西”都直截了当,而不是把任何东西留给解释。你怎么认为?大师对此怎么说


A我偶然发现:

替换常见的原语(如字符串)通常是个好主意, 使用适当的值对象。而我可以代表一部电话 数字作为字符串,变成电话号码对象 变量和参数更显式(当 语言支持它),这是验证和避免错误的自然焦点 不适用的行为(例如对整数id执行算术) 数字)


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

如果您需要上面的任何特性,那么您应该为任何需要它的属性创建一个值对象(类、组件…您的语言中存在的任何东西)

但是,如果您不需要上述任何一项,那么您不应该这样做。创建新类并不是因为某些“专家”这样说,例如,
聚合的每个属性都应该是值对象


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

您可能需要阅读“”白皮书或观看在DDD Norway meetup

基元类型无助于使隐式显式。默认情况下,它们是隐式的。这使得系统无限复杂,因为系统的状态数是无限的

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

Yves Reinhout在去年的Kanddinsly会议上发表了关于这些事情的演讲,建议观看


我个人真的很期待新的OO语言特性,比如提议的C#记录类型,使事情和函数式语言一样简单。顺便说一句,阅读函数式语言中的类型系统也为OO程序员提供了很多很好的见解。例如,F#For Fun and price有这样一个功能。顺便说一下,它从查找
字符串开始,这真是巧合…

但是如果我的域中有一个类型为“System.UInt64”的属性。领域专家会怎么想?他应该知道那是什么吗?。例如,在javascript或.NET以外的任何其他环境中,UInt64转换成了什么?我的意思是这是一个合适的领域模型吗?或者我只是吹毛求疵?“一个领域专家会怎么想?”-如果你没有附加行为,那么领域专家就不关心它“我的意思是,这是一个合适的领域模型吗?”-你不会仅仅因为需要它而创建一些东西。雅格尼。如果你需要它,那么你可以重构。如果你有行为,那么你就创建一个值对象,正如我在回答中所写。如果你的值对象只有一个属性,没有其他方法,只有一个简单的构造函数和一个返回该属性的方法,这意味着它没有任何行为,创建该值对象是无用的。如果你能在value对象中加入一些方法,那就意味着它有一个行为。谢谢你的链接!