TL;DR

  • ID のようなアイデンティティを持たず、交換可能なデータを値オブジェクトと呼ぶ。
  • F# の型はデフォルトでフィールドベースの等値性を持つので、値オブジェクトをそのまま表せる。

内容

値オブジェクトとは

扱うデータの多くは、ID のようなアイデンティティを持たず、交換可能である。このようなオブジェクトを値オブジェクトと呼ぶ。逆に、アイデンティティを持つオブジェクトはエンティティである。

値オブジェクトはドメインモデルに頻繁に現れる。単純型の場合もあれば、複雑な型の場合もある。たとえば、"W1234" という WidgetCode や、個人名、住所は値オブジェクトである。

let widgetCode1 = WidgetCode "W1234"
let widgetCode2 = WidgetCode "W1234"
printfn "%b" (widgetCode1 = widgetCode2) // true
 
let name1 = {FirstName="Alex"; LastName="Adams"}
let name2 = {FirstName="Alex"; LastName="Adams"}
printfn "%b" (name1 = name2) // true
 
let address1 = {StreetAddress="123 Main St"; City="New York"; Zip="90001"}
let address2 = {StreetAddress="123 Main St"; City="New York"; Zip="90001"}
printfn "%b" (address1 = address2) // true

値オブジェクトかどうかは、「同じ〜を持っている」と言えるかどうかで判断できる。

Chris has the same name as me.(クリスは私と同じ名前を持っている)

Pat has the same postal address as me.(パットは私と同じ住所を持っている)

等値性の実装

F# の代数的な型システムでドメインをモデリングすると、作った型はデフォルトでフィールドベースの等値性を持つ。同じ型の 2 つのレコード値は、フィールドがすべて等しければ等しい。同じ型の 2 つの選択型の値は、ケースが同じで、そのフィールドの値が等しければ等しい。これを構造的等値性と呼ぶ。

キーワード