オブジェクト指向とは何か

「オブジェクト指向とは何か」この根源的な問いの答えはなかなか難しいものです。ここではその難しく哲学的な問題に真っ向から挑んでみたいと思います。

オブジェクトの意味

さて、オブジェクトというのは実世界にあるモノや概念のことであって、オブ ジェクト指向というのは実世界のモデリングであるという話をしました。今ま でのソフトウェア開発手法では最小単位は「処理」であってそれを説明するに は「どんな処理をするものか」を書いたのに対して、オブジェクト指向では最 小単位は「オブジェクト」であり、それを説明するには「それは何か」を書か なくてはなりません。

では、オブジェクトの意味するところ、いわゆる「それは何か」を書くために は何を書けばいいのでしょうか。それについてここで話をしたいと思います。

さて、単刀直入にオブジェクトの3つの意味を挙げましょう。例えば「犬」と いうオブジェクトには次の3つの意味があります。

内包
犬とはどんなものかを定義する
外延
どれが犬かを定義する
機能
犬にはどんなことができるかを定義する

それではこれらについて順に見ていきましょう。

内包

まず、内包とは「犬とは何か」という問いの答です。辞書を引くと「食肉目イ ヌ科の哺乳類」とか「オオカミを家畜化した動物」といった事が書いてありま すが、これのことです。こういった説明を読むと、読んだ全員の頭の中に「犬」 という漠然としたイメージが浮かぶはずです。そしてそれが「犬」というもの なのです。

内包はどれだけ説明してもきちんと説明し切れない事に注意して下さい。そも そも「犬とは?」と聞かれて「イヌ科の動物」と答えるとは人をナメた辞書で はありますが、こうとしか言えないのも事実です。「オオカミを家畜化した」 とか「ペットとして広く飼われる」といくら説明を書いたところで、「犬とは 何か」の問いに答え切れるとは思えません。

内包を記述する時に犯しやすい間違いは、内包をできるだけ正確に記述しよう とすることです。内包は正確に記述できるものではないのであって、記述を読 んで各人の頭に同じものが浮かべばそれでいいのです。同様に記述にいちいち つっかかるのも間違いです。例えば「よく人に慣れる」という記述があったと して「うちのポチは飼い主にすら絶対に慣れないからあれは犬ではないのか」 と反論するのは間違いです。犬というものの大まかな性質を述べただけにすぎ ないのですから。

内包を記述するのは簡単なようで非常に難しい問題です。その対象が簡単なも のほど難しい事です。「犬とは何ですか?」という問いに的確に答えられる人 はほとんどいないはずです。ただ幸いなことに記述するのに難しい概念の多く は一言で言えば皆がわかる概念です。あまり深く首を突っこむのはやめましょ う。わかればそれでいいのです。

内包というのは概念であって漠然としているものです。内包は話をしている全 員に「あああれのことか」と同じイメージを持ってもらうためにあるものです。

外延

「犬とは何か」というのが内包でした。それに対して「どれが犬か」という問 いの答が外延です。概念的には「うちのポチと隣のジョンとお向かいのダック ス君と……」とこの世界にあるすべての犬を列挙したものです。もちろん実際 にはこのような事はできません。ですから実際にはだれかが何かを持ってき て「これは犬ですか?」と質問した時にイエスかノーかを判断する基準となる ものを外延と呼びます。「ポチは犬」「ジョンは犬」「タマは犬じゃない」と いうように。世の中のすべての犬が列挙できなければ、せめてこの判断をする のに十分な条件を定めることが外延を定義することにあたります。

例えば「うちのアパートでは犬は飼ってはいけない」という規則があったとし ましょう。すると、ひねくれ者のおばさんが「犬とは何か」と執拗に聞いてき たとします。「うちのジョンが犬だという証拠はあるの?そもそも犬って 何?」と。この場合の「犬って何?」というのは内包ではなく外延を問われて いるのですから、「犬とは食肉目イヌ科の動物で……」と言うのは無駄です。 そうした知識は目の前のジョンが犬かどうかを判断する証拠にはならない のです。 こういう場合には例えば「四足で歩き、ワンワンと吠えてうるさく、そこら中 にフンをして回る動物」というように「この条件を満たせば犬だ」という条件 を挙げることになります。

もちろん、外延もすべてを述べつくすことはできません。規則には必ず例外が ありますから。だからどこかで妥協が必要です。例えば「うちのジョンは 足を怪我していて歩けないし、だからフンをして回ることもないし、ワンワン と吠えたこともないんです」と言われれば、それが犬であるかどうかはともか く、別にアパートで飼ってもいいかなぁと大家さんは判断するわけです。外延 を記述する時には、その適用範囲(ドメイン)を考えて、必要十分なだけの記述 にします。ここでは「犬」というのはアパートで飼ってもいいかどうかを判断 するために定義したものですから、極言すればアパートで飼っても問題ないも のは犬ではないと言っても困らないわけなのです。

まとめます。外延とは「どれが犬か」あるいは「これは犬か?」という問いに 答えるためのものです。外延のすべてを正確に述べることは実際にはできませ んから、適用範囲を限ってそれに十分な条件を記述します。

機能

「犬」に対して「走る」とか「ワンワン吠える」とか「肉を食う」とか、その ものができる事を列挙するのが機能です。これもまた全部を列挙することはで きませんから、適用範囲を限って必要な機能を列挙することになります。

例えばペットショップに「番犬として犬が欲しい」と言えば、犬とは「人を察 知」して「知っている人かどうかを見分け」て「大きな声で吠える」ものです。 「愛玩用に欲しい」となれば「人に慣れ」「かわいくクンクンと鳴き」「見た 目も愛らしい」ものです。そしてその総体として「犬」はこれらすべての機能 を持ちます。ペットショップで「犬をください」と言えば「こいつはほとんど 吠えずにおとなしく、誰にでも慣れますよ」とか「こいつは耳が良く勇敢で速 く走ります」とかいろいろとアドバイスしてくれるでしょう。つまり、ペット ショップにおいては(そしてその他のほとんどの場面では)「犬とは何ぞや?」 というどうでもいい議論よりは「犬に何ができるか」の方が重要なのです。

たいていの場合「機能」というのはまっ先に問題になりますから、機能を列 挙するのはさほど苦労はしないでしょう。ただ、オブジェクトの説明として機 能しか書かないという例は多く見受けられます。オブジェクトの記述を書く時 は「内包」や「外延」と意識的に区別して書く必要があります。

内包こそが本質

オブジェクトにおいて本質的なのは「内包」、つまりオブジェクトとは何であ るかです。外延や機能はそれに比べれば副次的なものです。しかしプログラマ は往々にして「機能」を重要視したがります。これではオブジェクト指向の本 質は見えてきません。プログラムではなく実世界を考察するというのがオブジェ クト指向なのですから。

「内包」というものは正確に記述することができません。そしてそれが厳密性 を好むプログラマという人種には受け入れられないかもしれません。しかし、 本来は厳密性なんてどうでもいいのです。要は理解できるかどうかなのですか ら。

オブジェクトを正確に定義しようとすると外延による定義になってしまいます。 内包は厳密に定義することは不可能であり、また外延は厳密に定義するための ものなのですから、これは当然の帰結です。そしてその結果、外延による定義 が重要視されて内包による定義は忘れられてしまいます。時が経つにつれて定 義は形骸化し、文章の重箱の隅をつつくような論争が始まってしまいます。

何のためにオブジェクトの定義をするのかを忘れないようにして下さい。もの に名前をつけ、その名前と意味の対応付けを皆が共有するためのものです。 そして「意味」というのは「内包」です。