「MVVMは自分のすぐ隣にあった。それに気づいていなかっただけなんだな」
「どういうことだい?」
「雑談を3つ語ろう」
テンプレートの話 §
「MVVMすると、実はソースがめんどくさくなる。MとVとVMの3つが必要だからだ」
「うん。それは分かる」
「基本的なフレームとなるクラスを用意するだけでめんどくさい。初期化タイミングとかね」
「終わってからまた戻ったりするんだよね」
「Windows Phoneの場合、普通にWindows Phoneアプリのテンプレートで始めるとかなりめんどくさい」
「うん」
「ところが、パノラマとかピボットのプロジェクトで始めると最初からVMのコードのテンプレートも込みで作ってくれる」
「それってどういうこと?」
「テストアプリは凝らないから、別にパノラマ選ばなくていいやと思うと見えない世界がある」
「むしろ、パノラマとかピボットの方がMVVM楽ちんってことだね」
ANGFの話 §
「ANGFもよく考えると、割とMVVMに近い構造を持っていることに気づいた。MとVとVMに割と綺麗に役割が分かれるんだ」
「どういうこと?」
「ステート集約型プログラミングからMVVMはあと一歩の位置にあったということだ」
「具体的に頼むよ」
「ステート集約型プログラミングは、変化する状態を集約するが実はそれがMに対応して、残りがVMに対応する」
「Vは?」
「表示コードは基本的にMとVMの状態を反映させることに特化しているわけだな。V自身は基本的に何も情報を持っていない」
「なるほど」
リフレクションの話 §
「MVVMすると、すぐ出てくるのがバインディング」
「それで?」
「そうすると、XAMLにこんな属性とかぽろぽろ出てくる」
- IsEnabled="{Binding IsDataLoaded}"
「IsDataLoadedって、VMのクラスのプロパティだよね」
「そうだ」
「属性から名前で指定しているの?」
「そうだ」
「どんな仕掛けなんだよ」
「内部的にはおそらくリフレクションなんだろう」
「それなら名前でアクセスできるね」
「ちなみに、C#プログラマとしてのおいらの得意技は何か知ってるかい?」
「LINQかな」
「それもある。しかし、もう1つあるぞ」
「なんだろう」
「それがリフレクションさ。新刊のC#ダイナミックプログラミングを読めば分かる」
「ああ、分かったぞ。名前でアクセスするコードはもともと慣れ親しんでいたんだ。だから、バインディングの世界にもすんなり入れたんだ」
「まあそうだな。ずっとバインディングとは何となくRDB絡みの概念のような気がしてまたいで通っていたが、ふと気づくとそういう話ではない」
「そうか」
「だからさ。C#のコードとしては誰もアクセスしないで、リフレクション経由でのみ外の世界からアクセスされるプロパティなんて、もともと当たり前だったのよ」
「なんか凄い話だな」
「凄くはない。ある意味で当たり前。Visual Studioで参照の一覧を列挙させて誰も使っていないと思って削除したらソフトが動かなくなるなんて、けっこうありがちな話」
まとめ §
「結局、君にとってMVVMって何だ?」
「ドアを開けて待っていてくれたリムジン」
「なんだそりゃ」
「あるいは、何となく書くのにためらいがあったコードを書き始めることができる魔法の鍵」