Androidアーキテクチャ ベストプラクティス
Androidアプリケーションのアーキテクチャ ベストプラクティスについて記述する。
柔軟に機能の追加や修正をしたい
開発者がどういうアーキテクチャだとチームにジョインしやすいのか等を踏まえて考えてみる。
デザインアーキテクチャには正解はないことを前提とする。したがって、以下に述べることは、「これがデザインアーキテクチャ> の正解です」ということではないため注意してください。
MVVMアーキテクチャを採用
クラスの責務をわかりやすく定義できること・テストを書きやすいこと・Reactiveを意識することで、MVVMアーキテクチャを採用する。
また、Android標準でサポートされているData bindingの相性も良い。
- Model - ModelはDataをメモリ上に持つオブジェクト概念。データベースのEntityやJava Objectのセッターゲッターを持つクラス。
- View - ViewはUIに関する定義。ActivityやFragmentのクラス。
- ViewModel - ViewModelは、ViewとModelの中間の役割を持ち、Viewのアウトプットするビジネスロジックの責務とするクラス。
パッケージアーキテクチャ
以下構成図。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26├── di
│ ├── component
│ └── module
│
├── domain
│ ├── model
│ ├── service
│ ├── event
│ └── repository
│
├── event
│
├── exception
│
├── network
│
├── infra
│
├── presentaion
│ ├── activity
│ ├── adapter
│ ├── fragment
│ ├── ui
│ └── viewmodel
│
├── Application
di
- component - di componentクラス。
- dagger等の@Componentクラスを定義する。
- module - di moduleクラス。
- dagger等の@Moduleクラスを定義する。
- component - di componentクラス。
domain
- model - Dataソースに関するクラス。
- EntityやJava Objectのデータを保持するクラスを定義する。
- repository
- 内部DBに関するCRUDクラス。
- service
- 内部DBとViewModelの中継とするビジネスロジックを持つクラスを定義する。
- model - Dataソースに関するクラス。
exception
- 自前実装の例外クラスを定義する。
network
- HttpClientによるAPIアクセスに関するクラスを定義する。
infra
- Android OSファイルシステムに関するクラスを定義する。
presentation
- activity - Activityクラス。
- adapter - Adapterクラス。
- fragment - Fragmentクラス。
- ui - UIのカスタムコンポーネントクラス。
- ProgressDialog等の自前カスタムクラスを定義する。
- viewmodel - ViewModelクラス。
diについて
daggerによるDependency Injectionするパッケージ。
- Module - @Provideや@Module等のアノテーションを利用して、Injectするインスタンスを定義する。
- Component - @Componentアノテーションを利用して、Injectするインスタンスを定義する。
domainについて
※ 命名は、dataでも良いような気がする。
domainパッケージは、repositoryパッケージ等のDataソースへのアクセスすることのできるロジッククラスを持つ。
なので、内部Dataソースへアクセスするためには、domainパッケージのInjectが必要となる。
exceptionについて
もし、自前で実装した例外クラスがあった場合に、このパッケージに定義する。
利用しているパッケージで定義しても良いかとは思ったが、exceptionでまとめられているほうが管理がしやすいと思ったため、作成したパッケージ。
networkについて
networkはAPIへのクライアントクラス。
利用するのは、ViewModel等が考えられるので、ViewModelでInjectされることが想定される。
infraについて
Android OS内部のファイルシステムやProviderクラスを実装するときに利用する。
アラートマネージャーや内部ストレージアクセスするクラスを定義する。
presentationについて
ViewやViewModelを保持して、UI構成を作るパッケージ。
AndroidTest・UnitTestのパッケージアーキテクチャ
同上。