ドメイン駆動設計の
正しい歩き方
2019年5月29日
ギルドワークス 増田
BP Study #144 ~DDD(Domain Driven Design)実践の現場
ドメイン駆動設計でなぜつくるのか?
22019/5/29
進化を続けるソフトウェアを手に入れる
ソフトウェアの変更を楽で安全にする
2019/5/29 3
この価値観に振り切っている
リリース後、あまりコードを変えない/変えられない、という世界とは別のアプローチ
ドメイン駆動設計とはなにか?
2019/5/29 4
整合性
トランザクション
ドメイン駆動設計?
ネットワーク
レガシー
アーキテクチャ
要件定義
分析・モデリング
XP
設計パターン
オブジェクト指向
リファクタリング
ORマッピング
データベース
モデル駆動設計
ビジネスの活動
設計に関係する話はしているが…2019/5/29 5
ドメイン駆動設計の本質
2019/5/29 6
ソフトウェアの核心にある
複雑さに立ち向かう
2019/5/29 7
核心にある複雑さ
2019/5/29 8
ソフトウェアの複雑さは
ビジネス活動の複雑さに由来する
ビジネスルール:ビジネスの活動を駆動し、制約する約束事
ドメインロジック:ビジネスルールをコードで表現したもの
ドメイン駆動設計の考え方
2019/5/29 9
中でもビジネスルールの複雑さが
ソフトウェアの複雑さの根本原因
核心にある複雑さを
適切に扱う
核心と周辺との
依存関係が明確になる
全体の構造の
改善に波及する
周辺の
複雑さが軽減される
ビジネス活動の複雑さ
それを刺激し制御する
ビジネスルールの複雑さ
2019/5/29 10
核心にある複雑さをどう扱うか?
2019/5/29 11
核心にある複雑さ
に立ち向かう
ビジネスの活動を
継続的に学ぶ
モデルと実装を
密に結合する
ドメイン層を
独立させる
コアドメインに
集中する
システム間の秩序の
改善を続ける
ビジネスを
深く洞察する
ビジネスルールの複雑さ
2019/5/29 12
ドメイン駆動設計を実践するための
6つの問い
132019/5/29
ビジネスの活動を継続的に学んでいるか?
コアドメインに集中しているか?
ビジネスを深く洞察しているか?
ドメイン層を独立させているか?
モデルと実装を密に結合しているか?
システム間の秩序の改善を続けているか?
2019/5/29 14
ドメイン駆動設計
正しい道からはずれる時
152019/5/29
ビジネスの活動から目をそらす
全体を均質にカバーしようとする
ビジネスを表面的にとらえて理解した気になる
ドメイン層に入出力の関心事を持ち込む
モデルと実装を切り離す
システム間を力づくで連携させる
2019/5/29 16
ソフトウェアの
核心にある複雑さに立ち向かう
172019/5/29
核心にある複雑さ
に立ち向かう
ビジネスの活動を
継続的に学ぶ
モデルと実装を
密に結合する
ドメイン層を
独立させる
コアドメインに
集中する
システム間の秩序の
改善を続ける
ビジネスを
深く洞察する
ビジネスルールの複雑さ
2019/5/29 18
事例研究
ホテルの予約アプリケーション
192019/5/29
宿泊予定日の
空きを確認する
料金を確認する
予約する
料金計算ルール
(ここに焦点を合わせる)
氏名、連絡先の入力と記録
空き状況の更新
部屋の空きの管理
宿泊を希望する人
2019/5/29 20
宿泊料金は
ビジネス活動
の中核の関心事
宿泊料金
この料金計算ロジックを
いきなり、コードで
書けますか?
さまざまな理由で
複雑化する
料金カレンダー
さまざまなケースで
バグを出さない自信は?
ルール変更があった時
バグを出さない自信は?
2019/5/29 21
複雑な料金計算ロジックを
どうやってコードで表現するか
222019/5/29
ドメインロジックを独立させる
プレゼンテーション層
(料金確認画面)
アプリケーション層
(料金計算の実行)
データソース層
(料金設定データの取得)
ドメイン層
料金計算モジュール
2019/5/29 23
左側の関心事から分離して
「料金計算ロジック」を独立して実装する
モデルで整理し
モデルと実装を密に結合する
表形式のルール
さまざまな但し書き
料金モデル
class 料金 {
金額 合計() {
…..
}
}
料金ルールを整理する
料金ルールの構成要素とその関係
自然言語や数式、クラス図、…
計算ロジックを実装する
コードのリファクタリング
モデルへのフィードバック
2019/5/29 24
コアドメインに集中する
料金計算のさまざまな関心事
• 宿泊日はどのシーズンか
• 特別室か一般客室か
• 一室に何名で泊まるか
• 大人、子供、幼児はそれぞれ何人か
• 消費税計算と税率変更対応
• ホテル休業日
• 素泊まり料金、素泊まり条件
• 小学生料金
• 幼児の寝具、幼児の食事、一名カウント
• 一室一名条件
• キャンセル料
中核のルールは何か?
周辺のルールは何か?
除外すべきルールは何か?
コアドメインを探り当て、そこに集中するために、ビジネスの活動を継続的に学ぶ
2019/5/29 25
ビジネスを深く洞察する
中核となる料金ルールは、なぜそうなっているか?
周辺の料金ルールは、どういう意味か?
料金表の間違いを指摘できるか?
ビジネスを深く洞察するために、ビジネスの活動を継続的に学ぶ
2019/5/29 26
システム間の秩序の改善を続ける
システム間の秩序の改善を続けるため、ビジネスの活動を継続的に学ぶ
フロント管理
パッケージソフト
クレジット決済
代行サービス
要員管理
宿泊予約
アプリケーション
外部の
予約サービス
仕入れ管理
販売促進活動
人間系?
CSVファイル連携?
Web API?
2019/5/29 27
ビジネスの活動を継続的に学ぶ
ビジネスの活動を
継続的に学ぶ
コアドメインに
集中する
ビジネスを
深く洞察する
システム間の秩序の
改善を続ける
2019/5/29 28
ドメイン駆動設計でつくるとは
どういうことか?
2019/5/29 29
核心にある複雑さ
に立ち向かう
ビジネスの活動を
継続的に学ぶ
モデルと実装を
密に結合する
ドメイン層を
独立させる
コアドメインに
集中する
システム間の秩序の
改善を続ける
ビジネスを
深く洞察する
ビジネスルールの複雑さ
2019/5/29 30
ドメイン駆動設計を現場に導入する
312019/5/29
エヴァンス本を
ちゃんと読む!
体験的に
習得する
想定読者の
要件をクリアする
ハンズオン
OJT
28ページの
抜粋版を読む
要点を
重点的に読む
全体構成を
理解する
エヴァンスの
文章スタイルに
慣れる
教材セット
2019/5/29 32
想定読者の要件をクリアする
332019/5/29
エヴァンス本の想定読者
オブジェクト指向ソフトウェアの開発者
UMLとJavaの基礎知識を持っている
オブジェクト指向モデリングの若干の知識
エクストリームプログラミングを知っている
オブジェクト指向設計のなんらかの知識
オブジェクト指向設計の文献を1,2冊は読んでいる
2019/5/29 34
想定読者の要件をクリアする教材セット
352019/5/29
DDDサンプルコード
設計可視化ツール
わかりやすい入門書
普遍的な教科書
https://github.com/system-sekkei/isolating-the-domain
61 watchers
259 stars
44 forks
https://github.com/dddjava/Jig
13 watchers
55 stars
4 forks
設計ガイドライン
https://github.com/masuda220/business-logic-patterns/wiki/設計ガイドライン
ドメイン駆動設計本格入門
https://www.slideshare.net/masuda220/ss-137608652
Java
UML
オブジェクト指向設計
オブジェクト指向設計, Java
オブジェクト指向設計
2019/5/29 36
教材セットを使った体験学習
ハンズオン
社内研修
社外研修
DDD Alliance
https://ddd-alliance.connpass.com/
2019/5/29 37
実プロジェクトでOJT
OJT
新規開発案件に
参加する
開発プロジェクトを
手伝う
絶賛 募集中!
応相談!
個人
企業
副業支援
独立支援
スキルアップ支援
2019/5/29 38
エヴァンス本をちゃんと読む!
392019/5/29
28ページの
抜粋版を読む
紙の本を読む
✓ いったりきたりするため
✓ 文章の構造を視覚的にとらえるため
要点を
重点的に読む
全体構成を
理解する
エヴァンスの
文章スタイルに慣れる
2019/5/29 40
28ページの抜粋版
読むべきところ ページ数 開始 終了
まえがき 9 xii xx
第1部 ドメインモデルを機能させる 導入文 4 2 5
第2部 モデル駆動設計の構想要素 導入文 2 62 63
第3部 より深い洞察に向かうリファクタリング 導入文 5 190 194
第4部 戦略的設計 導入文 2 336 337
結論 6 506 511
合計ページ数 28
2019/5/29 41
エヴァンス本の全体構成を理解する
422019/5/29
2019/5/29 43
参考
2019/5/29 44
エヴァンス本と照らし合わせると、かなり偏った内容
バーノン本を読む時は、そこは理解しておいたほうがよい
エヴァンス本の全体構成を理解する
そのうち10程度のパターン形式のセクションだけで語られすぎ
4部、17章、114セクション
パターン形式のセクション 43
一般形式のセクション 71
バーノンの「実践ドメイン駆動設計」の影響?
目次で、セクション見出しを
一覧できる
ドメイン駆動設計の核心は、他のセクションにある
エンティティ、リポジトリ、アグリゲート、….
2019/5/29 45
エヴァンス本の要点を重点的に読む
462019/5/29
第3部 深い洞察に向かうリファクタリング
第9章
暗黙的な概念を
明示的にする
第10章
しなやかな設計
概念を
引き出す
明白でない概念を
モデル化する方法
意図の
伝達性
効果的な
分解
宣言的
スタイル
攻める
角度
概念の発見と言語化 表現力の改善
2019/5/29 47
第4部 戦略的設計
ひとつのコンテキストにひとつのモデルを維持する
第14章
モデルの整合性を
維持する 境界づけられた
コンテキスト
継続的な
統合
第15章
蒸留
第16章
大規模な構造
コア
ドメイン
サブ
ドメイン
責務の
レイヤー
2019/5/29 48
第4部 戦略的設計
複数コンテキストの関係を俯瞰して整理する
第14章
モデルの整合性を
維持する
コンテキスト
マップ
第15章
蒸留
第16章
大規模な構造
コア
ドメイン
サブ
ドメイン
責務の
レイヤー
第17章
戦略を
まとめ上げる
進化を続ける
秩序
2019/5/29 49
エヴァンスの文章スタイルに慣れる
502019/5/29
エヴァンスの文章スタイルに慣れる
プロジェクトの
経験談や具体例
設計課題と
考え方の説明
他の事項との
関連性の説明
章、セクションに共通するエヴァンスのスタイル
突然、わけのわからない
話が始まる
ようやく設計の考え方の説明
話が発散したり
焦点がぼやける補足説明
いったん無視
そのほうが混乱しないここをじっくり読む
後ろを理解してから
読み直すと、ようやく
なんの例か理解できる
2019/5/29 51
ドメイン駆動設計の正しい歩き方
522019/5/29
まとめ
ドメイン駆動設計でなぜつくるのか?
532019/5/29
進化を続けるソフトウェアを手に入れる
ソフトウェアの変更を楽で安全にする
2019/5/29 54
ドメイン駆動設計でつくるとは
どういうことか?
2019/5/29 55
核心にある複雑さを
適切に扱う
核心と周辺との
依存関係が明確になる
全体の構造の
改善に波及する
周辺の
複雑さが軽減される
ビジネス活動の複雑さ
それを刺激し制御する
ビジネスルールの複雑さ
2019/5/29 56
核心にある複雑さ
に立ち向かう
ビジネスの活動を
継続的に学ぶ
モデルと実装を
密に結合する
ドメイン層を
独立させる
コアドメインに
集中する
システム間の秩序の
改善を続ける
ビジネスを
深く洞察する
ビジネスルールの複雑さ
2019/5/29 57
ドメイン駆動設計を実践するための
6つの問い
582019/5/29
ビジネスの活動を継続的に学んでいるか?
コアドメインに集中しているか?
ビジネスを深く洞察しているか?
ドメイン層を独立させているか?
モデルと実装を密に結合しているか?
システム間の秩序の改善を続けているか?
2019/5/29 59
想定読者の要件をクリアする教材セット
602019/5/29
DDDサンプルコード
設計可視化ツール
わかりやすい入門書 https://github.com/system-sekkei/isolating-the-domain
61 watchers
259 stars
44 forks
https://github.com/dddjava/Jig
13 watchers
55 stars
4 forks
設計ガイドライン
https://github.com/masuda220/business-logic-patterns/wiki/設計ガイドライン
ドメイン駆動設計本格入門
https://www.slideshare.net/masuda220/ss-137608652
Java
UML
オブジェクト指向設計
オブジェクト指向設計, Java
オブジェクト指向設計
2019/5/29 61

ドメイン駆動設計の正しい歩き方