設計の観点から見たクロージャ

以前(ってもう一年以上前!)にクロージャについて書きましたが仕事ではクロージャをサポートする言語を全く使わないこともあって設計に使用することがありませんでした。
最近MATLABを使用する機会があって初めて本格的にクロージャをサポートする言語で実装設計を行ってみて改めてクロージャの有用性実感しました。
それでクロージャの意味について、特に設計の観点からの視点で考えてみたいと思います。
私の中で一つの結論としてはっきりしたのはクロージャはネストした状態の適切な表現方法の一つであるといういことです。
ここで言うネストした状態の具体的な例としては以下の様なものがあると考えています。

  1. マウスのドラッグ&ドロップ操作時の振る舞い
    • マウスのドラッグ&ドロップ操作ではマウスのボタンダウンの際に掴んだ(ポイントした)物やその状態によってそのあとのマウスの移動とボタンアップの振る舞いにおいてボタンダウンの際の情報が必要になります
  2. コマンド&レスポンスの処理
    • バイス制御などの通信処理でコマンドの実行とそのコマンドに対応して経過やレスポンスの処理をする必要がありますがこの経過やレスポンスの処理のためにコマンドのパラメータや実行時の状態などの情報が必要になります。

この様な状況の設計上の表現としてクロージャの活用は非常に有効だと思います
私は従来このような状況では状態のネスト構造を表現するためにステートパターンを使用して、大きい外枠の状態を表すクラスとそれに含まれるネストされた状態を表すクラスを定義して、大きい枠の状態を表すクラスがネストされた状態を表すクラスを使用(use)する関係で表現していました。
このような方針でもネストした状態を表現することは十分可能なのですが、この構造はネストした状態の表現というよりは、大きな状態遷移と小さな状態遷移がそれぞれ別のステートマシンとしてメッセージ交換により協調して動作するの様な表現になります。
一方で上記の例の様な状況ではネスト構造の状態の間には機能的(静的)な関連がなく、あくまでの実行時の状態(動的な情報)としてネストする状況なので、私の従来の方法で表現しようとするとクラス関係が必要以上に抽象的なものになって設計がややこしいものになってしまいます。
完全にクロージャをサポートしない言語でも設計上としてクロージャのアイデアを生かしてそれを実装に落とし込んでゆくアプローチは可能だと思います。
ただしソースコード可読性やコミュニケーションを阻害する様に必要以上にテクニカルにならないようにソースコード上の表現には気をつけたいと思います。
今後はこの教訓を生かしてネストした状態の設計表現としてのクロージャをもっと活用したいと思います。