mizoguche.info

値オブジェクト - エリック・エヴァンスのDDD読んだメモ

ドメインにおける記述的な側面を表現し、概念的な同一性を持たないオブジェクトを値オブジェクトと呼ぶ。

TL; DR

  • あるモデル要素について、その属性しか関心の対象にならないなら、その要素は値オブジェクト
  • 値オブジェクトは不変にして同一性を与えないこと
  • 値オブジェクト同士の双方向の関連は完全に取り除くこと

値オブジェクト

  • あるモデル要素がその属性しか関心の対象にならないなら、その要素は値オブジェクト
  • 値オブジェクトには、自分が伝える属性の意味を表現させ、関係した機能を与えること
  • 値オブジェクトを不変なものとして扱うこと
  • 同一性を与えず、エンティティを維持するために必要となる複雑な設計を避けること

値オブジェクトの例

  • 文字列や数
    • 「4」や「Q」を書くときに、「4」や「Q」がどのインスタンスかを気にしない

値オブジェクトができること

  • 値オブジェクトは他のオブジェクトとの組み合わせで構成されることもある
  • 値オブジェクトはエンティティを参照できる
  • 値オブジェクトはオブジェクト間のメッセージでパラメータとして渡される
  • 操作のために生成されては破棄されることが多い
  • エンティティの属性としても使用される
  • 値オブジェクトを構成する属性は、概念的な統一体を形成すべき
    • Whole Valueパターン
    • 街区、都市、郵便番号は、人オブジェクトの別々な属性であってはならない
    • それらはある住所全体の一部であり、より凝集度の高い値オブジェクトができる

値オブジェクトを設計する

  • 値オブジェクトはどのインスタンスであるかは気にしてはいけない
    • 制約がないことで、設計が自由になり、簡素化したり最適化したりできる
  • 値オブジェクトは不変であるべき
    • 同名の人オブジェクトは、同じ名前オブジェクトを共有するかもしれない
    • その場合、名前オブジェクトが不変でなければ、片方の名前が変更されたときにもう片方の名前も変更されることになる
    • 完全に置き換える以外、変更できないようにする
  • 値オブジェクトは数が多くなりがちだが、フライウェイトパターンを使って最適化できる

値オブジェクトを含む関連を設計する

  • モデルの中の関連は、数が少なく単純であればあるほどよい
  • 値オブジェクト同士の双方向の関連は完全に取り除くこと
    • 不変条件を強制して双方向の参照を設定しなければいけないが、そうすることで役立つ例がない
    • そうする必要がある場合は、まだ認識されていない同一性があるはずなので値オブジェクトとして宣言することを考え直すべき
4798121967
このエントリーをはてなブックマークに追加