【问题标题】:Everything a Value Object in DDDDDD 中的一切都是值对象
【发布时间】:2014-07-23 09:00:13
【问题描述】:

我刚刚读到值对象,它是不可变的并被描述为:

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

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

假设我有一个实体类 User。

class User
{
    public $id;
    public $firstname;
    public $lastname;
    public $email;
}

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

我在哪里画线以防止过度设计?

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

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

【问题讨论】:

  • $id 可能表示该对象不是值对象,而是身份很重要的实体。

标签: entity domain-driven-design value-objects


【解决方案1】:

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

无需重新定义Int和String,但确定的无处不在的语言概念肯定应该有自己的对象。

诚然,在某些语言中这样做比其他语言更自然、更轻松。这会影响您画线的位置。在functional languages, for instance 中,像type UserId = UserId of int 那样包装原始类型并不少见。我不会费心用 OO 语言来做这件事,上课仪式就是这样。

【讨论】:

  • 那么,一个域拥有所有适用于域的可能值对象是正常的吗?而且我猜这些 VO 也可以在其中包含验证逻辑,这样我就不必再在我的实体中验证它们了,对吧?
  • 如果你的目标是最大的类型安全(不知道它在 PHP 中是如何工作的),绝对可以。根据我的经验,很少有 VO 需要验证,但最好让您的 VO 不可变,这样您只需在创建时验证一次。
  • 不过,这很容易重构,因此您可以完美地从实体中的原始类型“无脑”开始,并在以后发现这些气味时对其进行调整。领域建模是一个持续不断的过程,而不是大爆炸式的活动。
猜你喜欢
  • 2010-12-07
  • 1970-01-01
  • 2014-06-07
  • 2010-09-30
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2010-10-26
相关资源
最近更新 更多