【Android】MVVMアーキテクチャについて
こんにちは。じゅんじゅんです。
唯一のストレス解消方のカラオケが基本的に終日禁止される状況で
ヒトカラもろくにできない状況で大変困っています。。。笑
現在、MVVMアーキテクチャで開発を行う業務が多く散見されます。
私自身の知識を深める意味で色々と調べてみました。
MVVMアーキテクチャ初心者の方に伝わりやすく書けるよう心がけて行きたいと思います。
てな感じで、今回はAndroid開発におけるMVVMアーキテクチャについて解説していきます。
そもそもアーキテクチャとは?
アプリーケーションやソフトウェア開発をする上での設計手法のことを表します。
直訳すると、「構造」などになります。
過去の開発者たちがより良い開発手法を目指して決められてきたもので
よりユーザにも、開発者にとってもメリットとなる点が多くあります。
アーキテクチャには、MVCやMVVMというものがありますが
以降もどんどんより良いものが作られていくのではないでしょうか。
MVVMアーキテクチャとは?
いくつか存在するアーキテクチャパターンの中の1つで
Model – View – ViewModel それぞれの頭文字を取って表されます。
まず始めに、アーキテクチャを使用する上で、基本的概念が存在します。
- クラスごとの役割分担
- モデルでUIを操作する
クラスごとの役割分担
データの取得や保存に関して、各クラスの役割分担をきっちり行ってあげましょう!
ということです。
役割分担を行わず、Activity/FragmentにUI表示制御、データ取得、保存をすべて記載していったらどうでしょうか?
役割分担をしっかりしてあげることで、
「このクラスでは何をしているのか」というのがわかりやすくなります。
よって、ソースコードの可読性の向上に繋がってくる訳です。
次に、Lifecycleで考えてみましょう。
Activity/Fragmentに処理を全部記載してしまった場合。
Androidでは画面回転などでLifecycleが破棄される場面があります。
画面回転によってLifecycleが破棄された場合、画面表示処理だけではなく
データの取得や保存する処理など
Activity/Fragmentに記載されているすべての処理が再度実行されます。
ただの画面回転が、端末内のCPU/メモリに高負荷の状況を作ってしまうことになります。
このように、役割分担を行わないことで問題が様々発生してきます。
モデルでUIを操作する
前述の様々な問題発生をさせない解決法が、「モデルでUIを操作する」ことです。
Lifecycleでは破棄されない=永続化のデータ管理をすることが推奨されています。
Googleではアプリ開発の推奨アーキテクチャとして、
以下の形が公式サイトで解説されています。
これがMVVMの基本形となります。
参考:アプリ アーキテクチャ ガイド – Android Developers
図を見ていくと矢印が記載されていますが、
各階層は、矢印の先のものにしか参照権が存在しません。
例えば、View層であるActivity/FragmentがModel層を参照することはできないのです。
よって名前はMVVMですが、名前通りに
とは、なりません。
以下の様になることが正しいクラス構成となります。
では、それぞれの階層ではどのようなことが行われるのでしょうか。
Google公式の図の流れで解説していきます。
Model
Modelはデータの実態を担っています。
DBの型/仕様に合わせての保存・取得処理がModelに実装されます。
Repository
Modelクラスの型に合わせてデータの取得・保存方法を管理するクラスです。
この機能はViewModel内に実装されることもあるようですが、
View-ViewModel間の負担を減らすためにもRepositoryにデータの取得・保存を実装するほうが好ましいとされています。
万が一データの取得先が変更された場合にもRepositoryの取得先変更のみで
ViewModel内の実装には影響が出ないようにすることができます。
ViewModel
ViewModelは、Viewが画面表示に必要なデータを用意するクラスです。
Repositoryから取得したデータをViewに渡すことを担っていますが、
Viewが使える形やViewで使用するものだけにして渡すという部分の処理も実装します。
View
ActivityやFragmentなど、UI(画面)の表示・更新を行うクラスを指します。
ViewModelから得たデータの表示や、オブザーバを使用した監視に基づいての随時UI更新
また、ボタンなどユーザ操作の検知についてもViewで処理を行います。
最後に
MVVMアーキテクチャ、いかがだったでしょうか。
MVCなど他にアーキテクチャは存在しますが、Android現在の推奨はMVVMになっておりますので、皆さんも理解を深めていってはどうでしょうか。
※絶対的ではございません。
現場・案件などそれぞれ適した形があると思いますので
あくまで公式推奨ということだけ念頭に置いていただければと思います。
MVVM内でよく使用される、RxについてやDataBainding、LiveDataについても今後解説していけたらと思います!
では、くれぐれもお体に気をつけて!!
bye…ノシ
過去に以下のAndroid関連記事も書いておりますので、よかったらどうぞ!
- 【Kotlin】ConstraintLayoutの相対的なView指定方法【Android】
- 【Android】入門!Activityのライフサイクルとは?
- JavaからKotlinに移行したAndroidエンジニアが困った!!スコープ関数について解説してみる