Androidアーキテクチャ ベストプラクティス

2017/06/20

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クラスを定義する。
  • domain

    • model - Dataソースに関するクラス。
      • EntityやJava Objectのデータを保持するクラスを定義する。
    • repository
      • 内部DBに関するCRUDクラス。
    • service
      • 内部DBとViewModelの中継とするビジネスロジックを持つクラスを定義する。
  • 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のパッケージアーキテクチャ

同上。