この章では、Android アプリに DDD の考え方を真面目に適用しようとしたときに、構造上起こりやすい失敗例を取り上げる。

いずれも「考え方としては間違っていない」からこそ起きるものであり、設計を真剣に考えた結果として現れる。


Clean Architecture をそのまま持ち込んだ例

何が起きたか

Web や書籍で学んだ Clean Architecture を、そのまま Android アプリに適用したプロジェクトでは、

  • presentation / domain / data が厳密に分離され
  • すべての依存は内側に向き
  • あらゆる処理が UseCase を経由する

という構造が作られた。

構造としては美しく、レビューでも「設計は正しい」と評価されていた。しかし、実装が進むにつれて次のような問題が顕在化した。

  • ちょっとした画面修正でも複数レイヤーに修正が必要
  • UI 変更のたびに Domain 側の調整が発生
  • 実装コストが高く、改善のスピードが落ちる

なぜ失敗したのか

Clean Architecture 自体が悪いのではない。問題は、Android アプリの特性を考慮せずに、そのまま当てはめたことにある。

Android アプリでは、

  • UI の変更頻度が高い
  • 画面単位のロジックが多い
  • 永続的な業務ルールが存在しないケースも多い

にもかかわらず、すべてを「安定した Domain がある前提」で設計してしまったことで、構造が過剰になった。

何を学ぶべきか

  • Clean Architecture は 思想であって、実装テンプレートではない
  • Android では「守りたい業務ルールがあるか」を先に見極める

UseCase が 100 個を超えたプロジェクト

何が起きたか

DDD を意識して「1 ユースケース = 1 クラス」を徹底した結果、UseCase クラスが 100 個を超えたプロジェクトがあった。

  • 画面ごとに UseCase
  • ボタン操作ごとに UseCase
  • 初期表示・更新・削除で別 UseCase

結果として、

  • パッケージを見ても全体像が分からない
  • 似たような UseCase が大量に存在する
  • 新しい実装時にどこに追加すべきか迷う

という状態に陥った。

なぜ失敗したのか

UseCase を「処理の単位」ではなく「クラスを作るルール」として扱ってしまったことが原因である。

本来 UseCase は、

  • アプリケーションとして意味のある操作
  • 業務的な判断を伴う処理

を表現するための概念だ。単なる CRUD や画面操作まで UseCase 化したことで、構造がノイズに埋もれてしまった。

何を学ぶべきか

  • UseCase は 増やすものではなく、選ぶもの
  • 「これは本当に業務的な判断か?」を問い続ける

ドメイン層が util 層になった話

何が起きたか

Domain 層を Android 非依存に保とうとした結果、

  • フォーマット変換
  • バリデーション
  • 並び替えロジック

といった処理がすべて Domain に集約された。

一見すると Domain は純粋でテストもしやすい。しかし実態は、

  • どの処理が業務ルールなのか分からない
  • 画面都合のロジックも Domain に存在する

という 巨大な util 層 になっていた。

なぜ失敗したのか

「Android に依存していない = Domain」という短絡的な判断が原因である。

Domain 層は、

  • 業務上の意味
  • ルール
  • 制約

を表現する場所であって、「置き場所に困ったロジック置き場」ではない。

何を学ぶべきか

  • Domain に置く基準は 技術ではなく意味
  • 業務的な意味を説明できない処理は、Domain 以外に置く

テストしやすいはずが、誰もテストを書かない構造

何が起きたか

DI と DDD を導入し、

  • 依存はすべて interface 経由
  • Domain は純 Kotlin
  • モックも簡単

という「テストしやすい構造」が完成した。

しかし現実には、

  • テストコードはほとんど書かれない
  • 書かれてもメンテされない

という状態だった。

なぜ失敗したのか

構造としてテスト可能であることと、テストを書く動機があることは別であるためだ。

  • UseCase が細かすぎてテストの価値が低い
  • テストを書いても仕様変更ですぐ壊れる
  • 何を守るテストなのか分からない

こうした状況では、誰もテストを書き続けられない。

何を学ぶべきか

  • テストしやすさは 目的ではなく手段
  • 「何を守りたいのか」を先に決めないと、テストは定着しない

本章で紹介した失敗例は、どれも「設計を良くしよう」とした結果として起きている。だからこそ重要なのは、

  • 型や構造を整えることよりも
  • 判断基準を共有すること

である。