Successfully reported this slideshow.

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

36

Share

Loading in …3
×
1 of 61
1 of 61

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

36

Share

Download to read offline

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

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

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

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

  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

×