DDD 中的一切都是值对象

Kid*_*ond 2 entity domain-driven-design value-objects

我刚刚读到有关值对象的内容,它是不可变的,描述为:

一个简单的小对象,例如金钱或日期范围,其相等性不基于身份。

看看我当前现有的实体,我想我可以将几乎所有不是实体的东西都变成值对象。

假设我有一个实体类 User。

class User
{
    public $id;
    public $firstname;
    public $lastname;
    public $email;
}
Run Code Online (Sandbox Code Playgroud)

我可以让它由值对象IdFirstNameLastName和组成,因为这些Email属性相等性Password都不User是基于身份的,对吧?但话又说回来,我可能会更进一步,制作更多的 VO Int、、String(由和VOName组成)等。FirstNameLastName

我应该在哪里划定界限以防止过度设计?

一个域包含这么多 VO 正常吗?

我对价值对象的理解是否正确?

gui*_*e31 5

是的,如果您想将类型安全性和表达性的标准设置得足够高,那么域包含大量 VO 是正常的——这通常是一件好事。

不需要重新定义IntString,但是确定的普遍存在的语言概念肯定应该有自己的对象。

诚然,在某些语言中这样做比其他语言更自然、更轻松。这会影响你的界限。例如,在函数式语言中,将原始类型包装为type UserId = UserId of int. 我不会费心用面向对象语言来做这件事,课堂仪式就是这样。

  • 不过,这是很容易重构的,因此您可以完美地“无脑”地从实体中的原始类型开始,并在发现这些气味后对其进行调整。领域建模是一个持续的过程,而不是一次大爆炸活动。 (3认同)