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

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

オブジェクトとは何か

まずはストレートに「オブジェクトとは何か」という問いを発してみましょう。 これは難問です。そして人によって解釈の違う概念でもあり、「これで正解」 というものがないのも実状です。しかし敢えてこの問いに一つの答えを出して みたいと思います。

オブジェクトとはアイデンティティーである

「オブジェクト」とは日本語で言えば「もの」です。しかし「もの」というだ けではそれこそ何でもオブジェクトになってしまいます。「何でもオブジェク トだ」という見方も一つあるのですが、ここではそれに「アイデンティティー」 という考え方を導入したいと思います。 「アイデンティティー」は日本語では「自己同一性」と訳されますが、「それ がそれであること」です。人間で言えば「自分が他の人とは区別された自分自 身であること」です。そしてアイデンティティーを備えた「もの」こそが「オ ブジェクト」なのです。

例えば薬局に錠剤の入った薬瓶が並んでいる所を想像して下さい。それぞれの 薬瓶には名前の書かれたラベルが貼ってあり、錠剤がたくさん入っています。 これらの薬瓶は取り換えの効かないものです。頭痛薬の入った瓶と胃腸薬の入っ た瓶は混同してはいけないものですし、同じ薬の入った瓶でも中身の多いもの と少ないものではまた違います。こういう、それぞれの瓶が他の瓶と取り換え が効かない固有の特徴を持っているという状態が「アイデンティティー」を持 つということです。それに対してその中身はどうでしょう?瓶の中には同じ 薬の錠剤がたくさん入っていますが、どの錠剤も他の錠剤とまったく同じで取 り換えが効きます。これがアイデンティティーのない状態です。

アイデンティティーのあるなしを見分けるには、「個体が識別できるかどうか」 を考えるとよいでしょう。アルバイト店員が薬剤師に「薬瓶を持ってきて」と 頼まれたとしましょう。アルバイト店員が「どの薬瓶ですか?」と聞くと、薬 剤師は例えば「一番上の棚の右から3番目のところにある『アスピリン』と書 いてある瓶を持ってきて」というように答えるでしょう。薬剤師は指定した場 所にある特定の薬瓶を持ってきてほしいのです。

それに対して「アスピリンの錠剤を10個持ってきて」と言った場合はどうなる でしょう?「どこに入っていますか?」と聞かれた時、「『アスピリン』と書い てある瓶に入っているから」と答えたならば、薬剤師はその瓶に入っている錠 剤ならどれでもいいのです。もし薬剤師がそれぞれの錠剤を識別しているとし たら、瓶に入っている「どの」錠剤が欲しいかを言うことでしょうし、それが できるように錠剤に通し番号が刻印されているでしょう。実際には錠剤はどれ も同じで全く見分けがつかないから個体識別はできません。そしてそれはアイ デンティティーがないということなのです。

もし薬局の棚の一段分が全部アスピリンの薬瓶であって、単に「アスピリンと 書かれた瓶を持ってきて」と言われたとすれば、瓶自体にもアイデンティティー はありません。薬剤師にとってはどの瓶だろうが関係ないわけなのですから。

クラスとインスタンス

アイデンティティーの概念が「違い」を強調する概念だとすれば、クラスの概 念は「同質性」を強調する概念です。上で「薬瓶を持ってきて」「どの薬瓶で すか?」というやりとりがありました。この時の「薬瓶」というのがクラスで す。個々の薬瓶はそれぞれにアイデンティティーがあって他の薬瓶とは違いま すが、すべての薬瓶は「薬瓶である」という意味では同じなのです。

薬瓶すべてに共通する同じような性質があってこそ、それぞれの薬瓶の違いを あれこれ言う意味もあるのです。人間だってアイデンティティーについて悩む 時には他の人との違いについて悩みます。誰もコップやテーブルとの違いにつ いて悩んだりはしません。「同じようなものであって実は違う」というのが重 要なのです。

クラスという同質性を強く意識した場合に、同じクラスの中での個々の物体を 示す言葉として「インスタンス」という言葉を使います。「薬瓶」というクラ スに対して、個々の薬瓶のことを薬瓶のインスタンスと呼びます。これに対し て、「オブジェクト」という言葉は、こうした使い分けをあまり意識せずに、 単に「もの」という意味で使います。

属性

さて、オブジェクトとは「同じ性質を持つクラスの中でそれぞれのインスタン スが識別されること」であると述べました [1] 。それぞれのインスタンスのどこがどう違うのかというのを述べるのがオブジェ クトの「属性」です。 薬瓶の場合、それがどこに置いてあって中に何の錠剤がどれだけ入っているの かというのが属性です。「中に錠剤が入っている」という性質は同じでも、何 がいくつ入っているのかはそれぞれの薬瓶で違うというわけです。

それでは、属性の値がまったく同じならそれは同じものとして扱っていいので しょうか?例えば同じ形の瓶でアスピリンが同数入っている瓶が2つあったと したら、その2つの瓶の区別はどうすればいいのでしょうか?それとも区別は つけなくていいのでしょうか?それに対する答えが「識別子」という概念です。

