Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

12,314 views

Published on

ドメイン駆動設計でなぜ作るのか?
ドメイン駆動設計の考え方
ドメイン駆動設計を実践するための6つの問い
事例研究
ドメイン駆動設計を現場に導入する
体験的に学ぶ
エヴァンス本をちゃんと読む

Published in: Software
  • Be the first to comment

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

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

×