最近久しぶりにオブジェクト指向の話が炎上もとい盛り上がりましたね。
せっかくなので私も一つ書いてみようと思います。ただ私は皆さんの言うオブジェクト指向というものが何なのかわからないので「オブジェクト」とは何かという話です。
#オブジェクトとは何か?
##歴史的な話
Wikipedia・主体と客体から引用します。
アリストテレスは希: ὑποκείμενον 英語表記:Hypokeimenon ヒュポケイメノン、という用語を用いていた。ヒュポケイメノンは、ヒュポ+ケイメノン =下に + 置かれたもの、という意味の語である。 またアリストテレスはantikeimemonという言葉も用いていた。これは「向こうがわに置かれたもの」という意味である。antikeimenonは『形而上学』においては、複数形で登場し、「たがいに対立しあうもの」という意味で用いられ、Περὶ Ψυχῆς 『ペリ・プシュケース』では単数形で登場し、「思考や感覚の働きに対置されるもの」という意味に使われた。 ただし、アリストテレスにおいてはhypokeimenonとantikeimemonは特に対をなしていたわけではない。
オブジェクトという用語が登場するのはアリストテレスからですが、オブジェクトという概念は師匠のプラトンのイデアにさかのぼることができます(次回書きます)。では、プラトンのイデアをさらにさかのぼると何があるでしょうか?もちろんソクラテス…ではありません。プラトンの書いたソクラテスは創作です。同様に弟子であったクセノフォンによればソクラテスは別にイデアとかクラスとかオブジェクトとかになりそうなものの話をしていません。対話例を見る限り論法はプラトンに受け継がれてそうですが哲学はだいぶ違います。
直接の親はプラトンも学んだピタゴラス学派、つまり幾何学に求めるべきでしょう。
##最古のオブジェクトは図形
ここに長さ1の線分があるとします。この線分の片方の点を中心にして円を書き、線分の両端の点を延長し円と交差させます。直径、つまり長さ2の線分が得られました!
このように、操作する対象としてのオブジェクト、あるオブジェクトに対して操作をすることにより得られた新しいオブジェクト、これが最古のオブジェクトです。これ以前にはオブジェクトは有りません。単に誰も「それ」の話をしなかったってだけですけどね。今でも誰も「オブジェクトはなぜオブジェクトであるか」って話をしてないですよね。そんなものがあると言えますか?ないのと同じです。一方、幾何学は定義され共有されたものであり、操作する対象を明確に必要とするものです。対象が無ければ操作することすらできません。ですから幾何学のオブジェクトは明確に存在し、かつ最古となるわけです。
##幾何学は現実世界と関係ない話
さて、幾何学というか数学は現実を把握し表現したものでしょうか?少なくともユークリッドの原論は最初にルールを述べて「これらのルールと要請に同意するならば貴方にとってこの書は正しい」と主張する形式で書いてあり、現実には全く触れていません。
私は数学者ではないので伝聞になりますが、数学は現実に縛られない存在だそうです。例えば現実の空間は3次元ですが数学は4次元の空間だって数学的に正しく扱えます。現実でない世界がもしあったとして、そこが3次元空間であるならば現実の3次元空間と同じように数学は適用できるはずだと。
一方、数学で現実を表現できるでしょうか?仮に数学で現実を表現したとして、その数学が現実と等しい事を証明できるでしょうか?真の数学は「計ってみたら正しかったは証明のうちに入らない」そうですのでおそらく無理でしょう。誰もが数学的に正しいモデルは他に何もなければ現実でもそのように振舞うだろうとしているだけです。我々工学屋にはそれで十分ですけどね。
##拡張されるオブジェクトの概念
ちょくちょく穏健派関数型言語屋の人がオブジェクト指向言語と関数型言語は両立できる!といいますが、彼らの言うオブジェクトはこのような「あるオブジェクトに対して操作をすることにより新しいオブジェクトが得られる」値オブジェクトのことです。両立できないわけがありません。
では何故、相性が悪いなどと言われるのか?それはオブジェクトという概念はその必要に応じて数学的に正しくない方向へ拡張されてきたからです。
ではどう拡張されたか、という話の前に拡張の準備をしなければなりません。
Identityの導入と、ParameterとArgumentの区別と、関数オブジェクトみたいなものです。
##IdentityとIdentifier
先ほど、線分を延長して元の線分を含む2倍の長さの線分を作りました。では、元の線分を含まないほうは元の線分と「同一」であるといえるでしょうか?同じ長さの線分なので同じものです。というか幾何学は「同じもの」を積み重ねていく論理です。しかし、作図の上では区別する必要があります。つまり、同じであるにもかかわらず別の存在として扱わなければなりません。これがIdentityです。そして、別の存在として扱うために例えばここでは点にA,B,C...などと区別できる名前をつけます。これが識別子Identifierです。作図された線分AB,線分BCは別々のアイデンティティをもった値オブジェクト、となります。この時、同じ識別子を持った別オブジェクトは存在しえません。一方、位置とは関係なく長さ1の線分としては同じです。この「位置とは関係なく長さ1の線分」はアイデンティティを持ちえないオブジェクト、値そのものとなります。プログラミングでもよくやるんじゃないでしょうか?値は識別子を当てるまでは単なる値ですが、同じ値だけど別の同じ値と区別するために別の識別子を割り当てるの。
##ParameterとArgument
今長さ1の線分をもとにして長さ2の線分を得ました。仮に私が紙にコンパスと定木で作図したとします。
私は作図した紙を捨てて新しい紙を用意し、コンパスを一度閉じ、また開いて同一の長さの線分を作図できるでしょうか?そもそも最初言った長さ1の線分というのは本当に長さ1だったのでしょうか?っていうか単位のない長さ1ってなんでしょうか?
このように、「それを使ってなんかするのはわかってるけれど具体的に何なのかは実際に始めるまで分からない」存在があります。これがParameterです。逆に、実際に書き始めたら「実際に与えられたから具体的に何なのかはわかってる」存在になります、これがArgumentです。数学の問題でよく任意の点、とか任意の線分、という言い方をしますがこれはどこでもいいというよりは「具体的にどこであるかとかどの長さとかを指示する方法がない」ということですね。
##関数オブジェクトみたいなもの
先ほど線分の長さを2倍にする幾何学的な操作を行いました。この操作をさらに繰り返すことでn倍の長さの線分を作り出すことができます。このように、操作を操作して新しい操作を作り出すことができます。寡聞にしてこれをなんと呼ぶべきなのかは知らないのですが、読者の皆様には関数オブジェクトみたいなものと理解してもらえるかと思います。
で、ここからが問題ですが操作はIdentityを持ちえるでしょうか?既知でしょうか?未知でしょうか?
同一オブジェクトに対する同じ操作が複数あったとして、結果は当然同じになるためそれを区別することはできません。長さ1の線分がIdentityを持ちえないのと同様に操作そのものもIdentityを持ちえないとするべきでしょう。
操作はParameterとしてObjectをとりますが、仮に同じParameterを取れば作成される新しいObjectも同じものです。つまりParameterは未知だとしても操作に限れば未知である部分はないので既知の存在と言えるでしょう。
つまりParameterが何であれ、操作は複数人が共有できるものであり、議論の対象にしたり操作を操作したりすることには幾何学的正当性があるという事です。
このIdentityを持ちえず既知である存在をこの連載では「普遍」と呼ぶことにします(使う機会あるかな…)。一般的に普遍というのは遍在する存在という事になりますがここではユークリッド原論で最初に前提を出したように、この「普遍」は同じ前提を受け入れた人が正しく同じものを共有できる存在、ということになります。
##もちろんこれはオブジェクト指向で言うところのオブジェクトではないわけですが
さて、私は作図した中である線分とある別の線分は同じであるという話をしました。これは元になっているArgumentは実際に与えられたものなので作図中は同じだからです。
そして、ある作図の線分とある別の作図の線分は同じではないという話をしました。これは元になっているParameterが同じとは限らないからです。
同じように、私が作図した線分と別の誰かが作図した線分は同じとは限らないでしょう。
では、私と読者であるあなたがオブジェクト指向の話をしたとして、私の言うオブジェクト指向とあなたの言うオブジェクト指向は同じものでしょうか?同じであることをどうすれば証明できるでしょうか?仮に違うものだとしたら、私たちは何の話をしてるのでしょうか?なんらかの結論や合意が形成されたとして、それは何に対する結論や合意なのでしょうか?
というわけで次回はモデルオブジェクトのお話です。
##手斧も投げておきましょうか
オブジェクトがなぜオブジェクトであるかを定義せずにオブジェクト指向を語っている方々、
あなたがたはいったい何の話をしてるんですか?
このようにオブジェクトは操作の対象として存在する何かです。数学が対象を選ばないようにオブジェクトもそれがどのようなものであるかは問いません。
特に〇〇はオブジェクトではないとか書いちゃってるあなた!〇〇は私の言及している対象ではないという矛盾した記述になっちゃってますよ!オブジェクトじゃなけりゃ何だっていうんですか!
あ、私は数学にも数学史にも英語にも哲学にも詳しくはないので間違いやより正確な表現がありましたら指摘お願いいたします。