クロージャの活用

私はごく最近までクロージャという言葉を知りませんでした。
またその存在を意識したこともありませんでした。
クロージャという言葉を知ってからはいろいろなところでその言葉に出会うことに気づき、最近流行っているのかなと思いました。
インターネット上でちょっと調べただけで、実際にプログラムとして利用されている例をたくさん見つけることができるし典型的なパターンを知ることはできるのですが、クロージャを使うってことはどういうことなのかが自分でもよくわかっていませんでした。
そんなわけでクロージャはどういうときに使うと良いのか考えてみました。


クロージャは端的に言えば、実行時に決定される環境(コンテキスト)もって、環境(コンテキスト)が決定された後の任意のタイミングで実行することができる、名前をつける意味の無い匿名のロジック(関数あるいは処理)のオブジェクトということになると思います。
クロージャ自身はアイデンティティを持たない匿名の存在であるために、クロージャの環境を固定(コンテキストを決定)してそのクロージャを返す関数、すなわちクロージャのFactory Methodを導入して、このFactory Methodの名前が生成されるクロージャアイデンティティを表すようなパターンが多く見られるようです。
このようなクロージャがどのような時に使えるかと考えて思いついたことは、デザインパターンのStrategyパターンやStateパターンを適用するようなケースにおいて、それぞれのStrategyやStateの種類(バリエーション)毎の意味的な差異があまりにも些細であり、別々のクラスを定義した場合にはあまりにも冗長にクラスの種類が増えてしまうような状況にクロージャを活用できると考えました。
実際に自分の今までの経験を考えたとき、直感的にStrategyパターンやStateパターンを適用したい気分であるが実際にコードで表現するとなんだか煩雑にクラスが増えすぎる、実際のロジックの割合に比べて本質的に意味の無いクラス定義の記述の割合が大きくて冗長過ぎる感じがして悩んだケースが結構ありました。
今思えばそのようなときにも一連のクロージャを返すFactory Methodを提供するFactoryクラスを導入すればすっきりしたケースが多々あったように思います。
あと一般的によく使われるのはやはりイベントなどのコールバックのロジックでしょう。
コールバックが何かのオブジェクトに対する通知である場合にはObserverパターンを導入する意味があるでしょうが、特定のインスタンスに通知する必要の無い単なるアクション実行でしかない場合にはクラスを定義することはちょっと冗長に感じます。
クロージャのサンプルで最もよく見られるのはこのようなパターンではないかと思います。


クロージャに関して、動的型言語になじみのある方はインターネット上で情報を得ることは比較的たやすいと思います。
静的型言語ではC#の匿名メソッドを適切に使用することで同様のことが実現できると思います。
Javaでも近い将来にクロージャが導入されるという情報があります。
私自身精進して使いこなして行きたいと思います。