2003/09/15
「コードの再利用」ってのはオブジェクト指向アプローチの メリットとしてよく語られてたけど(最近はそうでもないか)、 実は関数指向アプローチの方がずっと コードの再利用がやりやすいように思える。
OOのコード再利用ってのは、 誰もがagreeできるような性質を持つオブジェクトに対しては可能だけど (stringとか、GUIコンポーネントとか)、そういうものはむしろ少なく、 同じものであっても見方によってモデリングの方法が変わって来ることの 方が多い。全ての見方に対応しようとするとインタフェースが爆発する。 色んな見方で組み立てられるように、要素を分割してモデリングして、 使うときに必要なものだけ集めてやろうとしても、継承使うなら 多重継承やmixinの嵐、コンポジションでやるのも小さなオブジェクトの 管理がめんどい。
関数指向は、ものの操作のみに注目する。 Scheme:オブジェクト指向表現?でちょっと話が出たけど、 例えば木のトラバースをする関数は、(1)対象物がleafであるかどうか、 (2)対象物の子ノードへ操作をマップ、の2種類の操作さえ与えられれば、 対象物が何であるかは知らなくてよいし、そもそも対象物が 木としての動作を本質的に備えている(e.g. treeインタフェースを持つ)ことさえも 要求しない。本来は木じゃないものを、たまたま一時的に 木として見たくなった、といった場合に、呼び出し側はその場で 上記(1)(2)の操作をでっちあげれば、トラバース関数が使える。
言い替えれば、関数指向では、全てのコンポーネントは、対象物に対して何も仮定を 置かなくて済むということだ。なぜなら必要な操作は呼び出し側が提供して くれるから。従って、汎用的な操作を部品化する時に「それが誰に、どのように 使われるか」を気にせずに、アルゴリズムのみに集中できる。
オブジェクト(クラス)指向はむしろ、具体的な問題が与えられた時に、 関数指向で用意された部品を集めて具体的なものを実現する際の骨組みとして 大いに役に立つ。 そういう骨組みは問題毎に異なるから、 多くのクラスはその問題専用に作られ、再利用されることはない。
つうわけで、「部品はFP」「アプリはOO」ってのが結構いいんじゃないかと 思う次第。
Tag: Programming
ねる :
戯 :
shiro :
ささだ :