オブジェクト指向

メッセージ指向、クラス指向、インターフェイス指向

is 何

オブジェクト指向の一種です。実装方針のひとつと言い換えることもできます
オブジェクト指向 (OO) は知っていてもこれらは知らないって人が多かったので、ざっくりとまとめてみることにします。

メッセージ指向

アラン・ケイの「オブジェクト指向」。
……なんですが、これを説明するのは難しいです。
というのも、かなり間違って広まった部分が多い概念らしく、どれが正解なのかを掴むのが難しいので……

少なくとも重要なのはこのあたりでしょうか。

  • 「オブジェクト」が「メッセージ」を送りあう。
  • 「オブジェクト」は「メッセージ」を受けた時、その内容を解読して動作する。
  • 「メッセージ」という形で「要求」あるいは「結果」を表現することで、それ以外のどうでもいい部分は二次的に決定する。

ある意味では、マイクロサービスはメッセージ指向に近いのかもしれません。
いやまあ、本来メッセージ指向上の「オブジェクト」というのはサーバやら何やらのメタファーらしいので、むしろそれそのものなんでしょうか?

Smalltalkあたりが有名ですが、これも"誤った"メッセージ指向の下に進化してしまっている、という声も聞いたことがあります。

参考:
https://ubiteku.oinker.me/2016/05/09/what-is-oo-all-about/

クラス指向

ビャーネ・ストラウストラップ氏の「オブジェクト指向」。バートランド・メイヤー氏でもいいです。
(※前者はC++開発した人、後者は"契約による設計"を提唱した人)

「カプセル化」「継承」「多態性」という (今となっては古式ゆかしい) 三要素が必須とされています。
ストラウストラップ氏の本来の定義によると、これにコンパイル時型チェック機構、多重継承機構、アクセス制限(情報隠蔽)機構が続くとのことです。
……と、この時点で気づいたかもしれません。これってまさにC++のことなんです
(なので、本当ならこの三要素も「抽象データ型」「派生」「仮想関数」と呼ぶべきかもしれないですね)

良くも悪くも今最も知られている「クラスと継承」モデルで、大多数のロースキルプログラマの知るOOはこれでしょう。「車」クラスから「カローラ」だの「ハイエース」だのを派生させるってアレです。
実際のところ、Cをベースに、オーバーヘッドを起こさないようにOOを導入するのであればどうしたってこういう風になるんだろうなあ、という意味で納得感のあるタイプです。
実際、クラス指向は静的に解決するのが非常に得意です。だって定義にコンパイル時型チェック含んでるし
なお念のために言っておきますが、Javaはクラス指向ではなく後述するインターフェイス指向に分類される言語です。ジェネリクスとか型チェックろくなもんじゃないですし……

ちなみに、本来「クラス」なるものはオブジェクト指向とは無関係です。SIMULA (ALGOL系言語の一つ) に存在した言語機能だったとか。
そんな事情もあってかなくてか、オブジェクト指向を謳う言語やそれらに"使われる"ような者を「クラス指向」と揶揄することも少なくありません。

インターフェイス指向

(これの提唱者って誰なんだろう?)
有名所では、クラス指向で紹介したバートランド・メイヤー氏の"契約による設計"に代表される、高凝集・疎結合を目指す設計思想です。とりあえずJavaやC#はこれ

インターフェイス指向最大の特徴は特性を示すことができる点です。
例えば、

  • Listインターフェイスを実装している。こいつはListとして扱えるはずだ。
  • Comparableインターフェイスを実装している。ということはこの手順なら比較できるだろう。
  • Runnable?なるほど、とりあえず実行できるんだな?

中身も見ていないのに「なるほどお前はそういうやつなんだな」となっているのがおわかりでしょうか。
中身を気にすることなく、「お前はこういう動作をしてくれるんだな」という「契約」のもとに話を進められるというのは、非常に大事なことなのです。いちいち中身気にしないといけないとかやってらんないじゃないですか

なお、これが守られないと「お前これポンドじゃねえか!キログラムで計算しろよ!」なんて恐ろしい事態も起こります。
(なお、これは割と有名な航空事故の原因です。ギムリー・グライダーでググってみてください)

ところで、「これクラス指向でもよくね?」と思ったそこのアナタ。
鋭いですが、ちょっと惜しい。インターフェイス指向はクラス指向よりも後付けしやすいのが長所です。継承と違って、あくまで「私はこれができます!」というだけなのです。
「親子関係」なんてややこしいもの、気にしたくないでしょう?

おまけ: プロトタイプ指向

スクリプト言語にたまーに見るやつです。Selfとかioとか。
なんでもかんでもクラスだなんだってやったらめんどくせえだろ!!
……と思ったかどうかはわかりませんが、あらゆるオブジェクトを「汎用変数の塊でできた可変な構造体」として捉えるのが特徴です。乱暴ですが、要するに「オブジェクト=連想配列(Mapとかテーブルとか)」と捉える形式です。
クラスのような「静的な設計図」は全て廃止され、オブジェクトの生成は「空っぽのオブジェクトを作る」または「今あるオブジェクトをコピーする」のどちらかで行われます。

なお、JavaScriptはprototypeという属性を持ち、世の中ではプロトタイプ指向と称されることがよくありますがなんか微妙に違います
……ほんとにめんどくさい立場だなあこいつ。

参考: http://blog.anatoo.jp/entry/2015/05/05/163225