簡體   English   中英

對於值對象與實體,等於覆蓋和==重載

[英]Equals override and == overload, for value objects vs entities

我發現了很多關於Equals重載和==運算符重載之間的區別的討論,但是對於何時應該重載默認的相等行為似乎有些不滿,這使我懷疑這樣做的好方法。

以下是我的理解,如果您覺得有問題,請告訴我:

1)對於非不可變類型(為什么),不建議==重載,對於不可變類型(又名DDD的值對象),如果值相同而不是引用,則使==比較返回true很有用。

2)在不可變類型中也應覆蓋等於(和GetHashCode),以對類型內相關字段的每個值進行良好的比較。

3)實體相等嗎?

重寫Equals並僅比較id屬性是一個好主意嗎? 還是應該讓默認的對象行為比較參考?

對於這兩個選項,我認為如果我遵循這樣的規則,即在線程上下文中始終只具有一個特定實體的一個實例,則結果應該是相同的,但是其中一個選項存在某些缺點或優點。應該注意什么?

動機

我認為,正確的平等操作是面向對象世界中最被低估的工具之一。 是的,您應該在有意義的地方絕對實現它們,這將使您的程序更加簡潔。

例如比較

Assert.Equal(expectedAddress.Street, address.Street);
Assert.Equal(expectedAddress.City, address.City);
Assert.Equal(expectedAddress.Zip, address.Zip);
Assert.Equal(expectedAddress.State, address.State);
Assert.Equal(expectedAddress.Country, address.Country);

Assert.Equal(expectedAddress, address);

當您具有深層嵌套的價值對象時,這變得更加極端。

何時使用

為了不產生尷尬的行為,僅對不可變類型實現相等操作。 這很重要,因為例如哈希映射在可變類型上將無法正確運行(請考慮當對象的哈希碼在哈希圖中時發生變化時會發生什么)。

對於某些可變類型,單獨實現Equals可能有意義,但是通常不建議這樣做,例如,通過Microsoft代碼分析規則

價值對象

平等操作對價值對象最有用。 還重寫相等運算符以使相等比較看起來自然。

相等操作的實現很簡單:考慮所有數據字段,但忽略計算的屬性。 這將創建純粹基於內容的相等操作。

由於在值對象上實現相等操作是機制性的,因此有一個名為Equ會自動為您執行此操作(我自己寫了)。 它將在靜態實例化時間創建相等操作,這些操作具有與手動編寫的EqualsGetHashCode實現相同的運行時性能。

實體

對於實體,它變得有些棘手。 問題在於, 從域的角度來看,通常通常並不清楚什么是平等。

顯然,兩個具有不同ID的Customer實體是不相等的。 就是這樣。 具有相同ID但狀態不同的兩個Customer實體是否相等? 難題。

好消息是這種功能並不是真正需要的。 因此,我的建議是: 不要對實體實施相等操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM