「オブジェクト指向」の意味の歴史的変遷
はじめに
オブジェクト指向(Object-Oriented Programming, OOP)は、現代のソフトウェア開発において最も広く採用されている考え方のひとつです。多くの開発者にとって、クラス・継承・カプセル化・ポリモーフィズムは「OOPの基礎」として教育されています。
しかし、この「常識」は、オブジェクト指向が誕生した当初の意味合いとは大きく異なります。1960年代にSimulaが登場し、1970年代にアラン・ケイがSmalltalkを提唱して以降、OOPは数々の転換点を経て進化してきました。現在のOOPは、ロバート・C・マーチン(アンクルボブ)らが広めたSOLID原則やクリーンアーキテクチャに象徴されるように、「依存関係を制御し、変更に強い設計を行うための指針」として理解されています。
本稿では、その変化を 起源(Simula) → 理念(ケイ) → 産業化(ストラウストラップ/C++) → 修正(ゴスリング/Java) → 工学規律(マコネル) → 実務体系(GoF, マーチン) → 現代三層構造 という流れで整理し、なぜOOPが誕生当初と現在でそもそも異なる概念となったのかを明らかにします。
オレ=ヨハン・ダールとクリステン・ニガード:Simulaの発明とクラスの起源
1967年にノルウェーで誕生したSimulaは、世界で初めてクラスと継承の概念を導入しました。開発者はオレ=ヨハン・ダールとクリステン・ニガードです。
Simulaは本来シミュレーション言語として設計されましたが、クラスによるオブジェクト定義と継承による再利用性が大きな発明となり、後のOOP言語に多大な影響を与えました。アラン・ケイはSmalltalkを構想する際にSimulaを参考にし、ビャーネ・ストラウストラップもC++を設計する際に直接的な影響を受けています。
OOPの歴史は、この「Simulaが形作ったクラスと継承の発明」を出発点とするのです。
アラン・ケイ:理念としてのオブジェクト指向
アラン・ケイが1970年代に提唱したSmalltalkは、Simulaからクラスの概念を受け継ぎつつも、核心は「メッセージパッシング」にあると強調しました。オブジェクトを「小さなコンピュータ」と見なし、相互作用を重視したのです。
ケイにとって、継承は本質ではなく「必要なら使えばよい」程度の補助的仕組みにすぎませんでした。教育・研究的な文脈で生まれたSmalltalkでは、継承の副作用は問題化せず、放任的な扱いが可能だったのです。
ここでのOOPは、理念的・教育的であり、静的構造よりも動的な相互作用を重視する思想でした。
ビャーネ・ストラウストラップ:C++と産業化の混乱
1980年代に登場したC++は、Simulaの影響を受けつつ、C言語にクラスと継承を統合しました。ビャーネ・ストラウストラップは効率性と抽象化を両立させようとし、結果として「OOP=クラスと継承」という図式を世界に広めました。
多重継承や仮想関数をサポートしたC++は柔軟さを誇りましたが、実務では「ダイヤモンド継承問題」など深刻な混乱を招きました。IsA関係をコードの継承構造に直結させることが、現実のモデリングと相容れないことも明らかになりました。
ここで初めて、アラン・ケイが軽視していた継承が、産業界の中心的機能であり同時に混乱の源泉へと変わったのです。
ジェームズ・ゴスリング:Javaによる修正
1990年代、ジェームズ・ゴスリングはC++の混乱を見据えてJavaを設計しました。Javaの特徴は以下にあります。
- 多重継承を禁止し、言語仕様レベルで複雑さを排除。
- インターフェースを導入し、柔軟性を維持しつつ安全性を確保。
- シンプルさと安全性を重視し、C++との差別化を図った。
ゴスリングはマコネルに影響されたのではなく、C++の実務的課題を直接見て判断しました。ただし、Javaの設計方針は結果的にマコネル的規律(委譲重視、再現性重視)を裏付ける「実例」となりました。
スティーブ・マコネル:工学規律としての体系化
スティーブ・マコネルは『Code Complete』(1993)、『Rapid Development』(1996)を通じて、OOPを含むソフトウェア開発全般を工学的に整理しました。
彼は「多重継承は避けよ」「IsAよりHasA(委譲)を重視せよ」と強調し、C++の混乱に明確な工学的解決を与えました。Javaの登場がその実例となったことで、マコネルの議論は現実的な説得力を増しました。
ここでOOPは「理念」から「工学規律」へと変わり、再現性と秩序を保証する枠組みへと定義し直されたのです。
GoF(エーリヒ・ガンマら):デザインパターンによる橋渡し
1994年に出版された『Design Patterns』(通称GoF本)は、オブジェクト指向の実務的普及に決定的な役割を果たしました。著者はエーリヒ・ガンマを中心とする4人組(Gang of Four, GoF)であり、OOPを使いこなすための再利用可能な設計パターンを提示しました。
GoFが示した23のパターンの多くは、継承ではなくコンポジションを推奨していました。たとえば「Strategyパターン」「Decoratorパターン」「Observerパターン」は、オブジェクトの組み合わせによって振る舞いを柔軟に変える設計を提案しています。
この発想はスティーブ・マコネルの工学的規律とロバート・C・マーチンの原則論をつなぐ橋渡しとなり、OOPが「継承中心」から「コンポジション中心」へと進化する契機を与えました。
ロバート・C・マーチン:実務指針としてのOOP
ロバート・C・マーチン(アンクルボブ)は、OOPを現場で使える原則群へと整理しました。SOLID原則は、継承乱用を避け、インターフェースや依存性逆転を重視する姿勢を定式化しました。
また、TDDを広め、「動くコードで設計を検証する」というプラグマティックな方法を普及させました。ここでOOPは完全に理念から離れ、現場の意思決定を支える実務指針へと定着しました。
現代:三層構造でのOOPの姿
1. 実務主流派:アンクルボブのOOP
世界的にはアンクルボブ流が最も普及しています。SOLIDやクリーンアーキテクチャは企業研修に組み込まれ、現代の「OOPの顔」となっています。
2. 規律派の残存:マコネル的工学規律
特に日本の大規模業務システムでは、依然としてマコネルの体系が支配的です。標準化や品質規程を重視する文化では「コードコンプリートはバイブル」とされ、マーチンよりもマコネルが支持されます。
3. 理念的回帰:ケイ的思想の復権
- 学術的回帰:Erlang/Elixirのアクターモデルはケイ的メッセージ駆動を直系で継承。
- JavaScriptの影響:ES6以降のJavaScriptはSelf言語の流れを汲むプロトタイプベースであり、class構文は糖衣にすぎません。ここにはケイ的思想の影響が見られます。ただし、async/awaitやイベント駆動はOOPの文脈ではなく、並行処理・関数型的要素に近いと解釈する余地もあります。
- 大衆的復権:それでも、JavaScriptが世界中の開発者に「継承ではなくオブジェクトの動的相互作用」を体験させた点は、ケイの理念の大衆的復権と位置づけられます。
まとめ
オブジェクト指向の概念が誕生当初と現在で異なるのは、単なる言葉の誤解ではなく、歴史的必然でした。
- オレ=ヨハン・ダールとクリステン・ニガード:Simulaでクラスと継承を発明。
- アラン・ケイ:メッセージ駆動を理念とし、継承は副次的。
- ビャーネ・ストラウストラップ:C++で継承を産業の中心に据え、混乱を招いた。
- ジェームズ・ゴスリング:Javaで多重継承を禁止し、インターフェースを導入。
- スティーブ・マコネル:工学規律としてOOPを体系化。
- GoF(エーリヒ・ガンマら):デザインパターンでコンポジション中心の実務を普及。
- ロバート・C・マーチン:SOLIDとTDDで実務指針化。
- 現代:アンクルボブ流が主流、マコネル規律が残存、JavaScriptやアクターモデルでケイ的思想が部分的に復権。
OOPは常に時代の要請に応じて意味を変え、理念・規律・実務を往復する柔軟な器であり続けているのです。
Discussion