ドメイン駆動設計についてちょっと調べたまとめ

## ネットの記事

### ドメイン駆動設計は何を解決しようとしているのか[DDD]

そもそもなぜDDDをやるのか？それは問題を解決したいから。

https://qiita.com/little_hand_s/items/721afcbc555444663247

- DDDは何を解決しようとしているのか
    - ソフトウェア化したい対象の課題
- 「モデリングから利益を得る」とは？
    - 問題解決のために抽象化して扱うこと
- 良いモデルとは？
    - 問題解決できるモデル
        - できないのはよくないモデル
            - 上長からフィードバックが必須なのに、書いた人と日付と内容しかない日報
                - オンラインで完結できない
- ループ
    - まずドメインについて正しく理解する
        - モデルを改善する
            - ソフトウェアに反映する
                - ぐるぐるループを回す
- ドメインエキスパート
    - ドメインに詳しい人
- ユビキタス言語
    - 共通の言葉
- どうやってソフトウェアに反映するか
    - モデルをそのまま表現する
    - 実績のあるDDDのデザインパターンを使用する


### なぜDDD初心者はググり出してすぐに心がくじけてしまうのか

DDDはバチッと決まってない。

https://little-hands.hatenablog.com/entry/2017/09/24/005903

- 3つのDDDの領域
    - 開発思想
        - ドメインエキスパートとエンジニアで言語・モデルの認識を合わせて開発していく
    - 戦略的思想
        - モデリングの原則と手法
    - 戦術的思想
        - 具体的な表現パターン
- アーキテクチャのお手本が一つに統合されていない
    - 有名な亜種
        - オニオンアーキテクチャ
        - クリーンアーキテクチャ


### ドメイン駆動設計の定義についてEric Evansはなんと言っているのか[DDD]

ドメイン駆動設計とは？

https://little-hands.hatenablog.com/entry/2017/09/27/014403

- ドメイン駆動設計の定義
    1. 中核となる複雑な部分に焦点を当てる
    2. ドメイン専門家とソフトウェア専門家とでモデルを探求する
    3. モデルを表現するソフトウェアを書く
    4. ユビキタス言語（同じ言葉）で話す
- 統合すると？
    - 「ドメイン専門家とソフトウェア専門家が同じ言葉を使ってドメインモデルを探求し、最終的にソフトウェアにまで落とし込むこと」


### 境界づけられたコンテキスト 概念編 - ドメイン駆動設計用語解説 [DDD]

境界づけられたコンテキストは世界の「虹色」の克服。

https://little-hands.hatenablog.com/entry/2017/11/28/bouded-context-concept

- 概念として境界づけられたコンテキスト
    - 商品である服
        - 販売する人からの見え方
            - 商品名、売値、在庫数
        - 配送する人からの見え方
            - 商品名、配送先、配送状況
        - 経理部からの見え方は？
    - 関係者すべてで統一したモデルが作れない
        - どんどん膨張していく
            - コンテキストに分ける
                - 販売コンテキスト
                - 配送コンテキスト
                    - これが境界づけられたコンテキスト
                        - それぞれのコンテキスト内での「商品」は同じ言葉で統一する
    - じゃあコンテキスト間はどうやってまたぐ
        - コンテキストマッピング
            - 関係をマッピングする手順をふむ
                - モデルはコンテキストによって変わるから
                    - 「虹色」が世界で違うのと同じ



### 境界づけられたコンテキスト 実装編 - ドメイン駆動設計用語解説 [DDD]


https://little-hands.hatenablog.com/entry/2017/12/07/bouded-context-implementation

- 境界づけられたコンテキスト実装の基本イメージ
    - 1コンテキスト = 1アプリケーション
        - アーキテクチャ1セット
            - マイクロサービス
                - 販売コンテキスト
                - 配送コンテキスト
        - DB1つ
            - コンテキストによって「商品」は違う
            - DBを共有すると？
                - 「このProductテーブルはどちらのモデル？」となる
            - スキーマを分けるのでもいい
    - コンテキスト同士はどうやって通信する？
        - マイクロサービスとして検討する
            - 同期
                - REST APIなど
                    - 「リクエスト結果を同期的に取得したい」
            - 非同期
                - イベント通信
                    - 「非同期にしてサービスが落ちていても大丈夫なようにしたい」


### ドメイン駆動設計とは何なのか？ ユーザーの業務知識をコードで表現する開発手法について

https://codezine.jp/article/detail/11968#:~:text=%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E6%A5%AD%E5%8B%99%E7%9F%A5%E8%AD%98%E3%82%92%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,-C%23&text=%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%BA%E3%81%8C%E6%8F%90%E5%94%B1%E3%81%97%E3%81%9F,%E3%81%99%E3%82%8B%E6%89%8B%E6%B3%95%E3%80%81%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%80%82

