Android MVVMについて


はじめに

AndroidをMVVMで実装するようになり、そもそもMVVMてなんだと思い調べました。
自分の理解と考えをAndroidの落とし込んで記事にします。 ← そんなに大層なものではないw

MVC

※MVCは使う場面やフレームワークによってニュアンスが異なっています。

一般的に言われるMVCは何かをWikipediaで調べてみる、そして自分なりに言い換えると

▪️View
モデルのデータを取り出してユーザが見るのに適した形で表示する要素で、UIへの出力を担当する。

▪️Controller
ユーザからの入力(通常イベントとして通知される)をモデルに伝える要素で、UIからの入力を担当する。
モデルに変更を引き起こす場合もあるが、直接に描画を行ったり、モデルの内部データを直接操作したりはしない。

▪️Model
そのアプリケーションが扱う領域のデータと手続きを表現する要素。
また、データの変更をビューに通知するのもモデルの責任である。

▪️図で表した場合

▪️Androidで表した場合

問題点

ViewがActivity・Fragment → 状態に関する情報を保存する必要がある
ControllerもActivity・Fragmentにある → Viewと混在している
ViewとControllerの役割が肥大する

MVVM

またWikipediaを読んでみる、そして自分なりに言い換えると

▪️View
アプリケーションの扱うデータをユーザーが見るのに適した形で表示し、ユーザーからの入力を受け取る要素。
ViewModelからパラメータ変更の通知を受け取り、パラメータの参照をする。
Viewそのものに複雑なロジックと状態を持たないのがMVVMのViewの特徴。

▪️ViewModel
ViewとModelの間の情報の伝達と、Viewのための状態保持のみを役割とする要素。
Viewを描画するための状態の保持する。
Viewから受け取った入力を適切な形に変換してModelに伝達する。

▪️Model
そのアプリケーションが扱う領域のデータと手続きを表現する要素。(APIとか)
アプリケーションのドメインを担う。
ViewModelにデータ取得を通知する。

▪️図で表した場合

▪️Androidで表した場合

メリット

各レイヤーは自身の役割のみに集中できる(他のクラスの挙動を意識する必要がない)。
ビジネスロジックの実行と画面のオペレーティングを混同することがなくなる。

最後に

MVVMにはよくデータバインディングという言葉が使われますが、上記で記載した役割をViewModelが果たし、「関心の分離・依存関係の切り離し」ができていれば、MVVMであると思っています。
データバインディングは、あくまでも手段だということです。

参考にしたサイト

https://ja.wikipedia.org/wiki/Model_View_Controller
https://ja.wikipedia.org/wiki/Model_View_ViewModel
https://qiita.com/yuutetu/items/ea175b73e1dbbfd355db#view
https://qiita.com/homyu/items/046c9a43b15b9e376198

他の記事