このドキュメントは、DDD(ドメイン駆動設計)に基づいて、ソフトウェアを設計するためのテンプレートです。
上から順番にテンプレートを埋めていくことで、 DDD に基づいたドメイン周りの設計がスムーズに行えるように作っています。
- 1. システム概要
- 2. ユースケース
- 3. ユビキタス言語
- 4. エンティティ候補
- 5. 不変条件(Invariant)
- 6. 状態遷移
- 7. 集約設計
- 8. ドメインサービス
- 9. リポジトリ
- 10. ユースケース設計
1. システム概要
システムの目的
このシステムは何を解決するものか。
【例】
- フリーランスの固定費を管理する
- 口座振替の関係を可視化する
対象ユーザー
このシステムのユーザー。
【例】
- 個人
- フリーランス
- 企業
解決したい課題
【例】
- 固定費の支払い関係が分かりにくい
- 口座振替の全体構造を把握できない
2. ユースケース
ユーザーがシステムで行う操作を列挙する。
ユースケース一覧
【例】
- ○○を作成する
- ○○を変更する
- ○○を削除する
- ○○を確認する
ユースケース詳細
【例】振替関係を作成する
入力
【例】
- accountId
- serviceId
- paymentDay
処理概要
【例】
- 口座を取得
- サービスを取得
- 振替関係を作成
- 保存
出力
【例】
- 振替関係ID
3. ユビキタス言語
ドメインで使う用語を定義する。
概念は何度か練り直すと、よい概念に落ち着きやすい。
日本語だけではなく、英語でも定義する。
英語は実装時に使用する。
過不足なく正確に伝わる英単語が存在するかどうかも、日本語選定の基準となります。
概念
【例】
お金を支払う対象となるサービス。
候補とその言葉のイメージ
【例】
- 振替先
- 口座からお金が引き落とされる対象
- 支払い先
- ユーザーがお金を支払う相手
- 請求元
- 請求を発行する会社
- 引き落とし先
- 銀行口座から自動的にお金が引き落とされる相手
賛否の意見
【例】
- 振替先
- 銀行用語っぽい
- 一般ユーザーが使う言葉ではない
- 支払い先
- 手動支払いも含みそう
- 請求元
- 請求書前提
- 引き落とし先
- 意味は近いが長い
言葉の決定とその採用理由
【例】
- 採用
- 支払い先
- 理由
- 一般ユーザーが理解しやすい
- サービスにも会社にも使える
ユビキタス言語辞書
【例】
| 用語(日本語) | 用語(英語) | 意味 |
|---|---|---|
| 支払元 | Payer | 発生した支払いに対して、お金が出ていくところ |
| 支払先 | Payee | お金を支払う対象となるサービス |
| 支払関係 | PaymentRelation | 支払先と支払元の紐づけ |
4. エンティティ候補
ドメインの中心となる概念。
【例】
- Account
- Service
- TransferRelation
- TransferSchedule
5. 不変条件(Invariant)
絶対に破ってはいけないルール。
【例】
- 振替関係は必ず1つの口座を持つ
- 振替関係は必ず1つのサービスを持つ
- 振替日は1〜31
- 同じ口座 + サービスの振替関係は1つだけ
6. 状態遷移
状態を持つエンティティについて整理する。
【例】TransferRelation
状態
【例】
- Created
- Active
- Stopped
- Deleted
状態遷移
【例】
Created → Active
Active → Stopped
Stopped → Active
Active → Deleted
7. 集約設計
集約一覧
【例】
- TransferRelation
- Account
集約詳細
【例】TransferRelation
属性
【例】
- accountId
- serviceId
- paymentDay
- status
不変条件
【例】
- 振替日は1〜31
- 同じ口座 + サービスの振替関係は1つだけ
ドメインメソッド
【例】
- changePaymentDay()
- stop()
- resume()
8. ドメインサービス
エンティティに属さないドメインロジック。
サービス一覧
【例】
- TransferService
サービス詳細
【例】TransferService
- 責務
- 【例】
- 口座Aから口座Bへの送金
- メソッド
- 【例】
transfer(fromAccount, toAccount, amount)
9. リポジトリ
集約の永続化を担当。
【例】
- AccountRepository
- TransferRelationRepository
10. ユースケース設計
UseCase一覧
【例】
- CreateTransferRelationUseCase
- StopTransferRelationUseCase
UseCase詳細
【例】CreateTransferRelationUseCase
処理
【例】
- 振替関係の作成
- account取得
- service取得
- TransferRelation生成
- 保存