メソッド名合成を使ったプログラミング(1)

「メソッド名合成を使ったプログラミング(1)」の続き

メソッド名合成プログラミングその2

Cocoaライブラリの例以外には、Cocoa勉強会 関東57回目で発表した「五年後のControlEnabler」でもメソッド名合成を使ってプログラミングしている。

このControlEnablerでは、target-actionパラダイムを利用して、NSControlのサブクラスの挙動を変更する仕組みです。

target-actionパラダイムでは、変数targetによって示されるオブジェクトへ変数actionによって示されるメソッドを呼出します。

関係は以下の図のように、ボタンからコントローラへの一方通行。

../../../_images/target-action.png

ここで、ControlEnablerを導入しすると、windowのupdateのタイミングでボタンはコントローラのデータを読み取り、ボタンの挙動を変更する。

../../../_images/ControlEnabler.png

target-actionパラダイムでtargetとして指定されたオブジェクトは、actionを実行出来るのだから”おそらく”actionに関する他の事柄も知っているだろう、言う前提の仕組みです。

ここで、コントローラにactionメソッドとして “anAction:”が有るとすると、以下のメソッドを定義する事でbuttonの挙動を変更出来ます。

- (IBAction) anAction:(id)sender;        // action
- (BOOL)     canAnAction:(id)sender;     // actionを呼出すボタンの有効無効を制御
- (NSString*)titleOfAnAction:(id)sender; // actionを呼出すボタンのタイトルを制御

ここで、上記のように”anAction:”を共通の文字列として、can<action名>、titleOf<action名>といったメソッド名を合成して、update毎に呼出してその値をボタン自身に適応する。

ControlEnablerでは、このようなメソッド名合成を使ったプログラミングを使用している。

メソッド名合成プログラミングその3

その他にも状態遷移クラス等の設計等で使えると思うけど、作ってません。

“<状態名>Enter”や”<状態名>Exit”等のメソッド名を合成してデリゲートを呼出せば、switch分が減る。