なぜAndroidアプリをMVVMでつくるといいのか
モチベーション
- Androidでは画面のパーツは全部のオブジェクトへの参照を持つのでリークさせたくない
- MVCとかMVPはCやPがVへの参照を持つので、とくにAndroidでは管理をきっちりやらなければならない
- その一方で、ActivityやFragmentのライフサイクルが複雑なので管理をきっちりやるのは難しい
- MVVMではVMはVへの参照を持たないので、MVCとかMVPとかよりは漏れにくいはず
- そういう理由からAndroidアプリの開発にフィットしそうな設計ということで、公式から便利なライブラリがいろいろ出ているのでその恩恵を受けられる
- MV-WhateverはMとVの関心ごとをいかに分離するかという話なのでRepositoryとかUseCaseとかとはまた別のはなしです
実装のはなし
- MからVに向かってデータを伝えるにはObserver-Observableパターンを使う
- ViewModelにObservableな変数を持たせてView側から観測する
- ObservableFieldとかでもいいけどLiveDataを使うと画面が見えていないときはViewの更新が起きないようになっているので便利
- ObservableIntとかObservableFloatは実際の値をJavaのプリミティブ型に保持しているので自動的にNonNullだしオブジェクトが作られないのでAnimatorの値を渡してもいいかもしれない
- AndroidにはDataBindingの仕組みがありViewとLiveData(とかObaservableXxx)とを結びつけるコードを自動生成してくれる
- DataBindingを使わずにMVVMをやろうとするのは大変つらいと思われるのでおすすめしない
- ViewModelはPure Java(Kotlin)のクラスばっかりになるはずなのでテストが書きやすいし実行も速い
- ViewとViewModelのプロパティが正しくバインドされているならば、ViewModelのプロパティをテストすることでその画面のテストを行うのと同じになるはず