osiire’s blog

ふしぎなそふとやさん

GUIイベントの扱い方

メジャーなGUIツールキットはオブジェクト指向言語で記述されていることが多い事もあってか、GUIイベントはオブジェクトが発するメッセージであり、そのメッセージを受け取るオブジェクトがインテリジェントに次々と処理を連鎖させていくという処理モデルを持っている。
ところが、この処理モデルを(現状の)GUIプログラミングに適用する事は人間に優しくないと思う。その理由はいくつもある。

  1. オブジェクトがなまじインテリジェントなだけに、余計なことを沢山やってくれやがる。そしてそれを抑制できない。
  2. GUIイベントはシングルスレッドで非同期を(メジャーなツールキットは)前提にしているので、複数のイベントで単一の処理を意図することが多い。それゆえ、ただでさえオブジェクトが詳細を隠蔽していてインテリジェントに呼ばれる次の処理が見えないのに、全くもって処理の流れと意図が追えない。(流れは追えなくてもいいはずなんていう理想主義者はいないね?)
  3. 本来処理の流れからいえば単一でいいはずの状態や条件判断を、縦割りされたオブジェクトがそれぞれ保持したり実行しなければならない。さもなければ、メッセージにmode=1とかいう謎なフラグが多用されることになる。

もちろんバランスの問題といわれればそうかもしれないけど、あまりにひどい。これらを解決するにはこうすればいいと思う。

  1. オブジェクトはstupidに。余計なことは何もしない。別のイベントを挙げるなんてもってのほか。
  2. 状態は一箇所に集約。
  3. イベントが発生したら状態遷移機械へ入力。どの処理を行うのか細かく決めてから走らせる。
  4. マルチスレッドにする。

なんだか手続き指向に逆戻りだと思われるけど、結局プログラマは全体を把握しなければならないので。