/my-ddd-sample

DDD(Domain Driven Design) sample app.

Primary LanguageJavaApache License 2.0Apache-2.0

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」や画面に手続き的なロジックを書いてしまっても、そこからアルゴリズムの本質は値オブジェクトに逃していく。