Makopy'5 La6

スマホアプリ開発とかその周辺のこととか関係ないこと。または恋は言ってみりゃボディー・ブロー

Xamarin.FormsにおけるMVVM

はじめに

本記事は、個人的な理解と見解を基に記述しています。
MVVMについて、本質を正しく・深く理解することを目的とした場合には、こことは別な記事を参照された方が良いと思います。
ここでの狙いは、Xamarin.Formsでの開発にどうしてもつきまとうMVVMという考え方を、まずはなるべく最小限の理解で乗り切ろうという発想です。

UIソフトウェアアーキテクチャパターン

以降は「UIパターン」と呼ぶことにします。
いろいろありますが、有名どころで言うと下記のようなものがあります。

  • MVC(Model-View-Controller)
  • MVP(Model-View-Presenter)
  • MVW(Model-View-Whatever)
  • MVVM(Model-View-ViewModel)

Xamarin.FormsはMVVMだと言われています。

UIパターンを理解するための考え方

上記のようなUIパターンには、それぞれの背景などがあるわけですが。
共通して言えることは、
「関心の分離」
ということだと思います。
すなわち、適切な役割分担をすることで、
クラスやモジュール間の結合を疎にしたい
という意図がまず第一にあると考えます。

一定規模以上のアプリ開発においては、
V、すなわちUIビジネスロジックの部分の分離
については、そうした方がいいのはある程度誰にでも自明のことであり、
何かしらの手段により分離が実現されていることが多いと思います。

だから、いくつかあるUIソフトウェアアーキテクチャについては、

  • まずV(UI)をどのような手法で実装すべきか/できるか?
  • V(UI)の実装のあり方から逆算してビジネスロジック部をどう分離し、繋ぎこむのがよいか?

という捉え方をした上で、
開発言語/SDK/フレームワークの特性を加味していくと、ある程度概形が見えてくるのではないかと思っています。

Xamarin.FormsにおけるMVVM

「Xamarin.FormsはMVVM」と言われる大きな要因として、XAMLの存在があります。

Xamarin.Formsにおいては、V(UI)の構築にXAMLを使用することになります。
(コードビハインドにより実装することもできますが、多くの場合XAMLを使用すると思います。)

XAMLに対して値を動的に設定したい場合はBindingが発生します。
XAMLのBinding対象となる裏方というか、影のような存在が必要です。
それがまさにVM(ViewModel)の存在です。
XAMLへのBinding対象となる存在をViewModelという呼び方をしましょう。
Viewそのものではないので、Viewと異なる関心として切り離しておきましょう。
上記の仕組みから、見た目の部分のつながりはView-ViewModelによって成り立つことになります。
その上で、ビジネスロジックは見た目から分離させた方がいいので、その部分をModelに押し込みましょう。
強引かもしれませんが、これでMVVMとなると思います。

最初の一歩を躓かないためには、多少強引にでも概形を捉えておくことが大事だと思います。

すっぴんのXamarin.FormsでMVVM

プロジェクトを作成したときのデフォルトの状態では、MVVMの形を取っていません。
最初のスケルトンがV-VMの形を取ってくれているといいのですが、そうはなっていませんね。
最初の画面がXAMLC#のセットで出来てきます。
これはVの部分だけです。
「Xamarin.FormsはMVVMだ」
とは言うものの、ViewModelはデフォルトでは存在しないのです。
加えて、はじめの一歩のちょっとした実装をしてみるには、Pageにコードビハインドして実装しても事足りてしまったりします。

Xamarin.FormsでMVVMをやろうとして、ViewModelを作ってみようと思って調べてみると…。
下記のようなINotifyPropertyChangedを継承したベースを作って、ViewModelはこれを継承する形とするのが望ましいと…。

すなわち、

  • ケルトンを作る
  • BindableBaseを作る
  • BindableBaseを継承してViewModelを作る
  • 作ったViewModelBindingContextにする

とまでやって初めて、 V-VMの部分が成り立つわけです…。
すっぴんのXamarin.FormsでMVVMというのは、意外に面倒なものです。

やはり素直に何者かの助けを借りた方がいい

仕組みを理解するためにも、一度くらいは上記の手間を踏んでやってみた方がいいですが…。
コピペとは言え、いつもBindableBaseを追加してどうこうは面倒でしかないですね。
Xamarin.FormsにおけるMVVMについては、何者かの助けを借りた方がよさそうです!

有名どころでは、

  • Prism for Xamarin.Forms
  • MVVM Light Toolkit

があるようです。
個人的には、Prism.Formsを利用してみようと思っています!

前回記事でも紹介しましたが。
Prism.Formsに関しては、nuits.jpさんがきちんとまとめて下さっていて、非常に参考になります! www.nuits.jp