なぜクリーンアーキテクチャはドメインを守るのか

クリーンアーキテクチャはドメインを守っているが、その本質は「判断」を守ることである

はじめに

「クリーンアーキテクチャでは、ドメインを守ることが重要だ」

この説明を、これまで何度も目にしてきましたし、自分でも何となく理解しているつもりでした。

  • UI から独立させるため
  • フレームワークに依存させないため
  • テストしやすくするため

どれも間違ってはいません。

ただ、実務で設計に向き合えば向き合うほど、

それで結局、何が一番大事なのか?

という疑問が残りました。

最近、その答えが少しはっきりしてきました。

クリーンアーキテクチャの本質は、

「判断をどこに閉じ込めるか?」を決める構造である

という考え方です。

  • どの判断は UI に任せてよいのか
  • どの判断はユースケースで行うべきか
  • どの判断は、絶対に外に漏らしてはいけないのか

この「判断の置き場所」を曖昧にしたまま設計すると、

  • 責務が混ざり
  • 修正のたびに迷いが生まれ
  • 変更に弱い構造

になっていきます。

では、

絶対に外に出してはいけない判断とは何なのか?

その答えを整理するための言葉が、不変条件 でした。

(不変条件という言葉は、英語では invariant という言葉でよく使用されます)

この記事では、

  • クリーンアーキテクチャを「判断の置き場所」という視点で捉え直し
  • その中で不変条件がどんな役割を持つのか
  • なぜ不変条件をドメインに閉じ込めるのか

を、実務の感覚に近い形で説明します。


不変条件とは何か

不変条件とは、

どれだけ仕様や実装が変わっても、絶対に破ってはいけない前提

です。

UI が変わっても API が変わっても DB が変わっても

これが壊れたら、そのシステムは成立しない

そういう条件を指します。

  • ログインしていないユーザーは、保護された操作をできない
  • 残高は常に 0 以上である
  • 同じ支払いは二重に確定しない

これらは

  • 画面の都合でも
  • 通信の都合でもなく

ビジネスやドメインとして「そうでなければならない」条件 です。


不変条件は「判断」そのものである

不変条件を別の言い方で表すと、こう言えます。

不変条件 = 揺れてはいけない判断

開発では、常に判断が発生します。

  • どこでチェックするか
  • どの層に責務を持たせるか
  • どこまでを UI に任せるか

その中には

  • 仕様変更で変わってよい判断
  • 絶対に変えてはいけない判断

が混ざっています。

この 変えてはいけない判断 を明確に言語化したものが、不変条件です。


不変条件が曖昧だと、設計は壊れる

不変条件が定義されていないと、次のようなことが起きます。

  • ある画面ではチェックしているが、別の画面では忘れている
  • API 側では弾いているが、ローカルでは通ってしまう
  • バグが出るたびに「どこで直すか」を毎回悩む

これは技術力の問題ではありません。

判断を置く場所が決まっていない ことが原因です。

結果として、

  • 責務が混ざる
  • 修正が各所に散在する
  • 変更に弱い構造になる

という状態に陥ります。


不変条件をドメインに閉じ込める、という判断

ここで、クリーンアーキテクチャの話に戻ります。

クリーンアーキテクチャが「ドメインを守る」理由は、

不変条件を、最も外部影響の少ない場所に閉じ込めたい

からです。

なぜドメインなのか

ドメイン層は、

  • UI を知らない
  • フレームワークを知らない
  • 通信や保存方法を知らない

つまり、

最も変わりにくい層 です。

そこに、

  • 残高チェック
  • 状態遷移の正当性
  • ビジネスルール

といった 不変条件を集約する

これは

この判断は、ここでしか行わない

と決める行為そのものです。


「ドメインを守る」とは、何を守っているのか

よくある説明では、

  • ドメインを UI から守る
  • ドメインをフレームワークから守る

と言われます。

しかし、本質は少し違います。

守っているのは、ドメインではなく「判断」 です。

  • ここで必ずチェックする
  • ここで必ず保証する
  • ここでは絶対に例外を許さない

という判断を、

  • 仕様変更
  • 実装都合
  • 短期的な修正

から守っている。

それが結果として「ドメインを守っている」ように見えるだけです。


UI やインフラに不変条件を置くと何が起きるか

不変条件を

  • UI
  • ViewModel
  • Controller

に置くと、どうなるでしょうか。

  • 画面が増えるたびに同じ判断が必要になる
  • 実装漏れが起きる
  • 「この画面だけ例外」が増える

不変条件は、本来

考えなくていいようにするためのもの

なのに、

毎回考え直す対象 になってしまいます。


まとめ

  • 不変条件とは、揺れてはいけない判断である
  • 設計とは、判断を置く場所を決める行為である
  • クリーンアーキテクチャは、不変条件をドメインに閉じ込めるための構造である
  • 「ドメインを守る」とは、「判断を守る」ことに他ならない

クリーンアーキテクチャを

  • 難しいもの
  • 大げさなもの

と感じている場合、

一度 不変条件という言葉 で捉え直してみてください。

「なぜここにロジックを置くのか」 「なぜここに依存させないのか」

その理由が、かなりクリアになるはずです。


この記事が、

  • 設計に違和感を感じている人
  • クリーンアーキテクチャにモヤっとしている人

の視点整理の助けになれば嬉しいです。


おすすめの関連書籍(無料)

この記事で触れた

  • 判断をどこに置くか
  • 不変条件をどう扱うか
  • 構造で設計を考えるとはどういうことか

といったテーマについて、より体系的にまとめた本があります。

『ソフトウェア開発における設計の本質』 https://zenn.dev/okuda0715tech/books/d5b48f9e2221d7

無料で公開しているので、もしこの記事の内容に共感いただけたら、あわせて読んでみてください。