オブジェクト指向って?

オブジェクト指向って何だろ?という話をする.よく話に上がるのが,

という三要素である.しかし,これらをよく考えると別にオブジェクト指向に限った話でもない.
例えば,「カプセル化」.これを単に「データメンバーのアクセスを制限し,公開されたアクセッサメソッド経由でないとアクセスできないようにする」ということにしてしまうと,Cのstaticな変数と代わりがない.
「継承」も「ポリモーフィズム」もオブジェクト指向言語でなければ実現できないというわけではない.ただ,書きやすいかどうかというとそれは別の話だろう.つまり,オブジェクト指向の三要素というのは,オブジェクト指向言語を使えば実現できる機能ではなくて,オブジェクト指向言語を使うと素直に実装できる機能だといえる.
カプセル化にしても,「データとメソッドが一体化」していることによって,素直に実現できていることが嬉しいのであり,(あくまでも見せかけ上だけれど)インスタンスそれぞれにメソッドが実装されていると考えるのと,Cのようにファイルごとに公開されている関数があって,そのなかに変数が隠蔽されていると考えるのではどちらが自然だろうか?ということだろう.
ポリモーフィズムも,関数ポインタを使えば実装できることはできるので,構造体の中に関数ポインタを含ませておいて,インターフェースを統一化しておけば,似たことはできるが,そのプログラムはオブジェクト指向言語によるものに比べて煩雑になってしまう.
オブジェクト指向言語は結局,なにか特別なことができるというわけではなくて,データ群にメソッドがついているオブジェクトというものの単位を扱う場合に,素直に書けるということがうれしいのではないか?
そんなことをいってしまえば,すべての言語についても,ある特定の言語しかできないことなんて絶対にないのだろうし,チューリング完全であれば,表現能力は同じなのだから,当然なんだろうけど.
でも,これが,オブジェクト指向言語の導入メリットを言えといわれると,簡単には答えられない理由なのだろう.オブジェクト指向言語を知らない人から見ると,なにがいいのかさっぱりわからないはずだ.
Javaが使えるといって,長大なメソッドを作ってしまう人に「これはオブジェクト指向っぽくない」といっても,理解されないだろう.ちゃんとインスタンスを作っているし,メッセージ交換を行っているではないか?っていわれるかもしれない.どういうプログラムが良くて,良くないのか,どういうプログラムが素直なのか,ということを理解することから始めなければならないのだろう.