my-ddd-sample
DDD(Domain Driven Design) sample app.
ビジネス目標
- 劇場のチケット販売システム
ログイン方法
ユーザー/パスワード=user/password
DB
PostgreSQL データベース名「postgres」
アーキテクチャ
- 値オブジェクトを中心にモデリング
- CQRS的にクエリと登録/更新はコードに表現されたモデルを分ける。
- クエリーモデルはデータ構造。内部データを公開するgetterを持つ。プロパティは値オブジェクト。 モデルの名前は更新モデルと区別するため、とりあえず、Beanをつけることにした。
- 更新モデルはオブジェクトモデルであり、内部データを隠蔽(package private)する。ビジネスロジックを持つ。
- 全てのモデルは不変。
- ユースケースはクエリモデルと更新モデルを利用して実装する。 ユースケースを分割したモデルを「concerns」として整理する。「concerns」内のモデルは他の「concerns」と共有しない想定。 共有ロジックは値オブジェクトにする。
- アプリケーションサービスはトランザクション管理、および、メール通知/ログ出力など付随的な処理を挿入する。ビジネスロジックは持たない。
- コントローラのパッケージ分けは画面/URLの都合に合わせる。
- フォームバインディングとバリデーションは、FWを拡張して、値オブジェクトを直接使えるようにした。参照:https://github.com/deffence1776/vo-binding-validation
想定開発プロセス
- シナリオをビジネスサイドと共有しつつ、モデルを豊かにしていく。 「concerns」や画面に手続き的なロジックを書いてしまっても、そこからアルゴリズムの本質は値オブジェクトに逃していく。