1
- 實體不應該有平等比較(https://www.youtube.com/watch?v=xRCOKKUSp9s)。
- 值對象應該有平等的比較(https://www.youtube.com/watch?v=xRCOKKUSp9s)
- 值對象可以參考機構(領域驅動設計書)
- 值對象是相等的,當它們的屬性的所有(或部分?)是相等的(這個人是沒有這麼明確說明,但似乎很自然,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)。
我不認爲這通常是一個好的設計,如果不同的實體具有所有相同的字段,但只有ID不同,這是由數據庫生成(也許有一些罕見的例外)。我認爲他們通常應該至少有一組獨特的字段(例如,人員代碼,不僅是數據庫生成的人員ID)。 –
語法'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)'更清潔(例如考慮將對象放入散列表)。 –
實體必須有ID,但不一定要生成數據庫。如果您將開始忽略該ID並逐個比較實體,則您將錯過使用實體和值對象的要點。 –