識別子

属性の中で、特にインスタンスを見分けるためのものを識別子といいます。も し薬局がそれぞれの瓶に管理番号を振っていれば、「3番の瓶」と言うだけで 特定の瓶を持ってくることができます。そうでなくてもしまう位置が決まって いれば「一番上の棚の右から3番目の瓶」というように指定することができま す。この場合は「瓶の置いてある位置」が識別子です。つまり、数あるインス タンスの中から特定の一つを見分けて指し示すことができるものが「識別子」 です。

さて、識別子という言葉を説明したところで、前述の「属性の値がまったく同 じならそれは同じものとして扱っていいのでしょうか?」という問いに答えま しょう。それは私に聞くべき問題ではなく自問自答すべき問題です。もし区別 ができなくて困るのだったら、それぞれの瓶に番号を振るなりしまう位置を決 めておくなりすべきです。そして、瓶の通し番号やしまう位置を「属性」とし て加えましょう。結果としてそれぞれの瓶がまったく同じ属性の値を持つこと はなくなります。

もし属性の値がまったく同じ2つの瓶の区別をつけなくていいのでしたら、そ の二つの瓶は交換可能であり、つまりはアイデンティティーがないのです。だ からそれはオブジェクトではありません。 つまり、前述の問いの答えは「それがオブジェクトなら少なくとも一つは識別 子を持つ必要があるから、属性の値がまったく同じになる事はあり得ない」と いうわけです。

識別子が複数存在することもあります。瓶に通し番号を振ってさらにしまう位 置も固定すれば、「通し番号」と「位置」の2つの識別子を持つことになりま す。使用者はどちらを使ってもよく、それだけ便利に使うことができます。

ただ、識別子の多くは内部番号になるという点に注意して下さい。瓶に振る通 し番号は別に1から順番でなくてもいいし、数字ではなく文字であっても構わ ないのです。単に違ったマークさえついていればいいのですから。そしてプロ グラミング言語上ではすべてのオブジェクトにはポインタという通し番号がつ けられます。だから、単なるマークでいいのなら識別子は「内部の通し番号」 としておいて下さい。そうすればプログラマーが都合がよいように自由につけ られます。

「識別子」という概念があまり一般的でないのはこの事情があるか らでしょう。何も言わなければプログラミング言語が勝手につけるからです。 しかしオブジェクトの本質がアイデンティティーにある以上、それを識別する ものとして識別子というのは重要な概念です。

概念もオブジェクトである

オブジェクトとは目に見えて触れることができる「もの」だけではありません。 概念もまた立派にオブジェクトになり得ます。例えば「アスピリン」というの もオブジェクトです。「アスピリン」という概念はある薬効を持つ特定の化学 物質を指す言葉です。そしてそれはその名前でもって他の薬とは区別されます。 それは「薬」あるいは「薬の種類」というクラスのインスタンスです。

物質的な「もの」より「概念」の方がオブジェクトとして考えにくいかもしれ ません。しかし「もの」と同じ法則を適用すればいいのです。同じ種類のオブ ジェクトを集めたクラス(「薬」)があり、それぞれを区別する識別子(上の例 では「名前」)があればいいのです。そしてそこには属性(「化学式」や「薬効」) があります。

ドメイン

今までオブジェクトとは何でどういう性質を持っているものかを説明しました。 そしてアイデンティティーがないといけないという話もしました。しかしアイ デンティティーがあるかどうかというのは見方によって変わる話です。例えば 薬瓶に通し番号を振って区別しなくてはならないか、それともアスピリンの瓶 ならどれも同じでいいか、といった話です。どういう立場でシステムを見るか というのを「問題領域」あるいは「ドメイン」と呼びます。

同じシステムでも立場が違えば見方が違い、そして何をオブジェクトとするの かも違ってきます。薬剤師は薬を「アスピリン」のように名前で識別するのに 対し、仕入担当者は製薬会社の商品コードだけが重要でそれがどの薬でどんな 効用があるのかはどうでもいいかもしれません。単位も錠剤単位ではなく瓶の 数、あるいはケース単位かもしれません。人によってどのレベルまでは個体識 別が必要でどこから先は同じものとして扱っていいのかは違ってきます。それ を区別するのがドメインです。

ドメインを意識しないと、往々にしてすべての人の立場を全部盛り込もうとし てしまいます。そして「これはオブジェクトかどうか」という議論が起きます。 「これは○○の人にとっては重要だ」「いや、○○の人にとっては重要ではな い」と。これはどちらの意見も正しいのですから、当然のことながら平行線を たどります。そもそもの間違いはこれらを同時に議論することなのです。

オブジェクトについて考える時には常にそのドメインについて考えましょう。 「どういった観点から考えるのか」ということです。

オブジェクトとは「個体」

要するに、オブジェクトとは同種の他のものと区別することができる「個体」 のことなのです。そしてそこにはどの点で違うかという「属性」と、どの点で 同種だと言えるかという「クラス」があります。これだけを理解できたら、 「オブジェクトとは何か」を理解したことになります。


  1. 専門用語で書けばこういう事です。 ↩︎