代码之家  ›  专栏  ›  技术社区  ›  koen

DDD:实体和价值对象之间的区别有什么用?

  •  6
  • koen  · 技术社区  · 15 年前

    实体和值对象都是域对象。了解DDD中两者的区别有什么用?把域对象看作是一个实体或价值对象,是否会形成一个更清晰的域模型?

    1 回复  |  直到 15 年前
        1
  •  9
  •   Mark Seemann    15 年前

    是的,能够分辨出不同之处是非常有帮助的,尤其是在设计和实现类型时。

    其中一个主要的区别是在处理平等问题时,实体的行为应该与值对象有很大的不同。知道对象是实体还是值对象会告诉您如何实现类型的相等性。这本身是有帮助的,但不会就此止步。

    实体是可变类型(至少按概念)。实体背后的整个想法是,它代表了一个具有已知生命周期进程的域概念(即,它被创建,经过多次转换,被存档,可能最终被删除)。它代表 同样的“东西” 即使数月或数年过去了,它也会改变一路上的状态。

    另一方面,值对象只是表示没有任何固有特性的值。尽管您不必这样做,但它们非常适合作为不可变类型实现。这非常有趣,因为根据定义,任何不可变类型都是线程安全的。随着我们进入多核时代,知道何时将对象实现为不可变类型是非常有价值的。

    当等式语义众所周知时,它也有助于单元测试。在这两种情况下,平等的定义都很明确。我不知道你使用什么语言,但是在很多语言中(C语言,Java,VB.NET)默认是通过引用来确定相等性的,这在很多情况下并不是特别有用。