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 で構成されたものに限る
      • ドメインオブジェクトを直接返すアーキテクチャを採用するとき

参考