【问题标题】:How to properly implement equality of entities and value objects in DDD?如何正确实现 DDD 中实体和值对象的相等性?
【发布时间】:2017-08-10 21:37:32
【问题描述】:
  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, seconds))。

如果一个值对象引用了一个实体,如果我们不能在实体上调用equals(),我们应该如何在equals()比较中包含实体?缺陷在哪里?

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

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    如果所有属性相等,则值对象相等。现在让我们看看引用实体的值对象是怎样的。实体需要有一个唯一标识符 (id),并且该 id 允许值对象引用实体。换句话说,值对象将具有一个属性,该属性具有实体 ID(例如 userID),并且在 vo.equal() 中您只需包含该属性。

    我认为没有必要实现Entity.equals()。实体被设计为唯一的,即使它们具有所有相同的属性,这就是我们使用 ID 来区分它们的原因。可能需要问“这两个 VO 是指同一个实体吗?” (第一个视频第二个 0:33 中的示例相同)但除此之外,我认为没有任何需要比较实体。

    【讨论】:

    • 我不认为如果不同的实体具有所有相同的字段但仅在 ID 上有所不同,这通常不是一个好的设计,这是由数据库生成的(好吧,也许有一些罕见的例外)。我认为他们通常应该至少有一组唯一的字段(例如,人员代码,而不仅仅是数据库生成的人员 ID)。
    • 语法entity1.equals(entity2)entity1.getId().equals(entity2.getId()) && entity1.getClass().equals(entity2.getClass()) 更干净,甚至没有提到缺少空检查。此外,entity1.equals(entity2)Entities.equal(entity1, entity2)Entities.equalIdsAndTypes(entity1, entity2) 更干净(例如,考虑将对象放入哈希表)。
    • 实体必须有 ID,但不一定是数据库生成的。如果您开始忽略该 ID 并逐个字段比较实体,您将错过使用实体和值对象的要点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2012-07-08
    • 2012-04-01
    • 2023-03-22
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多