DDD 01 考え方(ドメイン・モデル・ユビキタス言語)
更新日:
入口 → DDD / 次 → DDD_02_戦略的設計(境界づけられたコンテキスト・サブドメイン・コンテキストマップ)
1. DDD が解決したい問題
ソフトウェアが難しくなる原因は、多くの場合技術ではなく業務の複雑さ。
よくある崩れ方:
- 業務ルールが 画面・API・SQL・バッチにバラバラに書かれ、同じ判定が5か所にある
- 「会員」「ユーザー」「顧客」「アカウント」が同じものか違うものか誰も説明できない
- 業務の人と話すときは「仮押さえ」、コードでは
status = 2。翻訳ミスでバグる - 何でも入った巨大な
Userクラス /utils.tsができ、どこを直すと何が壊れるか分からない
DDD の答え:
- 業務を深く理解し、その理解(モデル)をそのままコードにする
- 言葉を揃える(ユビキタス言語)
- 意味の境界でシステムを分ける(境界づけられたコンテキスト → 02章)
- 業務ルールを1か所(ドメイン層)に集める(03〜05章)
2. ドメインとモデル
- ドメイン: ソフトウェアで解決したい業務の領域。「EC サイトの受注」「美容院の予約」
- モデル: ドメインのうち、解きたい問題に必要な部分だけを抜き出して整理したもの
- 地図と同じ。路線図は正確な距離を捨てて「乗り換え」を分かりやすくしている
- 「現実を完全に写す」のではなく「目的に役立つように単純化」するのがよいモデル
- ドメインモデル: そのモデルを表したもの。図や文章でもよいが、DDD では最終的にコードがモデルそのものになるのが理想
業務の人の頭の中の知識
│ 対話・例を出して確認
▼
モデル(言葉・ルール・関係) ← 図やメモで共有
│ そのまま実装
▼
コード(Order.confirm() / Money / ReservationPolicy …)
│ 実装して分かった矛盾・新発見
└──→ モデルを直す(行ったり来たり)3. ユビキタス言語(Ubiquitous Language)
チーム全員が、会話・仕様書・画面・コード・テスト名のすべてで使う共通の言葉。DDD で一番効果が大きく、一番簡単に始められる。
| ✗ バラバラ | ○ ユビキタス言語 |
|---|---|
業務「仮押さえ」/ 仕様書「一時予約」/ コード status=2 | 全部「仮予約」Reservation.status = 'tentative'、reservation.holdTentatively() |
業務「お客さん」/ コード User, Member, Customer が混在 | 「会員」=ログインできる人 Member、「購入者」=注文した人 Purchaser と定義して使い分ける |
updateStatus(order, 3) | order.ship()(業務の人が読んでも分かる) |
進め方:
- 用語集(グロッサリー)を作る:用語・意味・英語名(コード上の名前)・例・似ているが違う言葉
- 会話で言葉がぶれたら、その場で「それは〇〇のことですか?」と確認し用語集を更新
- コードの名前を業務の言葉に合わせる。業務で使わない技術用語(
Manager,Data,Info,Helper)を避ける - 言葉が変わったらコードもリネームする(言葉とコードがずれると価値が消える)
用語集の例
| 用語 | コード名 | 意味 | 注意 |
|---|---|---|---|
| 仮予約 | TentativeReservation / status: 'tentative' | 支払い前に24時間だけ枠を押さえた状態 | 24時間で自動キャンセル |
| 本予約 | status: 'confirmed' | 支払い済みの予約 | キャンセル料が発生しうる |
| 会員 | Member | ログインアカウントを持つ人 | 「顧客」とは別(電話予約の非会員も顧客) |
4. 知識の噛み砕き(Knowledge Crunching)
業務の人と開発者が一緒にモデルを作り込む活動。
- 具体例で話す:「キャンセルはいつまで無料ですか?」「前日23:59に取り消したら?」「日付をまたぐ夜の予約は?」
- 境界条件・例外を掘る:ルールの「ただし〜」にこそ業務知識が詰まっている
- イベントストーミング:業務で起きる出来事(「予約が確定した」「入金が確認された」)を付箋で時系列に並べ、きっかけ(コマンド)・関わる人・ルールを書き足していくワークショップ。全体像と言葉のズレが一気に見える
- ドメインエキスパートが分からない部分も明らかにする:「決まっていない」ことが分かるのも成果
5. モデル駆動設計 ― 分析と実装を分けない
- 昔ながらの進め方:分析者がモデル図を描く → 別の人が実装 → 図とコードが乖離
- DDD:モデルを作る人とコードを書く人を分けない。実装で見つかった矛盾をモデルに戻す
- だから「ドメイン層のコードを読めば業務ルールが分かる」状態を目指す
6. 初学者向けまとめ
- DDD の核心は部品(パターン)ではなく、業務理解と共通言語
- 小さなアプリでも今日からできるのは:
- 用語集を作り、コード・画面・会話で同じ言葉を使う
-
status = 2のような意味の見えない値を、業務の言葉の名前にする - 業務ルール(「〜のときは〜できない」)を1か所にまとめる
- 部品やアーキテクチャは「ルールが複雑になってきたら」取り入れればよい(DDD_06_実務の注意(やりすぎ・TypeScript・AI開発))