Domain レイヤーかどうかを判断する基準

―「ユーザーが意識するか?」という視点―

設計をしていると、次のような悩みにぶつかることがあります。

  • この処理は Domain レイヤーに置くべきか?
  • UseCase なのか、それとも Data レイヤーの責務なのか?
  • そもそも Domain って何を置く場所なのか?

とくに Clean Architecture や DDD を学び始めた頃は、 「正解の置き場所」を探そうとして、かえって混乱しがちです。

この記事では、私が設計を考える際に ひとつの判断基準 として使っている考え方を紹介します。


Domain レイヤーとは何か(簡単に)

Domain レイヤーは、ざっくり言うと

  • アプリが扱う 概念
  • その概念に関する ルール
  • 「それは正しいかどうか」の判断

を表す層です。

技術的な詳細(DB、API、ライブラリなど)からは距離を置き、 アプリの意味そのもの を表現する場所だと考えています。


判断基準:ユーザーがそれを意識するか?

私が Domain レイヤーかどうかを判断する際に使っている基準は、次の問いです。

「ユーザーは、その機能や概念を意識してアプリを操作するか?」

この問いに YES なら、 その概念や処理は Domain レイヤー(または UseCase)に属する可能性が高いです。

NO なら、 それは Data レイヤーや Infrastructure に閉じ込めるべきものだと考えます。


例1:保存処理は Domain か?

ケースA:保存先をユーザーが意識しない場合

  • ユーザーは「保存」ボタンを押すだけ
  • データがどこに保存されるかは気にしない
  • ローカルかクラウドかはアプリ側の都合

この場合、ユーザーが意識しているのは 「保存する」ことだけ です。

  • Domain が知るのは「保存する」という意味
  • 「どこに保存するか」は Data レイヤーの責務

Domain に

  • SQLite
  • Room
  • Firebase

といった言葉が出てくる必要はありません。


ケースB:保存先をユーザーが意識的に選択する場合

ユーザーが 「ローカルに保存」 or 「クラウドに保存」 を明示的に選ぶ場合、「保存先」はユーザーにとって 操作上の意味を持つ概念 です。

ここで重要なのは、

  • Domain が知るべきなのは 技術名 ではない
  • Domain が知るべきなのは 選択肢が存在するという事実

という点です。

Domain では、

  • 「ローカル」
  • 「クラウド」

といった 概念 を扱い、 それをどう実装するかは Data レイヤーに任せます。


「ユーザーが意識する」という基準の使いどころ

この基準が役立つのは、次のような迷いどころです。

  • フィルタ条件は Domain か?
  • 並び順は Domain か?
  • キャッシュ戦略は Domain か?
  • List か Map かはどこで決めるのか?

その都度、

ユーザーはこれを意識して操作しているか?

と自分に問いかけると、 レイヤーの境界がかなりクリアになります。


UseCase との関係

UseCase は、

  • ユーザーの操作
  • ユーザーの意図
  • Domain の概念を使った一連の流れ

を表す層です。

そのため、

  • ユーザーが意識する操作
  • ユーザーが選択する条件
  • ユーザーの行動単位

は、UseCase に置かれることが多くなります。

Domain が「名詞」だとすると、 UseCase は「動詞」に近い存在です。


注意点:すべてを Domain に入れない

「ユーザーが意識するか」という基準は便利ですが、 すべてを Domain に押し込むためのものではありません。

  • パフォーマンス最適化
  • キャッシュの仕方
  • 再試行ロジック
  • 通信方法

これらは、たとえユーザーに見えていたとしても 意味ではなく実装の問題 であることがほとんどです。

ここは冷静に切り分ける必要があります。


迷ったときの最終チェック

最後に、私がよく使うチェックを紹介します。

この概念は、ユーザー向けの説明書に書くだろうか?

  • 書く → Domain / UseCase 側
  • 書かない → Data / Infrastructure 側

この問いを挟むだけで、 「なんとなく」でレイヤーを決めることが減りました。


おわりに

Domain レイヤーの判断は、 ルール暗記よりも 視点 の問題だと感じています。

「ユーザーが意識するか?」

この問いを持って設計すると、 ViewModel や Repository の責務も自然と整理されていきます。