[477] 「オブジェクト指向再入門」について
投稿者:CES
2007/02/20 02:13:25
はじめまして。
なんか最近、自前のプログラミング言語を作りたくなって来たのであちこちフラフラしていて、こちらに流れ着きました。
「プログラミング言語を作る」のコーナーは、後ほどじっくり読ませていただきます。
さて、今回は一言「オブジェクト指向再入門」に物申させて頂きに参上仕りました。
文句ばっかりでなく、賛同とか感想の方が多いかもしれませんが…
「いい加減、わけのわからない「たとえ話」はやめよう」
賛成です。
この「わけのわからないたとえ話」というのは、「オブジェクト指向とはどういうものであるか」を、筆者なりに精一杯噛み砕いて説明しようとしたものだと思います。
しかし、それでも難しいという印象を持たれているのは、「どういうものか」は頑張って説明するけれど、「どのようにありがたいのか」が伝わらないためではないでしょうか。
「オブジェクトに「メッセージ」を送って…」
> 「メッセージ送出」と呼ばれているのは、たいていのオブジェクト指向言語では実のところ一種の関数呼び出しです。
重箱の隅を突っつくような指摘をお許しください。
オブジェクト指向で言うところの「メッセージ送出」が、大抵の(メジャーな)オブジェクト指向言語において「関数呼び出し」という形をとっているのは、確かにその通りです。
が、「オブジェクト指向」と「オブジェクト指向言語」は別のものであることは(非「オブジェクト指向言語」で「オブジェクト指向」を実現されている管理人様ならば)周知のことであると存じます。
「メッセージ」というと、ぱっと思いつくのが「(WM_CREATE などの)Window メッセージ」ですが、Windows のアーキテクチャというのは、まさにオブジェクト指向なのだと痛感させられます。
ウィンドウの原型を定義するウィンドウ「クラス」があり、個々のインスタンスであるウィンドウはそのクラスから作られ、振る舞いをカスタマイズしたい場合は「サブクラス化」し、「メッセージ」を送ると、同じメッセージであってもウィンドウごとに「多態的」な動作をする。
が、MFC なんぞ使わず SDK でウィンドウプロシージャを書いている人は、非オブジェクト指向言語を使っているんだなぁ、と思うと、何だか妙な気分です。
「オブジェクト指向で再利用性は高まるか?」
高まると思いますが、マルチプルインスタンスについて論じているらしい「こちら」のリンクが切れているので、先がすごく気になります…
「それは「カプセル化」なのか?」
> データ隠蔽ではなく実装隠蔽だ、という言葉があって、まあこれも
> 言葉遊びの匂いがしないでもないですが、同様のことを言っているように
> 思います。
(皆様からのご意見(2)より)
そういう文句を、ある Eiffel 本で見ました。
確かに、C++ でいうクラスで private にするものには「そのクラスがカプセル化するデータ」と「実装のために必要なデータ」の2種類があり、これを区別することは有用であると思います。
が、この Eiffel 本は「データを隠蔽してしまったら誰も触れなくなる。データは公開せよ」というわけのわからんことを言います。
それは Eiffel が「外部から書き込み可能な public 変数」という概念を持たないから言えることであって、その保護機能がない C++ では、変数を private にして getter のみ実装することは、Eiffel 風に言えば「公開」であると思います。
まぁ、この Eiffel 本は「だから C++ はダメな言語だ。さぁ、皆で Eiffel を使おう!」とか言い出しそうな勢いですが。
「継承について」
> 継承は、ソースの再利用の手段ではないということです。
うーん…結局、ソース以外の何を再利用するんだろう、と思います。
いや、言わんとすることはわかるんですが、突き詰めると、ソースの再利用じゃん、と。
「オブジェクト指向言語によるサポート」
> こんなの見た目が変わっただけじゃないか!
> 全くそのとおり。継承を考えない限りにおいては、オブジェクト指向言語といってもその程度のものです。
オブジェクト指向とは、ある日、何の前触れも無くぽっと生まれたものではなく、それ以前の歴史を脈々と受け継いだ上に、生まれるべくして生まれたものだと思います。
そして、「オブジェクト指向言語」とは、非オブジェクト指向言語よりもオブジェクト指向を「それっぽく書ける」だけの代物であって、正に「サポート」程度の役割しかないものだと思います。
オブジェクト指向の三本柱は「カプセル化」「継承」「多態性」だなんて、いったい誰が言ったんでしょうか。
結局のところ、(最初にも書きましたが)その三本柱が「何の役に立つのか」が見えないとダメなんだと思います。
C 言語で継承や多態性を実現するのは難しいですが、継承や多態性によって「何を成し遂げたいのか」がわかっているなら、きっと C でも素晴らしいプログラムが書けることでしょう。
もっと言ってしまうと、「オブジェクト指向」って、結局何なんだかよくわからなくなってきます。
おそらくそれは「オブジェクト思考」みたいなもんであって、「これ」というはっきりした形が無い「考え方」なんだと思います。
でも「じゃあ、その考え方に則っていればなんでもオブジェクト指向なのか」というとそんなことは無くて。…何なんでしょうね、オブジェクト指向って。
最後にひとつ、感じたことを言わせていただくと…
この再入門講座は「オブジェクト指向とは何であるか」ではなく「オブジェクト指向とは何でないか」を説明していることが多いように思えたのでした。