幻の(?)第四勢力
中の人がどう思っているかと,外からどう思われているか - NyaRuRuが地球にいたころ さんちの「C++ の設計と進化」の引用部分を読んで、思い出した疑問、というか不満について。
Smalltalk のポリモーフィズムはダックタイピングだけれど、C++ のポリモーフィズムは静的型付チェックと両立させる為に ポリモーフィズムをクラス階層内に限定しました。ここまでは OK.
これによるプログラミングの柔軟性の不足分を補う合わせ技として 総称が必要ということについて、すっぽすっぽセンセ も メイヤーセンセ も昔から言っていた、ここまでも OK.
でも、それを「オブジェクト指向プログラミング」とは違う、C++のサポートする第4のプログラミングパラダイム「ジェネリックプログラミング」だ、としてしまうのが、いまいち理解できません。
STL以前、私はC++が支援するものとして3つの基本的プログラミングスタイル(“パラダイム”)をあげてきた (D&E 4.1) :
- 手続き的プログラミング
- データ抽象
- オブジェクト指向プログラミング
私はテンプレートをデータ抽象を支援するためのものと考えていた。STLでしばらく遊んだ後、私は4つ目のスタイルを含めた:
- 総称型プログラミング
型の拡張方法として、静的OOPL は、継承と総称を備えていて、それにもとづき 「下位型による多相性(suptype polymorphism)」と「パラメータ的な多相性(parametoric polymorphism)」を実現します。でもこれらは 「オブジェクト指向プログラミング」というプログラミングスタイルの中の話です。
カッコつけないで言うと、
クラス階層や仮想関数へ過度に依存した“オブジェクト指向技術”を使いすぎる傾向に対する反対意見――および建設的代替案――であった。
って言うけど、それは「オブジェクト指向技術」じゃなくって「C++のオブジェクト指向技術」と言うべきじゃないの!? すっぽすっぽセンセ!――と言うことです。(ダブルクォートで囲ってあるのが良心的と見るべきか)
補足
もちろん 「ジェネリックプログラミング」とは実体がない概念だ、と言いたい訳じゃないです。
Generic programing とは、Wikipedia(英語版)によると、
Generic programming is a style of computer programming where algorithms are written in over unknown types that are then somehow instantiated later by the compiler.
とあって、たとえば 非OO な言語でも 総称はあったり。
どっちかというと OOP の方が 曖昧な概念で、Rees Re: OO のまとめが解りやすいと思います。だから、C++ が自らのサポートする(定義する)「OOP」の中に 総称を含めていなかったのが悪いとは言えないのは解っています。
でも OOPL の話をするときに、「総称は持っているけれど、これはOOPとは関係ない」と言われると、やっぱり釈然と来ないものを感じてしまうのです。