ドメインとは「業務ロジック」のことではない
「ドメインとは何ですか?」と聞かれたとき、多くの人は次のように答えます。
- 業務ロジックのこと
- ビジネスルールのこと
これらは、完全に間違いではありません。しかし、この理解のまま設計を進めると、ほぼ確実にドメインは壊れていきます。
なぜなら、「業務ロジック」という言葉はあまりにも広く、そして曖昧だからです。画面遷移の条件も業務ロジックですし、APIを呼ぶタイミングも業務ロジックと言えてしまいます。その結果、「どこまでがドメインなのか」が誰にも説明できなくなります。
本書では、ドメインをもう少し狭く、そして厳密に扱います。
ドメインとは、そのシステムが守るべき判断とルールの集合です。
なぜ「判断」が重要なのか
システムが存在する理由は、計算をすることでも、画面を表示することでもありません。多くの場合、システムは「判断」をするために存在しています。
- この注文は成立してよいか
- この支払いは受け付けてよいか
- この状態で次の操作に進んでよいか
これらはすべて判断です。そして、この判断には必ずルールがあります。もしルールがなければ、判断はできません。
DDDが注目するのは、この「判断」と「ルール」がどこに書かれているのか、そしてそれが守られているのか、という点です。
もし判断のロジックが、
- UseCaseのあちこちに散らばっていたり
- UI層に紛れ込んでいたり
- 仕様書の文章にしか存在していなかったり
する場合、そのシステムは非常に壊れやすい状態にあります。
ドメインは「処理の流れ」を知らない
ドメインを設計するとき、多くの人が最初につまずくポイントがあります。それは、「ドメインは何を知っていて、何を知らなくてよいのか」という問題です。
結論から言うと、ドメインは処理の流れを知る必要はありません。
- どの画面から呼ばれたのか
- API経由なのか、バッチなのか
- 同期処理なのか、非同期処理なのか
こうした情報は、ドメインにとって本質的ではありません。ドメインが知るべきなのは、「この状態で、この操作は許されるか」という一点だけです。
この切り分けができていないと、ドメインモデルはすぐに肥大化し、テストも困難になります。
ドメインとUseCaseの違い
DDDを学び始めると、ドメインとUseCaseの役割の違いが分からなくなることがあります。両方とも「業務の中心」を扱っているように見えるからです。
しかし、両者の責務は明確に異なります。
- ドメイン:判断とルールを守る
- UseCase:処理の流れを組み立てる
UseCaseは、「何を」「どの順番で」行うかを知っています。一方で、ドメインは「それをしてよいかどうか」だけを知っています。
もしUseCaseの中に大量のif文が現れ始めたら、それはドメインが本来持つべき判断をUseCaseが肩代わりしているサインです。
ドメインは中心に置かれるが、万能ではない
DDDでは、「ドメインを中心に置く」という表現がよく使われます。この言葉は非常に強く、誤解を招きやすい表現でもあります。
ドメインを中心に置くとは、
- すべての処理をドメインに書くこと
- すべてのクラスをドメインから呼ぶこと
ではありません。
中心に置くとは、「設計上の判断基準をドメインに寄せる」という意味です。このルールはドメインにあるべきか、それともUseCaseやUIにあってよいのか。その判断を常に意識することが重要です。
ドメインを見失った設計の末路
ドメインが曖昧なまま設計されたシステムでは、次のような現象が起こります。
- 似たようなチェック処理があちこちに増える
- 仕様変更のたびに複数箇所を直す必要がある
- 「なぜこの条件があるのか」を誰も説明できない
これは、コードの問題というより、「考え方の問題」です。
DDDは、これらの問題を一気に解決する魔法ではありません。しかし、「どこにルールを書くべきか」という判断軸を与えてくれます。それだけでも、設計の寿命は大きく変わります。
次章では、ドメインをコードとして表現するための最初の道具である「モデル」について掘り下げていきます。