ざっくり一言で

  • ドメイン (Domain)解こうとしている「問題そのもの・業務の世界」

  • モデル (Model)そのドメインを理解・表現するために人間が作った「写像(抽象化)」


もう少し噛み砕くと

ドメインとは何か

ドメインは コードでではありません

  • 業務ルール
  • 制約
  • 用語
  • 価値判断
  • 現実世界で「そうなっている理由」

たとえば口座振替アプリなら:

  • 「引き落とし元口座は必ず1つ存在する」
  • 「同じ支払先に対して複数の引き落とし元は持てない」
  • 「金額は0円以上でなければならない」

これ全部 ドメイン。まだコードの話は何も出てきてません。


モデルとは何か

モデルは、そのドメインを扱うために作る表現です。

  • Entity
  • Value Object
  • Aggregate
  • ドメインサービス
  • それらの関係性

例:

data class DirectDebit(
    val sourceAccountId: AccountId,
    val destination: Destination,
    val amount: Money
)

これは「口座振替」という現実の概念を、プログラムで扱える形に落としたもの

これが ドメインモデル


よくある誤解ポイント

「ドメイン = ドメインモデル」

これは 半分正しくて半分間違い

  • ドメイン → 現実世界・業務世界そのもの
  • ドメインモデル → それを 近似 したもの

モデルはあくまで「モデル」なので:

  • 省略しているものがある
  • 嘘(近似)が含まれる
  • ユースケースや文脈ごとに違う形になり得る

Evans 本の有名な一文

The model is not the domain.

モデルはドメインそのものではない。 ドメインを理解するための道具にすぎない。

これを忘れると

  • 「このクラス設計がドメインだ」
  • 「コードが現実を支配し始める」
  • 設計変更=世界観の崩壊、になる

モデルに種類があるのはなぜか

  • ドメインは 画面遷移やUIとは無関係
  • モデルは 永続化や通信形式とも本来は無関係
  • UI都合でモデルを歪めると → ドメイン理解が壊れる

だから、

  • DB Entity
  • API DTO
  • Domain Model

を分ける意味が出てきます。

全部「モデル」だけど、見ているドメインの切り取り方が違う


まとめ

  • ドメイン → 「この世界では何が正しいか」
  • モデル → 「それを扱うための表現」
  • ドメインモデル → ドメイン理解をコードに落とした近似図

そして一番大事なのは:

モデルは育て直せる。でもドメインを見失ったら終わり