2017-08-10 86 views
1
  1. 实体不应该有平等比较(https://www.youtube.com/watch?v=xRCOKKUSp9s)。
  2. 值对象应该有平等的比较(https://www.youtube.com/watch?v=xRCOKKUSp9s
  3. 值对象可以参考机构(领域驱动设计书)
  4. 值对象是相等的,当它们的属性的所有(或部分?)是相等的(这个人是没有这么明确说明,但似乎很自然,https://martinfowler.com/bliki/ValueObject.html,http://enterprisecraftsmanship.com/2016/01/11/entity-vs-value-object-the-ultimate-list-of-differences/,https://projectlombok.org/features/Value)。可能有少数例外情况(例如(1,min)==(60,秒))。

因此,如果值对象有一个实体的引用,我们应该怎样包括在equals()比较实体,如果我们不能调用实体equals()?缺陷在哪里?如何在DDD中正确实现实体和值对象的相等性?

对我来说,实施Entity.equals()(通常基于类型和ID)是很自然的。奇怪的是我遇到了那个视频(1)。

回答

0

价值对象是相等的,如果所有他们的属性是相等的。现在让我们看看它是如何引用实体的值对象。实体需要有唯一的标识符(id),并且该id允许值对象引用实体。换句话说,值对象将具有一个具有实体ID(例如userID)的属性,并且您只需包含该属性即可。我不认为有什么需要实施Entity.equals()。即使实体具有所有相同的属性,实体的设计也是唯一的,这就是为什么我们使用ID来区分它们的原因。有可能需要问“这两个VO是指同一实体吗?” (在第一个视频第二个0:33中的例子),但除此之外我没有看到任何需要比较实体。

+0

我不认为这通常是一个好的设计,如果不同的实体具有所有相同的字段,但只有ID不同,这是由数据库生成(也许有一些罕见的例外)。我认为他们通常应该至少有一组独特的字段(例如,人员代码,不仅是数据库生成的人员ID)。 –

+0

语法'entity1.equals(entity2)'比entity1.getId()。equals(entity2.getId())&& entity1.getClass()。equals(entity2.getClass())更清洁,甚至没有提及缺少null检查。此外'entity1.equals(entity2)'比Entities.equal(entity1,entity2)'或Entities.equalIdsAndTypes(entity1,entity2)'更清洁(例如考虑将对象放入散列表)。 –

+0

实体必须有ID,但不一定要生成数据库。如果您将开始忽略该ID并逐个比较实体,则您将错过使用实体和值对象的要点。 –