Upgrade to Pro — share decks privately, control downloads, hide ads and more …

事業価値を生み出すモデリング 価値をサステナブルにするアーキテクチャ

事業価値を生み出すモデリング 価値をサステナブルにするアーキテクチャ

このスライドでは、ドメイン駆動設計の手法を用いて、
モデリングで機能性を高め、
アーキテクチャと実装パターンで保守性を高める方法を紹介します。

ドメイン駆動設計のモデリング手法として、シンプルな4つの図でモデリングできる"sudoモデリング"の事例を紹介し、それをコードに落とし込むためにどのようなアーキテクチャが必要かを解説します。

# 関連資料

ドメイン駆動設計 サンプルコード&FAQ
https://little-hands.booth.pm/items/3363104
今回の内容はこちらからの抜粋です。DDDに関して頻出の質問に、多くのサンプルコードを交えて回答した解説書です。
モデリング、集約の実装、テストについても具体例を交えて解説しています。

## 実装方法に関しての解説動画
10分でわかるドメインモデルをコードに落とす方法
https://www.youtube.com/watch?v=Upeg6cNOirc
DDDの「集約」コードを見れば一発でわかります。
https://www.youtube.com/watch?v=Hn4EAXYBl8c

# SNS・質問箱
Xはこちら
https://x.com/little_hand_s

匿名で質問できる質問箱はこちら
https://querie.me/user/little_hand_s

DDD勉強会/設計相談サポート内容のご紹介
https://www.notion.so/DDD-22429f7110574439a4c3e126c20fa9a2?pvs=21

ログラスProductTeam公式X
https://twitter.com/LoglassPrdTeam

ログラスの求人内容
https://hrmos.co/pages/loglass/jobs/1813462408235663415

Koichiro Matsuoka

May 23, 2024
Tweet

More Decks by Koichiro Matsuoka

Other Decks in Technology

