ドメイン駆動設計入門
ドメイン駆動設計とは
- ドメイン --- プログラムを適用する対象となる領域
- ドメインモデル --- 現実の事象あるいは概念を抽象化した概念
- ドメインオブジェクト --- モデルをソフトウェア上で動作するモジュールとして表現したもの
これらは、
- ドメインエキスパートと開発者が協力して作っていく
- 必要に応じて適宜取捨選択を行いながら作る
- これらは互いに影響しあい常に反復的に変化していくべき
値オブジェクト
- システムならではの値の表現
- プリミティブな値が持つ性質がそのまま適用される
特徴
- 不変
- 一度作成したら値自身を変更することはできない
- 交換が可能
- 変数への代入により値を交換することはできる
- 等価性によって比較する
- 属性によって識別される
equals
メソッド等により値同士の透過性を比較できる
値オブジェクトにする基準
- ルールが存在しているか
- ルールがあるなら値オブジェクトにそのルールを語らせるべき
- 単体で取り扱いたいか
ふるまい
- 値オブジェクトは(単に値を保持するだけでなく)ふるまいも持つことができる。
- ふるまいにより自身に関するルールを語る
- 結果は新たな値として返却される
メリット
- 表現力が増す
- ただのプリミティブな値では何も分からない
- 値が正しいことを保証できる
- コンストラクタでバリデーションして不正な値を防げる
- 誤った代入を防げる
- 値オブジェクトは型を持つので不正な代入はできない。プリミティブな値ならできてしまう。
- ロジックが一箇所にまとまる
エンティティ
特徴
- 可変である
- ふるまい(メソッド)により値を変化させる。メソッドにルールを語らせる。
- 全ての属性を可変にする必要はないので注意
- 同一性により区別される
- 識別子(id)により区別する
- 仮に全ての属性が全く同じであっても区別される
エンティティにする基準
- ライフサイクル・連続性があるか
- 同じ概念を表していても、システムによっては値オブジェクトがいい場合もあれば、エンティティが良い場合もある。