テンプレートメソッドパターンと高階関数

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

最近↑の本にお熱です。だいぶ前に本屋で見かけたときは変な本だなと思って買わなかったんだけど、その後あちこちの blog で絶賛してるのを見て気になってました。そしたら、近所の図書館にあったんで、ちらっと読んでそのままずっぽりはまってます。デザパタ本は何冊か持ってて、そしていつも途中で読み飽きてたけど、この本はおもしろい!自分にはあってるようです。お馬鹿っぽい本に見えて、実は濃いです。そういう本ってかなり好き。でも誤りがちょい多かったり、訳がイミフなところがあったり…。

で、この本の中で、Sort( IComparer comparer ) みたいなのをテンプレートメソッドパターンの変種だ、と面白いことが書いてありました。
教科書通りのテンプレートメソッドパターンだと、アルゴリズムの大枠を基本クラスで用意して、変化する部分だけを子クラスのメソッドに実装させます。WinForm とかの GUI をはじめ、フレームワークって名前で呼ばれるようなものにはホントによく使われるパターンですね。あちこちで出会うパターンです。
Sort の話に戻って、比較処理を外に出してる点がテンプレートメソッドパターンの精神を持っているそうな。う〜ん、そう言われてみれば根っこの考え方は同じですね。で、「それって高階関数」と思ったんだけど、これはつまり、テンプレートメソッドパターンと高階関数の考え方の根っこは一緒ってことか!とエウレカ体験。
教科書通りなら関数を渡す変わりに継承を使うけど、継承を使って関数を渡してると考えれば同じようなもんですねぇ。
この本の最初に出てくる原則「変化する部分をカプセル化して、変化しない部分と分離する」にしっかり当てはまるパターンだけど、これはそのまま高階関数にも言えることですよね。ついでに言えば、どちらも DRY 原則をきっちり守ってます。関数型言語は DRY 原則に過剰なまでに従っているけどw

オブジェクト指向的にやってしまうのがテンプレートパターン。つまり Sort( IComparer comparer )。関数型言語風にやってしまうのが高階関数。つまり Sort( Comparison comparison )。

Closure ぽんと渡しておしまいか、インターフェイスを用意しておいて、それをインプリしたインターフェイスを渡すかの違いはあるけど、根っこは一緒と。

まとめると、高階関数オブジェクト指向風にやるのがテンプレートメソッドパターンと。ちょっと変わった理解の仕方をしてしまったけど、意外なところで意外なものが繋がりだして、なんだかおもしろい。

そうそう、この本のいいところは、デザパタを使いすぎるなってことがちゃんと書いてあるところ。激同なのでちゃんと書いてあることがうれしい。