エンティティの等値性の実装
from アイデンティティの考察: エンティティ
エンティティの場合、等値性は識別子のみを使用する
以下 F# の話 radish-miyazaki.icon
F# のデフォルト実装だと、レコードのすべてのフィールドを使用するのでこれを変更する必要がある
アイデンティティの考察: 値オブジェクト#6697b5ac75d04f0000cac3a7
等値性 の実装をオーバーライド する
code:fsharp
<CustomEquality; NoComparison>
type Contact = {
ContactId : ContactId
PhoneNumber : PhoneNumber
EmailAddress : EmailAddress
}
override this.Equals(obj) =
match obj with
| :? Contact as c -> this.ContactId = c.ContaectId
| _ -> false
override this.GetHashCode() =
hash this.ContactId
Equals 、GetHashCode メソッドのオーバーライド
CustomEquality に NoComparison 属性を型に追加して、デフォルトの動作を変更することをコンパイラに伝える
https://jindraivanek.hashnode.dev/f-tips-weekly-7-custom-equality-and-comparison-1?source=more_series_bottom_blogs#heading-custom-equality
デフォルトの等値性を黙って変更しているので、混乱を招く可能性もある
NoEquality 型アノテーションを用いて、等値性チェックを完全に無効にする
code:fsharp
<NoEquality; NoComparison>
type Contact = { ... }
値を比較しようとするコンパイルエラーが生じる
printfn "%b" (contact1 = contact2)
フィールドを比較することは可能
printfn "%b" (contact1.ContactId = contaect2.ContactId)
場合によっては、複数のフィールドを等値性のチェックに用いるケースもある
フィールドを組み合わせた Key プロパティを公開する
code:fsharp
<NoEquality; NoComparison>
type OrderLine = {
OrderId : OrderId
ProductId : ProductId
Qty : int
}
with
member this.Key =
(this.OrderId, this.ProductId)
比較する場合は Key を用いる
printfn "%b" (line1.Key = line2.Key)