Successfully reported this slideshow.
Your SlideShare is downloading. ×

DDD sample code explained in Java

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 24 Ad
Advertisement

More Related Content

Slideshows for you (20)

Similar to DDD sample code explained in Java (20)

Advertisement

More from 増田 亨 (19)

Recently uploaded (20)

Advertisement

DDD sample code explained in Java

  1. 1. DDDのサンプルコード isolating-the-domain Spring Boot, Spring MVC, MyBatis, Thymeleaf 2019-02-18 2019/2/18 1
  2. 2. 始める前に ブログを書くかもという人、いらっしゃいますか? 2019/2/18 2
  3. 3. なぜ作ったか? 実アプリケーション並みの具体例がほしかった コードがいちばん具体的に伝えることができる 質問が具体的になり、考え方の違いがはっきりする 今日のイベントのQAタイムでのフィードバックにわくわく 2019/2/18 3 https://github.com/system-sekkei/isolating-the-domain
  4. 4. 何の具体例か? 2019/2/18 4
  5. 5. 何の具体例か? ビジネスルールが複雑さの原因 計算をモデリング 型指向でプログラミング この3つがドメイン駆動設計の核心 3/22(金)DevLOVE Premium「ドメイン駆動設計 本格入門」で解説 今日は、コードを中心に、どういう雰囲気か紹介 2019/2/18 5
  6. 6. 関心の分離 計算(ビジネスルール)を実行するモジュール群 データを入出力するモジュール群 この2つを分ける 同じモジュール(ソースファイル)に、計算と入出力を書かない 2019/2/18 6
  7. 7. モジュール構造の選択 手続き的な入出力モジュールに計算を埋め込む (トランザクションスクリプト) 計算を型(値の種類)でモジュール化して組み合わせる (ドメインモデル) ドメインモデル→計算モデル→計算モジュール→値の種類→型→クラス 2019/2/18 7
  8. 8. サンプルの概要 時給ベースの給与計算モデル 背景にあるルール 雇用契約(時給単価, …) 労働基準法(深夜, 休日, 総労働時間, …) 計算に必要な事実 勤務実績(いつ、何時間) 給与計算ルールを62種類の型で記述 本日は、給与(Payroll)型を中心に説明 2019/2/18 8
  9. 9. この後の段取り 給与(Payroll)型を中心に、レイヤごとに説明 ①ドメイン層(ビジネスルール層) ②アプリケーション層 ③データソース層 ④データベース ⑤プレゼンテーション層 ⑥ビジネスルールの設計ドキュメント レイヤごとにQAタイム 2019/2/18 9 ⑤プレゼンテーション 層 ②アプリケーション層 ③データソース層 ④データベース ①ビジネスルール層
  10. 10. 給与計算 計算結果 給与の一覧 2月 支払い額 計算の元データ →勤務時間の一覧(勤務の履歴) →従業員の一覧→布川光義→時給の履歴 計算ロジックのアグリゲートクラス domain.model.payroll.Payroll 計算結果 Payroll#totalPayment() : PaymentAmount 2019/2/18 10
  11. 11. ドメイン層(ビジネスルール層) 計算モデルが息づく場所 model パッケージ type パッケージ 型指向のプログラミング →github.com/masuda220/business-logic-patterns/wiki/設計ガイドライン Plain Old Java Bean Validation → 有効な値の表明 → 自己文書化の一部 可読性 over Javaの習慣的な記法 No getter, no setter, no Lombok, no JPA Payrollクラス 事実への参照:Contract型(契約条件:時給単価、割り増しルール、…) 事実への参照:Attendance型 (勤務実績) → (TimeRecords型:コレクションオブジェクト) 計算の実行:totalAmount() 結果の表現:PaymentAmount型 プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 11
  12. 12. QAタイム ドメイン層(ビジネスルール層)について (JIGドキュメントでも説明します) プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 12
  13. 13. アプリケーション層 計算モデルのインスタンスの生成を指示する→データソース層 Query サービス : 計算結果を返す(結果を表現した型のインスタンス)→プレゼンテーション層 Operation サービス:計算結果の記録/通知を指示する→データソース層 coordinatorクラス @Service 単機能のserviceのautowire 複数のサービスを複合したサービス PayrollQueryCorrdinatorクラス serviceクラス @Service repositoryのautowire 単機能 ContractQueryServiceクラス AttendanceQueryServiceクラス プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 13
  14. 14. QAタイム アプリケーション層について プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 14
  15. 15. データソース層 データの入出力の実装 MyBatis SQL Mapper SELECTの実行→オブジェクトの生成 記録すべき事実を持ったオブジェクト→INSERTの実行 ContractDataSourceクラス TimeRecordDatasourceクラス プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 15
  16. 16. データベース イミュータブルデータモデル 履歴+最新状態レコード 履歴:事実の記録 → INSERT オンリー 最新状態レコード:論理的には不要 → INSERT/DELETE NO UPDATE NO updated_at カラム 制約指向 型 NOT NULL制約、外部キー制約、ユニーク制約 とことん日本語 スキーマ名、テーブル名、カラム名 プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 16 https://www.slideshare.net/kawasima/ss-40471672 https://www.slideshare.net/kawasima/ss-44958468
  17. 17. QAタイム データソース層とデータベースについて プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 17
  18. 18. プレゼンテーション層 計算モデルのビュー ドメインオブジェクトをそのまま表示 (naked object パターン) Spring MVC Direct Field Access → WebDataBinder#initDirectFieldAccess() Thymeleaf Semantic UI PayrollControllerクラス templates/payroll/list.html プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 18
  19. 19. QAタイム プレゼンテーション層について プレゼンテーション層 アプリケーション層 データソース層 データベース ビジネスルール層 2019/2/18 19
  20. 20. JIGドキュメント • ビジネスルールの設計ドキュメント • コードから自動生成 • 設計レビューの補助(冶具) 2019/2/18 20
  21. 21. QAタイム JIGドキュメントについて 2019/2/18 21
  22. 22. まとめ 2019/2/18 22
  23. 23. なぜ作ったか? 実アプリケーション並みの具体例がほしかった コードがいちばん具体的に伝えることができる 質問が具体的になり、考え方の違いがはっきりする 2019/2/18 23
  24. 24. 何の具体例か? ビジネスルールが複雑さの原因 計算をモデリング 型指向でプログラミング この3つがドメイン駆動設計の核心 3/22(金)DevLOVE Premium「ドメイン駆動設計 本格入門」で解説 今日は、コードを中心に、どういう雰囲気か紹介 2019/2/18 24

×