二つのオブジェクト指向とそれぞれのメリット


似たような話の繰り返しで恐縮ですが、現時点での自分の理解の整理のためのメモ。

前後しますが、こうして改めてまとめてみると、純粋な抽象データ型のオブジェクト指向プログラミングは、メッセージングのオブジェクト指向の影響も多分に受けている OOAD(分析・設計)のテコ入れ無しには、ちょっと弱っちく&古くさい感じが否めませんね(何をいまさら…ですが)。^^; とはいえ、OOAD は OOP とはまた別のものなので、同じ「抽象データ型の〜」あるいは「メッセージングの〜」だからといって対応する OOP とひとくくりにしてよいかというとそういうわけでもないので(整理・分類上は)難しいところです。


▼ 抽象データ型のオブジェクト指向プログラミング

端的には、「ユーザー定義型(抽象データ型)」を、当初は「クラス」、今はそれに加えて「インタフェース」に準ずる言語機能によるサポートを前提として実践するプログラミング。俗に「カプセル化・継承・ポリモーフィズム」という三点セットに集約・象徴されるようになって久しいが、これはまず最初の「カプセル化」が「抽象データ型」を表わし、それを実現するために使用する「クラス」の特徴としての「継承」と「ポリモーフィズム」があとに続けられたものだと解釈すると言わんとするところの対応がつけやすい。

「抽象データ型(データ抽象 も同じ)」の発案者はリスコフ。それを「(SIMULA由来の)クラス」を用いて実現することこそが「オブジェクト指向」であると思いついて発言し実践しはじめたのはストラウストラップ。メイヤーもこの考え方に準ずる。


「抽象データ型」は、データとそれを操作するための関数(手続き)のセット。リスコフによれば、「抽象データ型」によるプログラミングは「データ型によるモジュール化」の実践。そのメリットは、たとえば、操作する側のプログラムを変更せずに操作される側の実装やそのものを置き換えることができる、など。おおもとはダイクストラの「抽象化のレベル」という考え方に基づいている。


「クラス」を「抽象データ型」実現に用いるというストラウストラップのアイデアにより生じるメリットは、クラスが提供する「継承」機構により、「抽象データ型」(クラス以外で実現された場合の狭義の〜)のみでは実現できなかった、派生型における手続きの共有化、もしくは、再・重定義による「ポリモーフィズム」を活用できること。また、ユーザー定義型を組み込み型と同じように運用可能にできること。

  • What is "Object-Oriented Programming"? (PDF, 1991年の改訂版)

▼ メッセージングのオブジェクト指向プログラミング

端的には、「動的」なシステム構築を「メッセージング」を介して実践するプログラミング。究極的にはその先に、インターネットのような仕組みを封じ込めたシステム、あるいは、多細胞生物のような仕組みで動くシステムを目指していると考えるとイメージしやすい。俗に「オブジェクトに対するメッセージ送信」というフレーズに象徴される。ここでの「オブジェクト」は、均質で万能である(それ自体が小さな計算機あるいは生きた細胞などに例えられる)点で、抽象データ型のオブジェクト指向における「オブジェクト(抽象データ型のインスタンス)」とはとらえ方が異なる。


ケイによれば、システムそれ自体や構築手法が「動的(正確には、遅延束縛)」に徹することのメリットは、比較的大規模なシステムを比較的短期間・少人数で構築でき、それを長期にわたって運用可能なこと。システムを運用しながら修正や改変を加えられること。それにより、行程が進むにつれて蓄積されるノウハウを、すでに構築済みの部分にも適用可能であること。ただしこれらを比較的安全・快適に行なえる特殊な仕組みを持つ処理系は必要。条件を満たしている(かろうじて?)のは、今のところ(名前がよく知られたところでは) SmalltalkLISP くらい。加えて、処理系の適切な運用には、相応の学習(言ってみれば、ある種のパラダイム・シフト)を要する。

また、「動的性」実践のために「メッセージ」というメタファを使うメリットは、単純で日常用いる言語(英語)でなじみのある文法(SV、SVO。S をレシーバ、V や VO をメッセージと見立てる)を採用できること。文法とセマンティクスを一致させることができること。並列処理記述や発想との相性が良いこと。総じて、言語、考え方、操作などを子供やコンピュータに詳しくない人にもわかりやすくシンプルに保てること。

オブジェクト指向プログラミングには、この二つ以外にも、後者から派生して生じたプロトタイプベースのオブジェクト指向プログラミングというのが認知されつつりますが、あまりに自由すぎるのでここでは割愛しました。