高階プログラミング
高階プログラミングの例が書かれていた。
- sshi.Continual: 50年の歴史に秘められた高階プログラミングのヒミツ (http://d.hatena.ne.jp/sshi/20051005/p1)
XMLHTTPRequestオブジェクトの作り方はブラウザによって違うので、その差を吸収するには、XMLHTTPRequestオブジェクトを生成する関数にブラウザを識別するコードをしこんでおくのが普通だろう。でもそうすると、XMLHTTPRequestオブジェクトを生成するたびに識別するコードも走ることになる。
xmlhttprequest.jsの中ではJSファイルが読みこまれたタイミングでブラウザ識別関数を走らせている。このブラウザ識別関数が実は高階関数になっていて、返り値として『そのブラウザに応じたXMLHTTPRequestオブジェクト生成関数』を返すようになっている。つまり、この返り値を適当な変数に代入しておけば、後のコードの中ではこれをXMLHTTPRequestオブジェクト生成関数として使えて、何回オブジェクトを生成しようがブラウザ識別コードは最初の一回しか走らない、という寸法。
なるほど。高階プログラミングってこういう風に行うのか。
まとめると、高階関数の使い道は以下の2パターン存在すると思う。上記の例は以下の2つ目に相当する。
- 引数でカスタマイズしたいコード(関数オブジェクト)を渡す。
- 戻り値で適切なコード(関数オブジェクト)を返す。
オブジェクト指向にポリモルフィズムという考え方があるが、使い道は高階関数と全く同様で、上記の2パターン。オブジェクト指向では特に、上記の2つ目をファクトリパターンと言う。
両者の違いは、高階関数では似た処理をまとめて書けるが、ポリモルフィズムではコード(メソッド)がオブジェクトごとに分散するということ。呼び出し時のシンタックスの違いは重要ではない。また両者ともクライアント側はCloseしているものに、コードの追加定義ができる(Openになっている)という、いわゆるOpen-Closedの原則が成立するのは共通している。