イベント処理の簡易化、間接化

VisualBasic等を使ったGUIプログラミングの黎明期にはイベント処理がモジュールやクラスの内部に節操なくばらまかれた状態になるのを見て嫌な気持ちになったものだが、現在、そのようなコードは少なくなってきている。

それは言語側でイベントハンドラやイベント処理のためのアダプタクラスのインスタンスを定義せずに、コードのコンテキスト上で書く方法が考案されて一般的になったからだ。

Java(Android)の無名インナークラスによるイベント処理の記述
button.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
      イベント処理
    }
});
C#3.0以降のラムダ式(デリゲート)によるイベント処理の記述
button.Click += (sender, e) => 
{ 
    イベント処理 
};

この書き方も気をつけないとインデントが深く見難いものになってしまうが、それでも無名インナークラスやラムダが無かった頃に比べれば見通しは良いといえる。

Objective-Cにはデリゲートと呼ばれる処理の委譲のメカニズムがあり、更にはGUIツールキットとして用意されたCocoaTouch/UIKitは「アクション/ターゲット」と呼ばれるメカニズムがあり、イベント時に呼ばれるアクションをランタイムにバインドすることができる。

[button addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];

- (IBAction)onClick:(id)sender
{
  〜
}

この方法はアクションを複数のイベントと統合できたり、動的にアクションを差し替えたりと柔軟性の高いプログラミングができるが、それでもイベント処理用のメソッドがばらまかれるのは避けられない。JavaC#のようにラムダや無名クラスのような仕組みは使えないのだろうか。

否。