- ソフトウェア開発に必要な知識と不要な知識をより分けたい
    - 物流システム
        - 必要
            - トラックの積載量や燃費
        - 不要
            - トラックの語源はラテン語のtrochus
    - 利用者を取り巻く世界について知る必要がある
        - ドメイン知識
- ドメインとは？
    - 利用者の世界
        - 直面している問題は何か
            - どうやったら解決できるか
                - ソフトウェアに反映する
    - なぜドメインを知る必要があるのか
        - 技術だけでは解決できない
            - ピカピカのハンマーは全てを釘に変えてしまう
    - よく観察し、よく表現すること
- モデルとは何か？
    - 現実を抽象化したもの
        - ドメインによって取捨選択する
            - 万年筆
                - 小説家には道具に見える
                    - 書き味
                - 文房具店には商品に見える
                    - 値段や在庫
    - モデリング
        - 抽象化する作業
            - できたもの
                - ドメインモデル
                    - 取捨選択してコードで表現する
                        - ドメインオブジェクト
- ドメインは常に変化している
    - まずはドメインモデルに伝えられる
        - 差分を見る
            - ドメインオブジェクトに伝えられる
                - その逆もある
                    - 反復的な開発
- ドメイン知識を表現する
    - 値オブジェクト
        - 金銭や製造番号
    - エンティティ
        - 値オブジェクトと対になっている
    - ドメインサービス
        - 上記でうまく扱えない知識
- ソフトウェアを表現する
    - リポジトリ
        - データの保存や復元など
            - RDB
    - アプリケーションサービス
        - アプリとして成り立たせる
    - ファクトリ
        - オブジェクト生成する
- 集約
- 仕様


### ドメイン駆動設計をわかりやすく - ドメインのモデル設計を手を動かしながら学ぼう

https://eh-career.com/engineerhub/entry/2020/05/26/103000

- 構造化プログラミング
    - 手続き型
        - 1980年代に流行った
            - 人間の抽象化能力が使えない
            - データ構造変更時の取り扱いが難しい
            - 重複実装がバグの温床になる
- オブジェクト指向
    - 「データ」と「手続き」をもったオブジェクト
        - メッセージを交換し合う
    - モデリング
- ドメイン駆動設計
    - オブジェクト指向が基盤
- ボトムアップで作るスタイル
    - ドメインモデルに対応する型を積み上げていく



### ドメイン駆動設計のメリットと始め方 ～ 1章「DDDへの誘い」

書籍『実践ドメイン駆動設計』の要約。

https://codezine.jp/article/detail/9546

- DDDとは？
    - 顧客と開発者が同じ言葉で理解しあい、システムを発展させていく手法
        - ユビキタス言語
            - ドメインモデル
                - コードの実装
- なぜDDD?
    - どんどんソフトウェアは複雑になっている
        - 以前のウォーターフォールでは顧客と開発がズレてしまう
            - 求める機能のズレ
            - 速度のズレ
    - 環境がやりやすくなってきた
        - クラウド
            - マイクロサービス
        - アジャイル
- DDDの設計
    - 戦略的設計
        - ドメイン、サブドメイン、境界づけられたコンテキスト
        - コンテキストマップ
    - 戦術的設計
        - アーキテクチャ
        - エンティティ
        - 値オブジェクト
        - サービス
        - ドメインイベント
        - モジュール
        - ファクトリ
        - リポジトリ
        - 境界づけられたコンテキストの結合
        - アプリケーション
- DDDが解決してくれること
    - 「良いソフトウェアを作りたい」と考えている人たちの熱意を空回りさせないようにしてくれる
        - 面白い開発をしたい若手
        - 適切なものを作りたい中堅
        - 開発とビジネスの距離を縮めて事業価値を出したいベテラン
        - 開発者とスムーズに会話して良いソフトウェアを作りたい現場
        - 結果を出して欲しいマネージャ
- DDDのメリット
    - 共通言語により現場も開発者も一つのチームになってソフトウェアを開発できる
        - チーム化
    - 業務自体の理解を深くして洗練していける
        - カタをつくれる
    - 開発時の翻訳コストが下がり、実装時の課題に設計時に気づける
        - 手戻りを減らせる
- ユビキタス言語
    - どうやって探す？
        - 用語集を作成する
            - 用語を洗い出して名称とアクションを書く
            - 候補
                - 採用/却下理由
        - レビューはチームで行なう
    - ユビキタス言語にないものはコードにもない状態
        

### 実践DDD本 第2章「ドメイン」「サブドメイン」「境界づけられたコンテキスト」を読み解く

https://codezine.jp/article/detail/9744

- ドメイン
    - 取り扱う世界
        - コアドメイン
        - サブドメイン
            - 支援サブドメイン
            - 汎用サブドメイン
- 境界づけられたコンテキスト
    - 1つのコアドメイン（サブドメイン）に対応する