オブジェクト指向プログラミングとは結局なんなのか

この記事は第2のドワンゴ Advent Calendar 2015の5日目です。
ちなみに前日は@deflisさんでした。
先日の記事で分かる通りドワンゴ社員()なのですが、まぁ@mesoさんが「厳格な管理とかめんどくさいので、元社員も参加すればいいんじゃないかな。」とか言ってるしお目こぼし頂きたく…

去年のアドベントカレンダー記事は「関数型プログラミングとは結局なんなのか」というタイトルで、関数型プログラミングという語が何を指していて何を指していないのか、みたいなことをなるべく平易にまとめました。
なので今年は「オブジェクト指向プログラミング(以下OOP)とは結局なんなのか」という記事にしてみた…のですが、なにぶん語の指す範囲が広く、また自分も理解しきっているわけではないので、多少不正確な点があるかもしれません。
「関数型は流行りだけど、今更OOPかよ」とか思われるかもしれませんが、お付き合いいただければと思います。

OOPという語の曖昧さ

さて、一口にOOPといっても、人によってイメージするものがバラバラである可能性があります。
「動物クラスを継承した犬クラスと猫クラスが」とか「グワッと鳴けばアヒル」といった話から、「イマドキのオブジェクト指向はドメイン駆動ヘキサゴナルアーキテクチャだ」みたいな話までいろんなイメージを持つ方がいると思いますが、今回はオブジェクト指向の本質的な思想の部分を中心にまとめる予定です。

ところが困ったことに、OOPという語は2つの異なる系譜があったりします。

  • アラン・ケイがSmalltalkで提唱したOOP
  • ストラウストラップがC++で提唱したOOP

現在は、後者濃い目でこれらが混ざり合ったものに加えて

  • プログラミングではなく設計・モデリングの話

までOOPの範疇で語られていることも見かけることがあります。
これらの区別をつけないと議論の土台から噛み合わなくなってしまう可能性があるため、以降これらを区別して「アラン・ケイのOOP」「ストラウストラップのOOP」「オブジェクト指向のモデリング・設計」と呼び分け、順に見ていくことにします。

Continue reading