勉強日記

チラ裏

PoEAA ch18 Value Object

martinfowler.com


Value Object

A small simple object, like money or a date range,
whose equality isn't based on identity.

  • 参照オブジェクトと値オブジェクトを区別することは有用
  • Value Objectは普通のオブジェクトと比べて...
    • 小さい
    • プリミティブ型に似ている

How It Works

  • 参照オブジェクトとの明確な線引きは難しい
  • ふわっとした区別: 大きさ
  • 明確な違い: 等価性
    • 参照オブジェクト: identityで等価判定する
      • オブジェクトに振られたID(言語ビルトインのやつ)
      • RDBの主キー
    • Value Object: フィールドすべての値で等価判定する
      • 例えばDateオブジェクトならday,month,yearの値の等価判定
  • Value Objectがいくつインスタンシエートされているか意識する必要はない
    • 2つのValue Objectがメモリ上で同一の実体だろうが異なる実体だろうが等価判定できる
  • immutableにするのはよいアイデア
    • 参照を共有したとき、不用意に書き換わらぬよう
    • 構築後はフィールドを変更しない
    • 【補】GoFFlyweight Pattern適用可能
  • 永続化するときは、それ単体でテーブルを作らない
  • 【補】他のValue Objectやプリミティブ型と一緒にドメインオブジェクトを構成し、それに対応する表に永続化する
    • その際は下記パターンを適用する
    • Embedded Value
      • Moneyオブジェクトのamount,currencyとかを複数カラムに分ける
      • 複数カラムから読み出して1つのValue Objectを構築する
    • Serialized LOB
  • バイナリのシリアライズ処理を大量に行う場合、性能のボトルネックになることも
  • MoneyValue Objectの一種

.NET Implementation

  • .NETでは、Value Objectを第一級オブジェクトとしてサポートする
    • wiki】生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のこと
  • classの代わりにstructで宣言することで値扱いになる

When to Use It

  • identityではなくフィールドすべての値による等価判定を行いたい場合
  • 構築が簡単な小さいオブジェクトは検討の価値あり

名前の衝突

  • J2EEでは、本書でいうところのData Transfer ObjectのことをValue Objectと名付けてしまったらしい
  • 本書ではこれにならわない
    • 著者の過去の執筆物との整合性のため