DDD:不可变对象也可以是实体吗?

时间:2014-01-15 18:04:11

标签: domain-driven-design

我已经阅读了关于实体和价值对象之间差异的无数帖子,虽然我认为至少在概念上我理解这两者有何不同,但似乎在某些帖子中作者认为特定的域概念是VO仅仅因为它是不可变的(因此它的状态永远不会改变,至少在那个特定的领域模型中)。

您是否同意如果某个对象的状态永远不会在特定的域模型中发生变化,那么该对象永远不应该是一个实体?为什么呢?

谢谢

3 个答案:

答案 0 :(得分:6)

  

如果对象的状态永远不会改变,你是否同意?   特定的域模型,那么这个对象永远不应该是一个实体?   为什么呢?

我认为90%以上的实体会在其生命周期的某个时刻发生变化。但是由于某些实体在域中的性质可能是不可更改的 - 例如,PrepaidPhoneCard,例如银行系统中的TransferOrder

有些人还希望默认情况下使其实体不可变,因为它有助于塑造保留不变量的设计并使域操作显式化:http://www.jefclaes.be/2013/04/designing-entities-immutability-first.html

答案 1 :(得分:2)

如果您需要识别它,该对象可以是一个实体。 根据DDD书,如果一个对象具有身份和生命周期但不会随着时间而改变,你也可以将该对象视为一个事件。

答案 2 :(得分:0)

两个字:是的,他们可以。

埃里克·埃文斯(Eric Evans)在他的书中讲述了实体固有的“连续性线”。通俗地说,一个实体可以由前端 POST 为 JSON,由框架转换为 DTO,然后转换为域对象,然后再次转换为 DTO,最后存储在数据库表中。在所有这些转换过程中,实体将很容易区分,因为它拥有一个或多个唯一的业务 ID。

考虑到这一点,某些形式的不变性不是另一种连续性线程的形式吗?想象一下写时复制:所有不可变对象的副本都是形式上不同的对象,代表它在其生命周期的不同点。然而,有一个唯一的 id 允许我们说它是同一个实体。

现在,让我们谈谈不变性的“极端”形式:只读对象。实体可以是只读对象吗?当然,信用卡对帐单就是一个很好的例子。

总结:

  • 一个实体可以以多种形式存在。事实上,您几乎总是在一个程序中拥有多个实体的表示,而您对此一无所知。
  • 实体的真正要求是存在独特的业务标识(而不是用于技术目的的代理 ID),使其与其他实体区分开来。
  • 实体可以是不可变的,无论我们谈论的是 COW 还是只读对象。