エンジニア

オブジェクト指向プログラミングには2つの解釈があるからややこしい

オブジェクト指向プログラミング smalltalk c++

どうも、iOSエンジニアで、プログラミングスクール「テクテック」を主宰しているクウルス(@Qoo_Rus)と申します。

エンジニアとしてお仕事をされている方で「オブジェクト指向プログラミング」という言葉を聞いたことのない方はおそらくいないでしょう。

私もエンジニアになるための勉強をスタートして間もない頃に、オブジェクト指向プログラミングという言葉に出会いましたが、Google先生にオブジェクト指向プログラミングの意味を聞いてもイマイチピンとこない説明ばかりでした。

しかし、それもそのはず。

オブジェクト指向プログラミング言語の概念は、大きく分けて2つの解釈が存在して、2つの解釈の境界がしばしば曖昧に語られてしまうので、訳わからん説明になりやすいのです。

  1. アラン・ケイが初めて「オブジェクト指向」という言葉を創ったときの解釈
  2. ビャーネ・ストルヴストルップが「オブジェクト指向」の考え方を再定義したときの解釈

という2つの解釈が存在しているのですが、どちらの解釈も混ぜてしまうと意味わからん感じになります。

この記事では、主にプログラミングを勉強して間もない方に向けて

  • オブジェクト指向プログラミングで解釈の分かれない共通部分
  • オブジェクト指向プログラミングの2つの解釈の区別

を順番に解説していくことにしましょう。

クウルス
クウルス
区別をしっかりつけていくと、意味がわかりやすくなる(わかるとは言っていない)

解釈の分かれない共通項「クラス、オブジェクト」

まず、オブジェクト指向プログラミングを語る上で解釈の分かれない部分について解説します。

オブジェクト指向プログラミング言語に分類されるものは

  • クラス
  • オブジェクト

という言語仕様を備えています。

クウルス
クウルス
クラスとオブジェクトがない言語では、オブジェクト指向プログラミングとは呼べません(と私は認識しています)

クラスとオブジェクトを初めて備えた言語 Simula

まだ世の中にオブジェクト指向プログラミングという概念が生まれる前に、Simulaというプログラミング言語がありました。

Simulaは広く普及することのなかった言語ですが、その後の言語開発に多大な影響を与た言語です。

クラスとオブジェクトを初めて備えた言語であり、オブジェクト指向プログラミングという言葉を計算機科学者のアラン・ケイが生むきっかけになりました。

クウルス
クウルス
Simulaがオブジェクト指向プログラミングの草分け的な存在

Simulaに影響されてできた2つの言語から概念が作られた

Simulaから影響を受けて開発されたプログラミング言語がいくつか存在するのですが、その中でも代表的な言語が2つあります。

  • アラン・ケイのアイデアから開発されたSmalltalk
  • ビャーネ・ストロヴストルップが開発したC++
クウルス
クウルス
オブジェクト指向プログラミングという概念を形作った2つの言語

Smalltalkの解釈(提唱者の解釈)とC++の解釈(現在主流の解釈)

(引用元: https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A9%E3%83%B3%E3%83%BB%E3%82%B1%E3%82%A4)

 

オブジェクト指向プログラミングという言葉を創ったのはSmalltalk開発者のアラン・ケイです。

しかし、現在主流になっているオブジェクト指向プログラミングの解釈は、提唱者であるアラン・ケイが定義した意味とは異なっています。

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

(引用元: https://ja.wikipedia.org/wiki/Smalltalk

クウルス
クウルス
提唱者アラン・ケイのことが語られることが多いのに、現在の主流の考え方と違うのがややこしいポイント

Smalltalk由来の言語(メッセージパッシング重視の言語)

iOSアプリ開発の現場で現在も使われているObjective-Cが代表的なSmalltalk由来の言語です。

私は詳しくないのですが、他にもSelfというプログラミング言語もSmalltalk由来とのこと。

クウルス
クウルス
こちらはアラン・ケイの解釈で考えた方がいいかも

C++の影響を受けている言語(カプセル化、継承、多態性の原則を踏まえた言語)

C++における考え方が現在主流になっているだけあって、有名な言語が数多くあります。

iOSアプリ開発に使われ、私が普段書いている言語であるSwiftもどちらかといえばC++側です。(Objective-Cの影響も受けていますが、メッセージパッシングを重視していません。)

他にも

  • Java
  • Python
  • Ruby
  • JavaScript
  • C#
  • Kotlin

などがあります。

オブジェクト指向プログラミングの解釈は要チェック

オブジェクト指向プログラミングの意味を理解するのが難しい理由についてご紹介していきました。

大きく分けて二つの解釈が存在し、主流となった解釈が提唱者のものとは異なるのがややこしさの大きな原因です。

もし、2つの解釈を混ぜていたのだとしたら要注意です。

どの文脈で相手がお話しているのか、自分と相手の解釈にギャップがないかどうか、必ずチェックしながらやり取りすると良いでしょう。

Smalltalkについて詳しく知りたい方は、以下のブログがオススメ

「Smalltalkのtは小文字です」

https://sumim.hatenablog.com/

ブログ書いている方のTwitter

エンジニア/プログラミングスクール講師
クウルス
京都大学を中退してベンチャー企業の経営をしている26才エンジニア。 スポーツ動画分析アプリ「GENSEKI」の開発に取り組みながら、プログラミングスクール「TEKUtech(テクテック)」を主催。 趣味はゲーム(特に格闘ゲーム)と音楽(特にエレクトーンとゲーム音楽)で、そちらについてもブログをちょこちょこ。
\ Follow me /