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
の形を取ってくれているといいのですが、そうはなっていませんね。
最初の画面がXAMLとC#のセットで出来てきます。
これはV
の部分だけです。
「Xamarin.FormsはMVVM
だ」
とは言うものの、ViewModel
はデフォルトでは存在しないのです。
加えて、はじめの一歩のちょっとした実装をしてみるには、Page
にコードビハインドして実装しても事足りてしまったりします。
Xamarin.FormsでMVVM
をやろうとして、ViewModel
を作ってみようと思って調べてみると…。
下記のようなINotifyPropertyChanged
を継承したベースを作って、ViewModel
はこれを継承する形とするのが望ましいと…。
すなわち、
- スケルトンを作る
BindableBase
を作るBindableBase
を継承してViewModel
を作る- 作った
ViewModel
をBindingContext
にする
とまでやって初めて、
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