はじめに

もはや世間では、「オブジェクト指向」はプログラマにとって必須の技術になっています。

「そんなもの俺は知らん。今までどおり手続き型のプログラミングで行くんだ」 と強がってみても、今やプログラミング言語もライブラリもフレームワークも、 すべてがオブジェクト指向をベースにしています。 逃げようったって逃げられるものではありません。

なのに---どうも世間では、まだ「オブジェクト指向」というものを理解していない プログラマ---というか、オブジェクト指向に反発を持っているプログラマが 多いらしい。実例として適切かどうかはわかりませんが、 2ちゃんねるのプログラム技術板には いくつもオブジェクト指向関係のスレがありますし、 スレを読むと少なからず「アンチOO※1」 の人がいるようです。 そして、「アンチOO」な人は、どう見てもオブジェクト指向を理解しているとは思えない。

こんなことになってしまった原因は、 私はやっぱり説明が悪いことに尽きると思います。

世間の入門書では、オブジェクト指向といえば 「カプセル化」「継承」「ポリモルフィズム」ということになっていると思いますが、 実のところカプセル化なんてオブジェクト指向とは無関係に 昔から行われてきたことですし、継承やポリモルフィズムは、 必ずしも最初に覚えなければならないことではありません。 それに、「現実世界のモノをオブジェクトとする」なんて言われても何がなんだか わかりませんし、「哺乳類を継承して犬と猫を作り、 『鳴く』というメッセージを送ると犬なら『わん』、猫なら『にゃあ』と鳴く」なんて 謎のたとえ話をされても困ります。

私は、オブジェクト指向の「本質」と呼ぶべきものは、 カプセル化でも継承でもポリモルフィズムでもなく、 「マルチプルインスタンス」にあると思っています ※2(「マルチプルインヘリタンス」(多重継承)と 語呂が非常に似ていますが混乱しないように)。

少なくとも私の経験からすれば、継承やポリモルフィズムに行く前に、 「インスタンス」がちゃんと理解できない人は多いように思っています。 そして「インスタンス」は複数あってこそその意味を持つ (つまりこれがマルチプルインスタンス)わけですが、 そういう観点から説明している本やWebページはほとんどない。 「マルチプルインスタンス オブジェクト指向」でGoogleしてもヒットは0件 (2003/9/16現在)、「マルチインスタンス」ではRDBMSのインスタンスを指すらしい。 でも、C++ FAQには 以下の記述があります。

In C, encapsulation was accomplished by making things static in a compilation unit or module.

(中略)

Unfortunately this approach doesn't support multiple instances of the data, since there is no direct support for making multiple instances of a module's static data. If multiple instances were needed in C, programmers typically used a struct. But unfortunately C structs don't support encapsulation.

(中略)

In C++, you can have both multiple instances and encapsulation via a class.

拙訳

Cでは、カプセル化は、コンパイル単位(モジュール)ごとにモノ(関数や変数)を staticにすることで達成できます。

(中略)

不幸なことに、モジュールのstaticなデータには、 マルチプルインスタンスの直接のサポートがないので、 このアプローチ(訳注:Cで、staticを使ってカプセル化を実現する手法を指している)は データのマルチプルインスタンスをサポートしません。 もしCでマルチプルインスタンスが必要なら、 プログラマは構造体を使いますが、こっちはカプセル化をサポートしません。

(中略)

C++ではクラスによってマルチプルインスタンスおよびカプセル化の両方を使えます。

これを読む限り、C++ FAQは以下のように言っているように見えます。

私も同じように考えます。

こういうことを、私は、拙著「 Java謎+落とし穴徹底解明」や、JavaWorldの連載記事に書いてきました ※3。 しかし、本や雑誌を購入しなければ読めないようでは、 あまり多くの人には読んでいただけないように思います。 そこで、内容は少なからずかぶるのですが、Web上にも書くことにしました。 ※4