Transcript

  1. • 名前 ◦ 松岡 幸一郎 (@little_hand_s) • 所属 ◦ 株式会社ログラス

    経営管理領域でDDDを実践中 • 発信 ◦ 「ドメイン駆動設計 サンプルコード&FAQ」 「ドメイン駆動設計 モデリング/実装ガイド」執筆 ◦ 質問箱 (DDD関連の匿名質問受付) ◦ DDD関連の技術ブログ ◦ Youtube DDD解説動画チャンネル • その他活動 ◦ 企業様へのDDD導入/設計サポートなど 自己紹介 2
  2. • ①ソフトウェアの機能性を高めること → 役に立つものを作る  「作ったけど使えない」を避ける • ②ソフトウェアの保守性を高めること → 長期間開発しても機能拡張が容易でありつづける  

    「技術的負債でどんどん開発速度が低下する」を避ける DDDでは 役に立つソフトウェアを、長期間保守性を下げずに作り続けられるようにする ことを目指します DDDの目的 14
  3. • ①機能性向上へのアプローチ → ドメインエキスパートと共に行うドメインモデリング ◦ 「ドメインモデル」という抽象化物にドメインの知識を反映することで、 役に立つものになる可能性を高める ◦ 開発初期だけではなく、各フェーズで得られた発見をこまめに フィードバックすることで改善頻度を上げる

    • ②保守性向上のためのアプローチ → 頻繁なモデルの更新に耐えられる実装パターンとアーキテクチャ ◦ モデルの形をそのままコードで表現し、モデルの変更を反映しやすくする ◦ 頻繁な更新に耐えられるように、 保守性の高いデザインパターン(エンティティ、リポジトリ等)を適用する ◦ そのパターンを実現しやすいアーキテクチャを活用する DDDのアプローチ(1/2) 15
  4. ドメインエキスパートの必要性 • シンプルに、こう考えよう ◦ 「役に立つソフトウェアを作るために、現場を理解するために、   誰の知識が必要か?」 • 現場の知識があれば、必ず役立つものができる訳ではない しかし、現場の知識がないと役立つものが作れる可能性は下がる

    また、知識を得る頻度は多い方がよい • たまに聞かれる質問 「ドメインエキスパートがいないんですけどどうすればいいですか」 →「役立つものを作るのに十分な現場の知識を得るにはどうしたらいいか?」  と考える 18
  5. 以下の4つの図を使用したモデリング • システム関連図 • ユースケース図 • ドメインモデル図 • オブジェクト図 頭文字をとって「"sudo"モデリング」と覚えてください。

    • 「必要最低限この4つは抑えると良い」というラインナップ • 他にも必要に応じて追加してください 状態遷移図、業務フロー図あたりは追加で作ることが多いです。 sudoモデリング 20
  6. アジェンダ • モデリングの必要性とDDDのアプローチ • モデリング方法 ◦ システム関連図 ◦ ユースケース図 ◦

    ドメインモデル図 ◦ オブジェクト図 • モデルと実装のつながり • DDDのアーキテクチャ • DDDの実装パターンの参考情報 23
  7. • モデリングの必要性とDDDのアプローチ • モデリング方法 ◦ システム関連図 ◦ ユースケース図 ◦ ドメインモデル図

    ◦ オブジェクト図 • モデルと実装のつながり • DDDのアーキテクチャ • DDDの実装パターンの参考情報 アジェンダ 26
  8. アジェンダ • モデリングの必要性とDDDのアプローチ • モデリング方法 ◦ システム関連図 ◦ ユースケース図 ◦

    ドメインモデル図 ◦ オブジェクト図 • モデルと実装のつながり • DDDのアーキテクチャ • DDDの実装パターンの参考情報 29
  9. ドメインモデル図・オブジェクト図 • ドメインモデル図 ◦ 簡易化したクラス図のようなもの ◦ これが最終的にコードで表現される • オブジェクト図 ◦

    ドメインモデルの具体的な値 ◦ 実際はこの具体値を書き出すところから始める • オブジェクト図での具体例の重要性 ◦ ここで具体例を書き出していくことが、モデリング参加者の認識を合わせ、発見 を生み出すために非常に重要。 ◦ 「具体例」は、実際の用途を理解する上で重要であるにもかかわらず、 クラス図にもテーブル定義にも表現されない情報 30
  10. • オブジェクト図から、ドメインモデルに抽象化していく ◦ オブジェクトの代表的な属性を書く ◦ 「ルール/制約(ドメイン知識)」を吹き出しに書き出す ◦ オブジェクト同士の関連を示す ◦ 多重度を定義する

    • 実装前に細かく決めること ◦ 集約の範囲を定義する ◦ 日本語と英語の対訳を定義する ▪ これが「ユビキタス言語」のマスタになる ドメインモデル図・オブジェクト図 33
  11. • これらは実装よりの話なので、エンジニアだけで議論しても良い • 集約の範囲(⑤) ◦ 実装する際のリポジトリの範囲を決める ◦ 本資料末に参考資料を記載 • 日本語名の対訳としての英語名(⑥)

    ◦ これがユビキタス言語のマスタになる ▪ ユビキタス:in everywhereという意味で、 会話でも、画面でも、コードでもどこでも同じ用語で統一する ◦ ここで定義すると、エンドポイント名、テーブル名、クラス名などで使われる名称 の表記揺れを防ぐことができる 38
  12. 恐ろしいデジャヴ 48 • みたことありませんか ◦ XxxxService ◦ XxxxLogic ◦ という数百行、数千行の神クラスを・・・!

    DoEverythingService コードが追えない ちょっと触るとすぐバ グる 俗人化された 知見の嵐
  13. 恐ろしいデジャヴ 49 • みたことありませんか ◦ XxxxService ◦ XxxxLogic ◦ という数百行、数千行の神クラスを・・・!

    DoEverythingService コードが追えない ちょっと触るとすぐバ グる 俗人化された 知見の嵐
  14. タスク管理アプリケーションの例 • 企画の人から渡される「仕様」の例 ◦ ユーザー登録、非活性化ができる ◦ メールアドレスは重複登録できない ◦ タスク登録、更新、完了、未完了に戻す、延期、ユーザーへのアサインができる ◦

    タスクは3 回までしか延期ができない ◦ 非活性化されていないユーザーにアサインができる ◦ タスク期日をカレンダーに登録することができる • いわゆる「仕様」「ビジネスロジック」 54
  15. タスク管理アプリケーションの例 • 企画の人から渡される「仕様」の例 ◦ ユーザー登録、非活性化ができる ◦ メールアドレスは重複登録できない ◦ タスク登録、更新、完了、未完了に戻す、延期、ユーザーへのアサインができる ◦

    タスクは3 回までしか延期ができない ◦ 非活性化されていないユーザーにアサインができる ◦ タスク期日をカレンダーに登録することができる • いわゆる「仕様」「ビジネスロジック」 • しかし、これらは本当に並列するべき同じ性質のものでしょうか? 55
  16. • 企画の人から渡される「仕様」の例 ◦ ユーザー登録、非活性化ができる ◦ メールアドレスは重複登録できない ◦ タスク登録、更新、完了、未完了に戻す、延期、ユーザーへのアサインができる ◦ タスクは3

    回までしか延期ができない ◦ 非活性化されていないユーザーにアサインができる ◦ タスク期日をカレンダーに登録することができる タスク管理アプリケーションの例 59 青字:ユースケース オレンジ字:ルール/制約
  17. • 企画の人から渡される「仕様」の例 ◦ ユーザー登録、非活性化ができる ◦ メールアドレスは重複登録できない ◦ タスク登録、更新、完了、未完了に戻す、延期、ユーザーへのアサインができる ◦ タスクは3

    回までしか延期ができない ◦ 非活性化されていないユーザーにアサインができる ◦ タスク期日をカレンダーに登録することができる タスク管理アプリケーションの例 青字:ユースケース オレンジ字:ルール/制約 60
  18. • 企画の人から渡される「仕様」の例 ◦ ユーザー登録、非活性化ができる ◦ メールアドレスは重複登録できない ◦ タスク登録、更新、完了、未完了に戻す、延期、ユーザーへのアサインができる ◦ タスクは3

    回までしか延期ができない ◦ 非活性化されていないユーザーにアサインができる ◦ タスク期日をカレンダーに登録することができる タスク管理アプリケーションの例 青字:ユースケース オレンジ字:ルール/制約 61
  19. タスク管理アプリケーションの例 • 企画の人から渡される「仕様」の例 ◦ ユーザー登録、非活性化ができる ◦ メールアドレスは重複登録できない ◦ タスク登録、更新、完了、未完了に戻す、延期、ユーザーへのアサインができる ◦

    タスクは3 回までしか延期ができない ◦ 非活性化されていないユーザーにアサインができる ◦ タスク期日をカレンダーに登録することができる • 異なる性質のものが全て「仕様」「ビジネスロジック」というくくりでまとめられてい た • ビジネスロジック層が責務過剰になり、凝集度が低下していた 青字:ユースケース オレンジ字:ルール/制約 62
  20. レイヤードアーキテクチャの問題 • 問題 ◦ ドメイン層がインフラ層に依存している ▪ ドメイン層が特定のDBやライブラリに依存している ▪ DBやライブラリの実装によって、ドメイン層の実装に制限が生まれる ▪

    「ほんとはこうしたいんだけど、このORMだとどうしても・・・」 • 解決策 ◦ ドメイン層がインフラ層に依存しないようにしたい →どうやって? →依存性の逆転を使用する 67
  21. 3層アーキテクチャの改善 68 プレゼンテーショ ン層 ユースケース層 ドメイン層 インフラ層 プレゼンテーション層 ユースケース層 ドメイン層

    インフラ層 実装クラス Interface プレゼンテー ション層 ユースケース層 ドメイン層 Interface インフラ層 実装クラス
  22. • 最終的なアーキテクチャはこちら • あとはドメイン層に実装パターンを用いてモデルを表現する ユースケース層 ドメイン知識(ルール/制約)の実現 ドメインオブジェクトの実装 (エンティティ、値オブジェクト、 リポジトリのIF等) ドメイン層で定義されている

    IFの技術的詳細を提供 リポジトリ(実装クラス)の実装 ユースケースの実現 改善されたアーキテクチャ(オニオンアーキテクチャ) クライアントとの入出力 プレゼンテーショ ン層 ドメイン層 インフラ層 70
  23. 実装パターンの利用方法 • ドメイン層にて、ドメイン知識を表現するための実装パターン ◦ エンティティ ◦ 値オブジェクト ◦ リポジトリ ◦

    ファクトリ ◦ ドメインサービス ◦ ドメインイベント • この実装方法については別の資料をご紹介します 72