Value Object
広義の Value Object (値オブジェクト) は、次の 3 つに分類できる。
値オブジェクト (狭義)
計算式の抽象化
区分オブジェクト
分岐構造の抽象化
コレクションオブジェクト
ループの抽象化
Value Object を活用した契約プログラミング
以下に、実装時に押さえるべきポイントを示す。
不変条件の表明
Value Object のコンストラクタで、有効な状態のインスタンスだけを生成できるようにする。 その Value Object を使用する箇所では、Value Object の不変条件が満たされていることが約束される。
事前条件の表明
メソッドの引数の型を Value Object にすることで、引数の事前条件が Value Object の不変条件によって型レベルで約束される。
- 不変条件を満たした Value Object のみを受け取れるようにする
- 集約ルートのメソッドの引数
- ユースケースの引数
- Value Object を直接受け取るアーキテクチャを採用するとき
事後条件の表明
メソッドの返す型を Value Object で構成することで、返り値の事後条件が Value Object の不変条件によって型レベルで約束される。
- 不変条件を満たした Value Object で構成されたオブジェクトを返す
- 集約ルートやエンティティのメソッドが返すものを Value Object で構成されたものに限る
- イミュータブルにするため、状態を変更するメソッドは同じ型の新しいオブジェクトを返す
- ユースケースが返すものを集約ルートや Value Object で構成されたものに限る
- ドメインオブジェクトを直接返すアーキテクチャを採用するとき
- 集約ルートやエンティティのメソッドが返すものを Value Object で構成されたものに限る
参考
- 増田亨 (@masuda220) のポスト (2026-10-12): 値オブジェクト、コレクションオブジェクト、区分オブジェクトの三点セット
- 増田亨 (@masuda220) のポスト (2022-03-02): 値オブジェクトやコレクションオブジェクトに詰まっている良いクラス設計の原理原則