ドメイン駆動設計に関して勉強しています。参考にしている本がやたら難しいんで、トピックごとにネットで調べつつ進めていくのがよさげです。
今回はEntityとValueObjectについて
Contents
Entity
一般的にはテーブルをオブジェクトであらわたしたものがこれになることが多いようですが、もちろんイコールではありません。
しっかりとした定義としては下記のようなことがあげられます。
- ユニークになるキーが存在する(必ず一意になる)
- 内部の値が可変
- ライフサイクル(生成→消滅)がある
- 一般的には「顧客」などがEntityになることが多い
Value Object
Entityや他のValue Objectの「属性」として定義されます。下記のような特徴あり。
- テーブルとして存在することがない
- 値が不変。値の変更がある場合は、新しいものを別に作る必要があり
- 一般的には顧客の名前、電話番号など属性の1つ1つがValue Objectとなることが多い
Domain-Driven Designのエッセンス 第2回 DDDの基礎と実践
実際のソース
ECCUBE3はどうやらドメイン駆動設計されているようでパッケージがController,Factory,Repository,Entity,などと分かれています。
そこでECCUBE3をみて実際にEntityなどで書かれているものを見てみます。
Entity内のプロパティ・メソッド
例: 注文(order)
プロパティ
- 注文明細
- 配送先
- 顧客
ステータス系の値
複数持つ場合はすべてCollectionで持つ
メソッド
- 商品種別のリストの獲得
- 総数量・総金額値の獲得
- 配送先情報の取得
基本的には関連する属性を取得・集計・判定するタイプのものが多い