And*_*ita 4 domain-driven-design value-objects
在对具有实体和值对象的域进行建模时,将“基本”值类型与定义好的值对象一起生成是否有意义?
例如,我可以有一个值对象 EmailAddress 或 ProductName。但是仅将 String 作为值对象呢?它是否出于任何充分的理由违反了任何已知的原则?我真正想知道的是,我是否应该/可以将所有可能的属性值定义为值对象,包括 string、bool、int 等。这是错误的还是只是做得很远?不知何故,我觉得我更喜欢真正明确地表达任何具有某种价值的“事物”,而不是留下任何可以解释的东西。你怎么认为?大师们对此有何看法?
我偶然发现的一个参考:
用适当的值对象替换常见的原语(例如字符串)通常是个好主意。虽然我可以将电话号码表示为字符串,但转换为电话号码对象会使变量和参数更加明确(在语言支持时进行类型检查)、验证的自然焦点,并避免不适用的行为(例如对整数 ID 号)。
DDD 中的值对象是一件很棒的事情,它们是不可变的,因此它们可以安全地传递,它们以一种很好的 OOP 模式(如果您使用 OOP)包含数据及其行为。它们还使隐式显式并提供强类型。
如果您需要上述任何功能,那么您应该为需要它的任何属性创建一个 Value 对象(类、组件......任何存在于您的语言中)。
但是,如果您不需要上述任何一项,那么您不应该这样做。您不会仅仅因为某些“大师”这样说而创建新类,例如every property of an Aggregate should be a Value object.
最重要的方面是,如果您有一些包含数据和行为的属性,并且您需要为它创建一个类,那么该类应该是一个 Value 对象,特别是,它应该是不可变的(实体除外)。