スポンサーリンク

【Android】初心者が意識すべきMVVMでの開発ルール

アプリ開発時にMVVMパターンを利用して開発が多くあります。

最近はアーキテクチャコンポーネントでも採用されています。

Android の 「DataBinding」 を利用して 「MVVM」で開発にて機能を適切に分離することで可読性が高く改修やリファクタリングが容易なコードになります。

ソフトウェアアーキテクチャを導入することでの利点も多くあります。

クラスの役割、責任が明確になることです。

クラスの役割が明確になると、

「どの処理をどのクラスへ実装すべきか?」

「解読時に何処に実装されているのか?」

の迷いが無くなります。

迷いが無くなることで設計が簡素になり、可読性が良くなるのです。

そして、可読性が高くなることで、実装時、改修時の迷いが無なくなります。

と良いことだらけです。

また、MVVMでの開発に慣れていない人がチームに含まれていた場合は上記の役割や分離を理解していないこともあります。

気付くと「ViewMode」に Layout の処理が存在したり、

Modelへ書くべき処理がViewModelにかかれていたり、

ViewModel で Layout の描画処理されていたり。

ここでは、それぞれのクラスの役割の解説と、分離の方法を解説します。

今回は主に「layout」「Activity」「ViewModel」に関して解説します。

※ ここでは、Model の分離(Domain層、Repositoryなど)に関しての分離は解説しません。

チームメンバーでこのルールを意識し実装することで統一性のあるプロジェクトを目指しましょう。

また、これらを意識することで「MVVM」アーキテクチャーの基本を学ぶこともできるでしょう。

スポンサーリンク

全体

「Layout」「Activity」「ViewModel」「Model」の各役割を学び、機能を分離することを意識しましょう。

迷った時に各クラスの役割とルールを確認し適切なコーディングをすることが重量です。

結果、可読性が良く、改修のしやすいプログラムになるでしょう。

Layout(View)

概要

DataBinding を利用し、 Layout と ViewModel の変数を紐付けます。

紐付けることで、更新が Layout へ自動的に通知され更新されます。

ViewModel からデータの変更通知にて View が更新されます。

実装時の意識

UI 以外のロジックは書かない

ユーザーが参照するUIのレイアウトだけを記述します。

ロジックを記述してはいけません。と言うより基本記述できません。

ViewModelを保持

基本的に ViewModelを保持します。

動的な表示データに関しては全て「ViewModel」にて紐付けます。

動的な変数が必要ない場合は省略できます。

動的変数を紐付ける

「Android:text=“@{viewModel.description}”」にて「text」へセットする。

OnClick イベント

紐付けられた ViewModel へ OnClick を作成し、Layout から呼び出します。

※ Action クラスを作成し Layout で持たせる方法もあります。

※ Activity の遷移処理の場合、ViewModelから LiveData、Rx にて Activity へ通知しましょう。

Activity 、Fragment

概要

DataBinding を利用し、 Layout と ViewModel の動的変数を紐付けます。

実装時の意識

ViewModel の初期化

ViewModel を初期化と Layout への紐付けをし Binding にて保持します。

アニメーションの処理

アニメーションの開始と終了等の操作をします。

イベントの処理

ViewModel ではできない View の操作をします。

Activity、Fragmentが必要な処理の場合、onClick を受け取ります。

Activity の呼び出し

別の Activity を呼び出す場合、Activity にて処理を呼びます。ViewModel などで呼び出していけません。

ViewModel からのコールバック

ViewModel での処理完了後の通知は、LiveData、Rx を利用する。

ViewModel のデータを取得

ViewModel のデータを取得する場合は、Binding にセットされた ViewModel から取得する。

ViewModel

概要

Activity、Fragmentにて DataBinding を利用し、Layout と ViewModel の動的変数を紐付けます。

ViewModel の変数が変更されると自動的に Layout が更新されます。

Layout の動的データを保持します。

Layout の状態を全て保持します。

Model を呼び出しデータの取得、変更を指示します。

OnClick 等、ユーザからのイベントを処理します。

既にViewModel にてデータを保持している場合はそのデータを利用して Model の処理を実行します。

実装時の意識

Layout の状態を全て保持

UIの表示が回転等にて変更されても破棄されず、取得したデータを保持し、Layout へ表示します。

Context は持たない

ViewModelから呼び出し用のラッパークラスを用意しましょう。

Drawable などの Resource を持ってはいけない。

Activity または Fragment を持ってはいけない。

Unitテストを意識する

Activity、Fragment 以外はPure Java で書くことを意識する。

View を操作しない

View を所持してはいけません。

持っていないので、View に直接アクセスできませんが、念のため、View を操作してはいけません。

layout から onClick を呼び出すのは問題ありません。

Layout からのイベントを受け取る

Layoutからの呼び出しは Layout にて「() -> viewModel.onclick()」を利用し呼び出す。

「viewMode::onClick」での呼び出しは「onClick(View view)」となり、ViewModel に View を持ってしまいます。

「() -> viewModel.onclick()」にて View を持たないようにしましょう。

データの操作を直接しない

データの取得、変更は Model を通す。

例:SharedPreference を直接読んではいけない。

UserSettingRepository を通して呼ぶこと。

データを直接せつ制御してはいけない。

Model 非同期で呼び出し、コールバックにて処理

ViewModel は Model を呼び出し、LiveData、Rx を利用して処理の結果を取得する。

インスタンス破棄時の処理

「android.arch.lifecycle.ViewModel」を継承した場合は 「onCleared()」 をオーバーライドすることで破棄時の操作をしてください。

Model

※ ここでは、Model の分離(Domain層、Repositoryなど)に関しての分離は解説しません。

データの操作に関してのロジックは全て Model にて処理を行います。

  • データの保存、メモリ、データベースへからのデータ取得。
  • ネットワーク、API等を利用したデータの取得。
  • データベースの処理。
  • Entitiesの処理。