UIのプログラムというのを、準静的に書く為だけに存在するViewModelという
1. UIからViewModelへの通知の粒度のミスマッチ
2. GUIアプリでは非UIの機能を非同期で実装しなくてはいけないが、そことViewM
まず1について。
MVVMにおいては、直接イベントはハンドリングせず、基本的なUIの変化はView
例えばテキストボックスに値を入れると、対応するViewModelのstring型
この対応がいつ起こるのか?というと、通常はUI側からは、テキストフィールドからフ
このデフォルトの動作でだいたいはOKなのだが、しかし、たまにもっと細かく受け取り
そういう場合は一文字変化する都度setterを呼んでもらうようにする事が出来る。
文字数を数える場合はそれで構わないのだが、サジェストの場合はそれだと少し細かすぎ
本当は少しアイドルだったら受け取りたい。
それを一文字ずつの変化を受け取ってコーディングするのでは、動的なUIのコードと大
つまり、イベントの粒度が、フォーカスアウトのような大きな単位か一文字変更される都
そんなに良くあるシチュエーションでは無いので、その時は諦めてもいいのだけど、だい
次に2について。
これは本質的にはGUIの問題では無いのだが、ほぼ必ず発生するという点ではこちらの
ようするにアプリのいうのは、テキストフィールドにURLとか入力してボタンをクリッ
そのフローは動的で、昔のGUIプログラムに似ている。だからバグりやすい。
ほとんどが準静的になってGUI回りのバグが消滅すると、GUIプログラムを書く時に
GUIではINotifyPropetyChangedとかDataBindとかいろ
感覚的にはVMとビジネスロジックの間にもXAMLみたいなレイヤーがあればM VM VM Vみたいな感じに出来そうだが、そうやってひたすら移譲を繰り返すのもなんか違う気が
どちらの問題もGUIプログラミングとしては諦めても良かったと思うのだが、Erik Meijerは諦めなかった。そこで出てくるのがRx。
MVVMに比べるとまだ知られていない技術と思うので、哲学的な話を少しこれまでより
Rxとはなんぞや?
Rxとは新しいモジュール化の切り口である。
Rxではプログラムという物を、何かComputingが連続して行われる物、と解釈
つまりプログラムを
「Computing1+結果1」ー>「Computing2+結果2」ー>「Com
という連なりだと解釈する事にした。
そしてこのかぎかっこの「Computing+結果」をモジュールの単位とするのがR
これではなんだか良く分からないので、もう少しプログラマ目線で考えよう。
これまでのモジュール化の方法というのは、
1. APIを決める
2. APIを実装する
3. クライアントはAPIを用いるコードを書く
という手順で行われた。
1と2がモジュールを実装する側で3が使う側となる。
Rxではこのモジュール化の方法が少し違っていて、
1. Computingの結果をチェックするチェックポイントの場所と、その時にチェック
2. Computingとチェックポイントの単位で処理を書く
3. チェックポイントのタイミングと値をクエリ式を用いて自分の望むタイミングにカスタマ
4. イベントに反応するコードを書く
1と2をモジュールを書く側が行い、3と4をクライアントが行う。
カスタマイズという段階を挟んだのが委譲をどんどん続けてしまわない為にErikの出
コンピューティングと結果の列はLazyなリストとして表現される。nextに進む都
これまではコードの中に暗黙で入っていたComputingや継続を実体化して名前を
さて、そんな話は関数型ヲタクしか喜ばないだろう。そこで我々は、非同期なコードとV
まず、Computingとチェックポイントのタイミングをカスタマイズする仕組みは
これはGUIが提供するイベントのタイミングを、制限された形でカスタマイズして、V
この制限はカスタマイズが準静的な範囲になることを型チェックで強制する。細かい話を
これでイベントの粒度のカスタマイズという物を準静的に行う方法を(Rxから流用して
本質的に同じような問題に対して見た目の全然違うXAMLとクエリ式という解決策が混
次に非同期とVMのマッピングはどうなるか?
Rxのやり方でHTTPRequestを使ったサービス呼び出しなどをモジュール化す
そしてそれのタイミングと値をクエリ式という名のDSLでカスタマイズしてVMの望む
クライアント側であるVMとしてはカスタマイズとマッピングはクエリ式というDSLで
VMのマッピングはGUI側ではXAMLでやり、非同期呼び出し側とはクエリ式でやる
MV VMの名前との対応関係を見ておくと、
M
↑
(クエリ式)
↓
VM
↑
(XAML)
↓
V
こういう感じ。
LINQとXAMLでは表面上は全然違うが、本質的には大差無い。宣言的なDSLで準
この図を見るとUIもLINQクエリ式でやったらいいじゃないか?という気もしてくる
GUIはデザイナが使うツールがサポートする都合で言語外DSLの方が都合が良く、イ
歴史的経緯なのか理由があるのかは知らないが、とにかくこうなった。
VMはどちらとマップするにも宣言的な準静的なマッピングに制限されたDSLを手に入
GUIプログラミングとは、
1. 準静的な組み合わせにGUIの要求を分解、翻訳する作業
2. XAMLをデザインするお絵描き
3. ビジネスロジックをイベントの列で公開するプログラミング
がほぼ全ての知的作業となった。
そこに付随してGUIのデザインからほぼ機械的に決定されるVMの決まりきったコード
当初夢見ていた理想郷に比べるとずいぶんとかっこ悪い所も残ったが、Win32APIか
Rxのクエリ式は、たまに足りない語彙もあるのでそこはコードで足さないといけないが
思想的にはこの分野の問題は片付いた、と私は思う。