- Android における Entity の寿命は短い
- Android で言われる Entity の多くは UI Model である
- data class を恐れない
- Immutable にこだわりすぎない
- sealed class / value object の使いどころ
- UI Model と Domain Model を分ける意味・分けない意味
- Model 変換はドメインの責務ではない
- この章のまとめ
Android における Entity の寿命は短い
DDD で語られる Entity は、長い時間を生き続け、同一性を保ち続ける存在として説明されます。しかし Android アプリでは、この前提がそのまま当てはまることは多くありません。
- 画面仕様の変更で形がすぐに変わる
- API 仕様変更の影響を強く受ける
- UI の都合で一時的な形に変換される
このような環境では、Entity を「長寿命で不変な存在」として扱おうとすると、設計が無理をし始めます。
本書では、Android における Entity を 「ID による同一性を持つが、形は変わりやすい存在」 と捉えます。寿命が短いことを前提にすることで、過剰な抽象化を避けられます。
Android で言われる Entity の多くは UI Model である
Android 開発では、データベースのテーブルや API レスポンスを 「Entity」と呼ぶことがよくあります。
これらは id を持っており、一見すると DDD における Entity のように見えます。 しかし実際には、DDD が想定する Entity とは異なる役割を担っていることがほとんどです。
Android で扱われるこれらのモデルは、
- 画面の表示単位で生成される
- UI の都合で形が頻繁に変わる
- 状態を値として扱われる
といった性質を持ちます。
ここで使われる id の多くは、
- RecyclerView や Jetpack Compose の key
- 差分更新のための識別子
であり、時間をまたいだ同一性を保証するためのものではありません。
つまり、
id を持っているからといって、 それが Domain Entity であるとは限らない、ということです。
data class を恐れない
前節で述べたように、Android で「Entity」と呼ばれているものの多くは、 実際には UI Model や DTO に近い存在です。
この文脈において、Entity や Model を data class で表現することは、 DDD 的に見て必ずしも問題ではありません。
Immutable にこだわりすぎない
不変オブジェクト(Immutable)は、安全でテストしやすい設計として推奨されがちです。しかし Android では、Immutable にこだわりすぎることで、次のような弊害が出ることがあります。
- copy の連鎖で意図が見えにくくなる
- 状態更新の責務が分散する
- パフォーマンスを過剰に気にする設計になる
重要なのは「不変であること」そのものではなく、どこで、誰が状態を変えてよいのかが明確であることです。
限定された範囲での Mutable な設計は、必ずしも悪ではありません。
sealed class / value object の使いどころ
Android では、sealed class や value object が非常に相性よく使えます。ただし、使いどころを間違えると、逆に複雑さを生みます。
- 状態の種類が明確で、分岐を網羅したい場合 → sealed class
- 単位や意味を値に持たせたい場合 → value object
すべてを sealed class にすれば安全、というわけではありません。状態の増減が激しい場合や、UI 専用の一時状態であれば、シンプルな enum や nullable で十分なこともあります。
UI Model と Domain Model を分ける意味・分けない意味
「UI Model と Domain Model は必ず分けるべきか」という問いには、明確な Yes / No はありません。
分ける価値があるのは、
- 同じドメインを複数の画面で異なる形で使う
- UI の都合で形が頻繁に変わる
- Domain の判断を UI から隔離したい
といった場合です。
一方で、単一画面専用のシンプルなモデルであれば、無理に分けることで変換コードだけが増えることもあります。
本書では、「分けるかどうか」ではなく、なぜ分ける(分けない)のかを説明できるか を重視します。
Model 変換はドメインの責務ではない
Domain Model から UI Model への変換を、ドメイン層に置いてしまうケースがあります。しかし、これは責務の混同を招きやすい設計です。
UI 表現のための変換は、あくまで UI 側の都合です。ドメインは「どう見せるか」を知る必要はありません。
変換処理は、ViewModel や専用の Mapper に置くことで、ドメインの純度を保ちやすくなります。
この章のまとめ
Android におけるエンティティやモデル設計では、
- 厳密さよりも変更耐性を重視する
- data class や mutable を過度に恐れない
- 分離は目的ではなく手段である
という姿勢が重要になります。
次章では、これらのモデルが Jetpack Compose の状態管理とどう接続されるのか を見ていきます。