LoginSignup
11
6

More than 5 years have passed since last update.

Android MVVMについて

Last updated at Posted at 2019-04-10

はじめに

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

MVC

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

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

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

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

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

▪️図で表した場合

▪️Androidで表した場合
スクリーンショット 2019-04-10 12.09.25.png

問題点

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にデータ取得を通知する。

▪️図で表した場合
スクリーンショット 2019-04-11 0.45.33.png
▪️Androidで表した場合
スクリーンショット 2019-04-10 13.02.24.png

メリット

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

最後に

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

他の記事

11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6