2017-08-10 50 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並逐個比較實體,則您將錯過使用實體和值對象的要點。 –