オブジェクト指向には2種類あるのかもしれない話
メッセージパッシングを主とするオブジェクト指向とデータ整理の手段としてのオブジェクト指向のふたつについて
純粋なブログ記事としては2つ目です。今日研究室で聞いた、オブジェクト指向について、系統が違うふたつの世界について。
いろいろ調べていくうちに二つのオブジェクト指向とそれぞれのメリットという記事に出会ったので教授の話とこの記事をまとめて自分の中で納得できる状態にしたい。
そもそもオブジェクト指向とは、アラン・ケイが考案したメッセージパッシングを主とするオブジェクト指向と、それとは別経路で抽象データ型から発展していったオブジェクト指向があるみたい。
メッセージパッシングを主とするオブジェクト指向
端的には、「動的」なシステム構築を「メッセージング」を介して実践するプログラミング。究極的にはその先に、インターネットのような仕組みを封じ込めたシステム、あるいは、多細胞生物のような仕組みで動くシステムを目指していると考えるとイメージしやすい。
「二つのオブジェクト指向とそれぞれのメリット」より引用
私は普段C#を書くので、C#っぽい言葉で表現すると全てのオブジェクトが匿名型ないしdynamic
なイメージ?
この世界では「オブジェクトは均一で万能な細胞」として認識されているがゆえ、生成したあとにメンバーを付け足していく。この特徴はPythonやJavaScriptにも存在している。
class MyClass:
def __init__(self, name):
self.name = name
# インスタンスを作成
obj = MyClass("test")
# プロパティを追加する
setattr(obj, 'newProperty', 123)
# 出力:123
print(obj.newProperty)
let obj = {}; // 空のオブジェクトを作成する
obj.newProperty = 123; // プロパティを追加する
console.log(obj); // 出力:{ newProperty: 123 }
こういった言語の(あるいは世界の)オブジェクトは、それぞれ個別にメンバーの名前と実体のペアを持つ辞書を(少なくとも論理的には)内部に持っている。(Pythonでは__dict__
としてアクセスできるそう。)
この世界のインスタンスが持つべきメンバーは、多少継承によって束縛されているとはいえ、基本的にインスタンスの自由。インスタンスがこの型を持っているから、その型で約束された同一の挙動をするはずだという考えは通じない。
メッセージ・パッシングのオブジェクト指向では、メッセージを送られた側が何をするかは、基本的に、送られた側の判断事項です。たとえば、Observer パターンで、変更の発生をSubject から通知された Observer が何をするのかは Observer の自由であって、Subject 側は関知しません。
メッセージ・パッシングのオブジェクト指向の本当の狙いは、全体を構成する各部分が実行時に結合され、その結合のされ方も、ユーザーの振る舞いに応じてダイナミックに変わっていくような、非常に動的なソフトウェア構造を作り出すことでしょう。
あらゆるオブジェクトは相互にメッセージを送り合い、それらのメッセージの送り合いが広大に広がっているイメージとのこと。メッセージという表現をしている理由は英文法に近い形で表現できることにあると思う。
このような思想のもと設計された言語は結構あるみたい。
- Smalltalk
- JavaScript
- Python
- Objective-C
データの整理手段としてのオブジェクト指向
端的には、「ユーザー定義型(抽象データ型)」を、当初は「クラス」、今はそれに加えて「インタフェース」に準ずる言語機能によるサポートを前提として実践するプログラミング。俗に「カプセル化・継承・ポリモーフィズム」という三点セットに集約・象徴されるようになって久しいが、これはまず最初の「カプセル化」が「抽象データ型」を表わし、それを実現するために使用する「クラス」の特徴としての「継承」と「ポリモーフィズム」があとに続けられたものだと解釈すると言わんとするところの対応がつけやすい。
「二つのオブジェクト指向とそれぞれのメリット」より引用
抽象データ型でのオブジェクトは、データとそれを使った手続きのための関数のセットみたい。より誇張するなら、「実装の隠蔽」こそ抽象データ型でのオブジェクト指向の狙いなのかも。目的は堅牢性の向上やから実務目的ですかね。
個人的には、C言語などの構造体を由来とするように思う。
C言語の派生だから、手続型言語の面影を残すようにプログラムはMain
関数から始まってMain
関数へと帰っていく。
抽象データ型のもと設計された言語≒静的型付け言語
- C++
- C#
- Java