エンティティの等値性の実装
以下 F# の話 radish-miyazaki.icon F# のデフォルト実装だと、レコードのすべてのフィールドを使用するのでこれを変更する必要がある code:fsharp
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 属性を型に追加して、デフォルトの動作を変更することをコンパイラに伝える
デフォルトの等値性を黙って変更しているので、混乱を招く可能性もある
NoEquality 型アノテーションを用いて、等値性チェックを完全に無効にする
code:fsharp
type Contact = { ... }
値を比較しようとするコンパイルエラーが生じる
printfn "%b" (contact1 = contact2)
フィールドを比較することは可能
printfn "%b" (contact1.ContactId = contaect2.ContactId)
場合によっては、複数のフィールドを等値性のチェックに用いるケースもある
フィールドを組み合わせた Key プロパティを公開する
code:fsharp
type OrderLine = {
OrderId : OrderId
ProductId : ProductId
Qty : int
}
with
member this.Key =
(this.OrderId, this.ProductId)
比較する場合は Key を用いる
printfn "%b" (line1.Key = line2.Key)