このドキュメントは、DDD(ドメイン駆動設計)に基づいて、ソフトウェアを設計するためのテンプレートです。

上から順番にテンプレートを埋めていくことで、 DDD に基づいたドメイン周りの設計がスムーズに行えるように作っています。


1. システム概要

システムの目的

このシステムは何を解決するものか。

【例】

  • フリーランスの固定費を管理する
  • 口座振替の関係を可視化する

対象ユーザー

このシステムのユーザー。

【例】

  • 個人
  • フリーランス
  • 企業

解決したい課題

【例】

  • 固定費の支払い関係が分かりにくい
  • 口座振替の全体構造を把握できない

2. ユースケース

ユーザーがシステムで行う操作を列挙する。

ユースケース一覧

【例】

  • ○○を作成する
  • ○○を変更する
  • ○○を削除する
  • ○○を確認する

ユースケース詳細


【例】振替関係を作成する

入力

【例】

  • accountId
  • serviceId
  • paymentDay

処理概要

【例】

  1. 口座を取得
  2. サービスを取得
  3. 振替関係を作成
  4. 保存

出力

【例】

  • 振替関係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

処理

【例】

  1. 振替関係の作成
    1. account取得
    2. service取得
    3. TransferRelation生成
    4. 保存