Dagger + MVVM + TDD で作る Android App
hr.icon
MVVM = Model + View + ViewModel
なぜMVVMで作るか
Viewからロジックを切り離しやすい -> ユニットテストを書きやすい
Google公式が推奨?
View
Activity, Fragmentなどが該当
ViewModel
UIの状態を保持する役割
ログインの可否、ログイン中のユーザ名など
DataBinding機構を通じてViewとの間でデータを受け渡しする
Model
ビジネスロジックとデータ管理を受け持つ
データベースへのアクセスやサーバとの通信など
Repositoryが該当
依存関係
View -依存-> ViewModel -依存-> Model
ViewModelはViewのことを知らず、ModelはViewModelのことを知らない
hr.icon
Dagger
DIコンテナフレームワーク
Dependency Injection = 依存性の注入とは
使用するオブジェクトに使用されるオブジェクトを外部から渡す
ViewにViewModelを外部から渡す
ViewModelにModelを外部から渡す
DIすると何が嬉しいか
ユニットテストを書くときに、依存するオブジェクトの実装を気にしないでよくなる
依存するオブジェクトのinterfaceを作成するか、mockライブラリを使用する方法がある
なぜDaggerが必要か
Activity, Fragment に引数ありの constructor が無く、コンストラクタインジェクションが使いにくいため
UIKitを使って実装したiOSアプリでは上記のような制約がなく、DIコンテナフレームワークを使用しないでもTDDのやりやすさにあまり影響は無い
hr.icon
Daggerの構成要素
Module
複数のオブジェクトグラフをまとめたもの
オブジェクトグラフ = 「key が型で map がその型を取得する方法」であるMap
Component
Moduleで定義したオブジェクトグラフを使って指定された型のインスタンスを取得する役割
buildするとDaggerAppComponent.javaが生成される