オブジェクト指向の利点か…

オブジェクト指向」という言葉が発明されてから、もう20年ぐらいたってると思うけど、いまだにオブジェクト指向の長所と短所をはっきり説明できている文章に出会ったことがないし、どうもそんなものは (統一見解としては) 存在してないみたいだ、ということが、最近わかった。おかしな世界だ

2008/10 b

はっきりと一言で説明できる概念じゃないというのが事実なんじゃないかなぁ。相対性理論を一言で誰にでも分かるような文章に出会ったことがないし、たぶん存在しないと私は思う。まぁ、量子力学でもなんでもいいんだけど。

オブジェクト指向の真のメリットは、抽象的な層の導入にある。そして、これは (うまく使えば) 設計の分離に役立つ。

と聞いておや?っと思った。

自分とかJavaを主体に使っている人は1にも2にも型、型、型、という世界だから抽象型の恩恵は日々感じているところだと思うけども、実はそれがオブジェクト指向というわけではない。というのは、Javaは系譜としてはC++を引き継いでいるわけなんだけど、そのC++こそがオブジェクト指向としては異端というか、「別の何か」というのが始祖たるSmalltalk使いの人の言。

アラン・ケイが「オブジェクト指向」という言葉を創った当初は、Smalltalkシステムが体現した「パーソナルコンピューティングに関わるすべてを『オブジェクト』とそれらの間で交わされる『メッセージ送信』によって表現すること」を意味していた。しかしのちに、C++の設計者として知られるビャーネ・ストロヴストルップが(自身、Smalltalkの影響は受けていないと主張する)C++の設計を通じて整理し発表した「『継承』機構と『多相性』を付加した『抽象データ型』のスーパーセット」という考え方に置き換えられ定着している(カプセル化、継承、多相性)。現在は、両者の渾然一体化した曖昧な概念として語られることが多い。

Smalltalk - Wikipedia

だもんだから、それがオブジェクト指向のメリットだ!と言われるとちょっと疑問符が付く。いや、そういうメリットはC++/Java系でオブジェクト指向と思われているモノのメリットとしては至極もっともだと同意するところなんだけども。

オブジェクト指向で出来るようになったことはなんだろう、と考えると存外難しい。言語としてオブジェクト指向をサポートしていないC言語だったとしても、工夫を凝らせば似たようなことができるというのは割と知られていて、興味がある人はJava謎+落とし穴徹底解明あたりを読むといいかもしれない。C言語でやってみるとこんな感じ、みたいな例も掲載されている。

自分が思うところは、オブジェクト指向は動的なフローチャートを去勢することに成功した、というのが功績なんじゃないか、と思うのだがどうだろうか。

C言語の関数ポインタのような、いわゆる高階関数が扱える言語系では一応動的なフローを持ったプログラムをすることができる。構造化定理に則ってgotoを去勢したのと同じように、高階関数を去勢したのがオブジェクト指向なんじゃないだろうか。プロトタイプベースのオブジェクト指向を見ていると、去勢した割には随分元気じゃないか、とも思うわけだが :-P