WPF/MVVM の勉強を始めてみた

これはいいものだ。

食わず嫌いだったと反省。もっと早くからちゃんと勉強するべきだったな、これは。一周遅れでようやくWPFの良さに気づきつつあります。

正直言ってあまりGUIに興味がなかったので、「ボタンを斜めに傾けてもしょうがないと思うしなー、別にアニメーションとか興味ないしなー、WPFはいいやー」と思ってた。

それがふとしたきっかけで尾上さんという方のブログ アプリ開発に必須なプログラム言語は!? – JavaやObjective-Cなど聞くけど、何が必須なの!? に載っているスライドを読んでみたら俄然興味が出てきて、今少しずつデータバインディングとかを実験してみているところ。GUIの見た目を派手にすることには全く興味がないんだけど、WPFの本質ってそこ(だけ)じゃなかったんだね。オブジェクト指向設計とか関心の分離とかMVCパターンとかを踏まえた延長線上でちゃんと新しいGUIのプログラミングモデルを提案しているものなんだね。そういうことを恥ずかしながらようやく理解した。

MVVM というのは Model-View-ViewModel の略で、MVCパターンの延長上にあるデザインパターンだ。といっても、MVC パターンというのは3つの概念に役割を分担するといい感じですよという程度の抽象的なパターンであるのに対して、MVVM パターンはもっと具体的な実装イメージがあるもので WPFアーキテクチャと深く結びついている。今のところの僕の印象としては、ViewModel が MVC の Controller に相当するというよりは、View が視覚ビューと論理ビューの2つに分離されたパターンという風に捉えている。

実は同僚にMVVMに挑戦している人がいて、「なんか隣で面白そうなことやってるなー」と思ったのが勉強を始めたキッカケの一つ。その彼と雑談したのだけれど、なんだか自分たち自身のGUIのデザインが従来と変わりそうだ、という予感がある。ただ上記で分かる通り僕の知識は全然MVVMを語れるようなレベルには達していないので頓珍漢なこと書いてるかもしれないけど・・・。

MVVMだと従来(WinFormsとか)は簡単だったものが面倒になり、従来は難しかったものが簡単になる、と感じた。そういう予感がある。

従来はコントロールをダイナミックに変化させるのは面倒だった。一方でダイアログを出すのはとても簡単で、ボタンのClickイベントでShowDialog()するだけだ。そのためダイアログを多用するGUIになりがちだったと思う。

ところがMVVM(データバインディングとかデータテンプレートとか)で作る場合はコントロールをダイナミックに変化させることが容易になりそう。というか「ダイナミックに変化させる」という言い回しが適切じゃない感じ。ViewModel の状態変化に追従するようにデータバインディング等を設定すると自然とそうなる、という感じ。直接コントロールを変化させているという自覚が薄れる感じ。(合ってるかなー。まだ自信がない・・・)

対してダイアログを表示するのはやや微妙な感じが漂うようになったと思う。もちろん従来通りボタンのClickイベントでShowDialog()は可能なんだけど、イベントハンドラはコードビハインドに定義されてしまう。究極のMVVMはコードビハインドを無くすことであるので、妥協の産物であるように思えてやや気持ち悪さが残る。妥協を嫌って完全にコードビハインドを消し去ろうとすると、今度は Livet や Prism のような外部のライブラリを導入する必要が生じてしまう。これらのライブラリを用いるとどうやら、ダイアログ起動イベント(メッセージ)を Messenger に仲介してもらって間接的にダイアログを起動するというアプローチで V と VM の完全分離を実現する、みたい(← ここまだよく分かってない)。なんにせよ、ちょっと大掛かりだ。

結果として、MVVM を採用すると GUI デザインからダイアログが減って、一つのウィンドウ上でコントロールがヌルヌルと動く GUI になりがちなんじゃないか、と予想してる。これは従来のウィンドウズアプリケーションよりも最近のウェブアプリのUIに似ている気がする。つまりこういうUIのほうがモダンなUIなんだろうな。