まとめるとValue Objectとは
- 比較がIDではなく値で行われるオブジェクトであって、ドメインの語彙として値のように振る舞うので便利。
- 複製と共有の違いをぼかしているオブジェクト指向言語ではオブジェクトを値のように振り回すと事故るので、不変性を強制する・常に複製するなどの工夫がある。
- 大事なのはプログラマのメンタルモデルをプリミティブ型の取り回しと揃える事であって、Valueのように振る舞うObjectなので"Value Object"と呼ぶ。
Value Objectとは何でないか?
- Value Objectの出発点はそもそもcompound(合成物)であって単一の値を包めとは一言も言ってない
- プリミティブ型を包んでもID(e.g. ポインタ)で比較していたらValue Objectと呼べない
- 包まれる値はプログラム言語のプリミティブ型とは限らなくて別のValue Objectであるケースも有り得る
- ポインタやIDで比較しようが型システムの恩恵は得られるのでValue Objectに固有のアイデアではない
- クラスを定義する際に固有の振る舞いを定義するのはOOPの基本でありValue Objectに固有のアイデアではないし、Value Objectを表すクラスに常に便利なメソッドを足せとはマーチン・ファウラーも言っていない
- immutableは共有と複製の違いをぼかしたまま使うための工夫に過ぎなくて、常に複製しても良いとマーチン・ファウラーも言っている