nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

Prism for Xamarin.Forms入門 はじめに

先日(2016年8月11日)、ついに待ちに待ったPrism.FormsのStable版がリリースされました。
今まで比較的長い間Previewであったため、待ち望んでいた人も多いのではないかと思います。

私自身、PrismのWPF版を仕事でも利用しており、ありていに言ってPrismファンなので、大手を振ってXamarin利用者の方々にお勧めできるようになり、ついにこの時が来たか!的な気分です。

そこで、これからしばらく、ブログ上でPrism入門的な記事を投稿していこうと思います。
Prism、難しいイメージがありますが、実際に利用してみると非常に強力で、且つ、分かりやすいフレームワークですので、良かったらしばらくお付き合いください。

なお本エントリーは連載記事「Prism for Xamarin.Forms入門」の一部となっております。
以下に目次がありますので、他のエントリーもご覧いただけると嬉しいです。 【Xamarin】Prism.Forms入門 目次 - nuits.jp blog

それでは本題に入りましょう。

Introduction

Xamarin.Formsを利用してアプリケーション開発を行う場合、プレゼンテーション層のアーキテクチャはMVVMを採用するのがもっとも自然な選択です。
しかしXamarin.Formsに限らず、WPFやUWPでも言えることですが、それら単体のみを利用してMVVMアーキテクチャを実現することは非常に負荷が高く、何らかのMVVMサポートインフラストラクチャーを導入するのが一般的です。
現時点(2016年08月11日)で、Xamarin.FormsをサポートするメジャーなMVVMインフラストラクチャとしては、以下の二つが存在します。

  • Prism.Forms
  • MVVM Light Toolkit

WPFの世界では、Livetも有力な選択肢ではありますが、残念ながら現時点でXamarin.Forms対応は行われておりません。

PrismとMVVM Light Toolkitを比較した場合、一般的に

  • MVVM Light Toolkit
    • シンプルで分かりやすく取り組みやすい
  • Prism
    • なんか凄いんだろうけど難しそう

というイメージがありますよね?
「Prismは使いこなせれば良いのかもしれないけど、誰もが難しい、難解だというしMVVMを始めるならMVVM Light Toolkitの方がいいかな?」
という声をよく聞きます。
私も最初はそう思いました。実際に最初はMVVM Light Toolkitから取り組み始めました。

でも、Prismを実際に使い始めてみて、私はすぐにそれらが誤解であることに気が付きました。
Prismの理解があるレベルまで達すると、Prismが難解だというのが誤解であることを、誰もが理解することができるでしょう。しかもそのレベルというのは特別高いものでもありません。

では、なぜそういった誤解が広がっているのでしょうか?
端的に言って、Prismがサポートする範囲がMVVM Light Toolkitより広く、特にMVVM Light Toolkitがサポートしていない領域に難解な概念が含まれているからです。

下のようなイメージです。

f:id:nuitsjp:20160811154929p:plain

現在でこそ、Prism先駆者が多くの情報をインターネット上に共有してくださっていますが、初期のころは上のように非常に大きく、部分的に難解な領域を含むため、大きな苦労をなされたのだと思います。
そのため、「Prismは難しい」というイメージが広まってしまったのではないかと考えています。
つまり、MVVM Light Toolkitが提供している領域のみを利用するのであれば、Prismが特別難しいということはないのです。

そして重要なことに、この

f:id:nuitsjp:20160811154942p:plain

難しくはないが、MVVM Light Toolkitには含まれていない領域に、非常に魅力的な機能が含まれているということです。
特にXamarinの場合はその傾向が顕著です。

  • Navigation
  • Page Dialog Service
  • Dependency Injection

といった辺りが非常に強力です。

Dependency Injectionについて誤解を招く記述になっていたため、指摘をいただいて以下追記しました。
Dependency Injectionの機能自体は、MVVM Light Toolkitにも存在しますが、PrismにはXamarin.FormsのDepenency ServiceをInjection機能が存在するなど、DI機能を比較するとPrismのほうが高機能です。
追記終わり

「Prismは難しい」という誤解で、これらが利用できないのはもったいないと私は思います。
このあたりの魅力を上手く伝えて行けられたらなと思います。

また、MVVM Light Toolkitのみが提供している領域

f:id:nuitsjp:20160811155658p:plain

この領域の多く(全て?)は、Prismベースで開発している上に、アドイン的に利用することが可能です。
Prismだけ使わなくてはならないという事はないのです。
魅力的ですよね?

さて、Prismの具体的な利用方法に入る前に、もう少しPrismのガイダンス的な話をさせていただこうと思います。

What is Prism?

Prismの開発者である、Brian Lagunas氏はPrismとは以下のようなものだとおっしゃっています。

XAML Application Frameworkについては、まぁそのままですね。
XAMLで開発するXamarin.Formsの開発生産性や品質向上に大きく貢献するフレームワークであります。

私的に強くお伝えしたいのは、それに続く、「Guidance」であり、「Patterns & Practices」であり、「Testable & Maintainable」なものである。という点です。
つまり、Prismはフレームワークであるとともに、

  • Prismの方法論を適用すると、自然とMVVMアーキテクチャを実現することのできるガイダンスであり
  • MVVMアーキテクチャを実現するパターンや実践方式そのものであり
  • Prismを利用することで、自然とテスタビリティやメンテナンスビリティを得ることができる神のツールである

という事です。
まぁ、ちょっと言い過ぎ感はありますが、実際にそういった側面が多々あることが、Prismを利用していくと実感できると思います。

What do you get?

引き続き、Braian氏のプレゼンから引用させていただきます。
Prismとは、具体的に何を提供してくれるものなのか?

  • MVVM Support
  • Commanding
  • Messaging
  • Navigation
  • Page Dialog Service
  • Logging
  • Dependency Injection

ここでちょっと白状してしまうと、Loggingは私もまだ利用したことがありませんw

さて、Commanding以下はすべて具体的な機能を指しています。
それぞれは勿論、重要な機能なのですが、ここで最も大切なのはMVVM Supportを提供するものである。という点にあります。
当たり前だろって?まぁ、ちょっと我慢して聞いてください。

Prismでは、確かにCommanding以下の機能群を提供することを通して、MVVMの実現をサポートしています。
しかし、MVVMを実現するということは、BindingやCommandを利用するという事ではありません。Messengerパターンを使って、ViewModelからViewへ通知するという事でもありませんし、ましてやコードビハインドにコードを書かないことでは決してありません。
それらは、MVVMを実現するために有効な道具ではありますが、本質ではありません。

MVVMを実現するというのは、Presentation Domain Separation(PDS)を実現するということであり、ひいてはSeparation of Concerns(SoC)を実現し、テストしやすくメンテナンスビリティの高い、高品質なソフトウェアを効率よく開発するという事を指します。
Prismは、推奨されるプラクティスを守って開発することで、これらが自然と実現できる仕組みになっています。
だからこそ、「Guidance」であり、「Patterns & Practices」であり、「Testable & Maintainable」なのです。

MVVMやPDS・SoCの話ももう少し深堀したかったのですが、あまり前置きが長くてもあれなので、それについてはまた機会を見て説明し、ここからはまずは実際にPrismを利用していってみたいと思います。

というわけで、今回はここまで!(え?
記事としてはいったんここで切りますが、今日中に次の記事を投稿したいと思いますのでご容赦くださいw
それではまた!