Android Architect
0 Comments
1. 目的
Androidにおけるアーキテクチャについて調べてみる
2. 前提
完璧なアーキテクチャが無い
3. Androidにおける設計の難しさ
- LifeCycle管理面倒
- 画面生成・再生性・回転
- 数多く存在するAPI
- OSごとのバージョン管理
- UI・Unitテスト難しい
- Activity・Fragmentの肥大化が半端ない
- 改修・新規機能追加する時にとても不安
- 一画面だけ変更したいのに他のところもたくさん変更しなくちゃ
4. MVC Architecture:Model-View-Controller
3つの部分から構成されている
Model
- data, logic, rule
- ビジネスロジック等の処理も持つ
Controller
- フローコントロール
- ユーザーからの入力を受取、ModelとViewへの命令に変換する処理を持つ
View
- Modelからデータを取り出し、UIへの出力担当
問題点
- Modelの値に対応するViewの更新ができない。必ずController通さないと行けない。
- MVCのModelにはデザインの状態を保持する 場所が無い
- 例:在庫が無くなっても、非表示できない。
- ModelとController間のインタラクションがシステム状態に影響を受ける/テストしにくい
- Modelのデータ・ソースが多様
- 各層の依存関係が強い
アプリだけで考えると:
- ViewがActivity。状態を保存する必要がある
- ControllerもActivityにある → Viewと混在している
5. MVP Architecture:Model-View-Presenter
Model
- MVCと同じ
- data, logic, rule
- ビジネスロジック等の処理も持つ
View
- Viewはなるべく簡潔なものとし、Presenterにて操作を行う
Presenter
- Viewへの参照を持ち、Modelが変更されたらViewを更新する
MVP with Passive View
- ModelとViewが完全に分離され、Presenterがその仲介役を果たす
- 処理の流れ:
- ViewがUserからアクションを取得
- Presenterへアクションを伝達
- Modelでデータの処理をし、Presenterに送信する
- Viewを更新し、Userに表示する
問題点
Presenterが膨らむ
MVP with Supervising Controller
監視役のコントローラー
- ViewがModelのデータに基づくUI
- Viewが常にModelを監視し、データ変更があれば反映する
- Modelのデータ更新処理はViewから直接Modelに行くのではなく、Presenter 経由で行う
問題点
ViewとModelの関係性の密着度が高い
→ ViewのデザインによりModelがどんどん大きくなる可能性がある
6. MVVM Architecture:Model-View-ViewModel
6.1 MVCとMVP双方見る感じなアーキテクチャ
- ViewとModelの間に 入るViewModel というものが新しく追加される
- データバインディングを行う
- MVPの監視コントローラーより 高いレベルで
- UIが操作されるとデータ側も書き換えるような仕組み
- Modelの方のデータが 更新されるとUIの方も更新される
- 非同期処理が優秀(RxJavaによる)
6.2 MVVMをアプリレベルで具体的に砕いてみる
Model(Data Provider)
- Retrofit
- SharePreferences
- Broadcasts(通知サービス)
View(Activity, Fragment, CustomView, Layout-xml)
- UI・Widgetをコントロール
- Dialog, Toast, Snackbars
- Event Listeners
- Activityコントロール
- Menuハンドリング
- Permissionsハンドリング
- ActivityContextが必要な処理
- etc
ViewModel(ロジックの処理、ステート)
- ステート処理(エラー、プログラス、オフライン、オンライン、空…)
- データを公開して、Viewを更新する
- 表示・非表示
- Validation
- Argrument
- Modelからのデータ更新の呼びに反応
- UIからの命令に答える
- etc
7. Clean Architecture
- Architecting Android…The clean way?
- https://github.com/android10/Android-CleanArchitecture
- AndroidオールスターズでClean Architectureについて発表してきた&参考リンク集 – tomoima525’s blog
7.1 アーキテクチャのイメージ
7.2 基本な考え方
MVCでのアプリ開発の問題点を一個ずつ潰していく感じ
- UIがビジネスロジックから分離される
- ビジネスロジックがAndroidのライフサイクルから分離され、テストし易い
- Modelの仕様変更に柔軟
- モジュールの置き換えが容易
7.3 ViewとControllerがActivityに存在
MVPアーキテクチャで解決
7.4 ModelとController間のインタラクションがシステム状態に影響を受ける/テストしにくい
DomainLayerで解決
- ビジネスロジックを集約(UseCasesやInteractorと呼ぶ)
- Modelとの処理はDomain経由で行う
- 処理は非同期で実行
イメージ
- UseCase, Threadにより成立
- UseCaseはベースとなるスレッド処理実装
- ConcreteUseCase
- UseCaseを継承し、ロジック処理の実行・Presenterへコールバック
- UIThreadで結果反映
7.5 Modelのデータ・ソースが多様
DataLayer(RepositoryPattern)で解決
- データをEntityとして扱う
- DomainLayerで必要なDataSourceを集約するRepositoryクラス
7.6 各層の依存関係が強い
Dependency Inversion Principle
- 依存関係逆転の原則
- 上位のModuleは下位のModuleに依存しない
- Interfaceを各層の間に置く
8. 参考記事
- まだMVC,MVP,MVVMで消耗してるの? iOS Clean Architectureについて – Qiita
- 「MVCの勘違い」について、もう一度考えてみる – 圧倒亭グランパのブログ
- やはりお前らのMVCは間違っている – SlideShare
- Android data bindingを使ってMVVMなアプリを書く – Qiita
- Android Architecture Patterns Part 3: Model-View-ViewModel
- Architecting Android…The clean way?
- https://github.com/android10/Android-CleanArchitecture
- AndroidオールスターズでClean Architectureについて発表してきた&参考リンク集 – tomoima525’s blog