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

DDD sample code explained in Java