関数にしか見えないものが「メソッド」と新たな名前で呼ばれる理由(1)

前記事で「メソッドが持っている数学性と文学性という二重性」に気がつくきっかけが別にあった、と書きました。ここらへんはだいぶ後に書こうと思っていたことなのですが、流れ上先に書いちゃいます。

そのきっかけとは、多態性(ポリモーフィズム)の意味を理解したことで、この記事のタイトルにあるように「どうみても関数にしか見えないものが「メソッド」と新たな名前で呼ばれる理由」、呼ばなければならない理由に気がついた、というきっかけです。

「メソッドはどうみても関数にしか見えない」

この素朴な感想は、オブジェクト指向を学び始めた頃に誰もが思ったことだと思います。ぼくも、オブジェクト指向を学びはじめた時に真っ先に思いました。

「どうみても関数にしか見えないのに、なぜメソッドなどと言い換えているのか?」

という素朴な疑問。

その当時は無知だったので「オブジェクト指向信者とやらは、ただの関数を"メソッド"なぞというトレンディバズワードに言い換えてオサレピープルを気取っているイケ好かない奴らだYO」的な義憤をもって秋葉原あたりで反対デモを企画するくらいにはむかついてました。ちなみに、今でも無知なことは内緒ですw

しかし、勉強していく内にオブジェクト指向におけるメソッドはオーバーライド(上書き)されることにより多態的(ポリモーフィック)に戻り値を変える、ということを理解しました。

関数というものの数学的定義が

ある値に対して,ただ1つの値 が対応するような関係があるとき,この関係を関数といい,一般的に y = f(x) と表す。また x は y の関数であるという。

であるなら、多態的に戻り値を変える事は「関数ではない」ことになります。

※ 注意 ※

「数学的に正しい関数の定義とは何か?」を理解していない可能性があるので、ポリモーフィックに戻り値を変える事も「関数」なのかもしれないので間違った解釈かもしれませんが、とりあえずこの記事では「関数ではない」という解釈で進めます。間違っていた場合はご指摘をお願いします。

しかし完全に「関数ではない」と言い切ってしまうには語弊があります。あえてメソッドの持つ特性を上記数式に当てはめてみると

y = classInstance.f(x)

というような表記になるでしょう。だいぶ変ですし、そもそも数式でないですけどw しかし、こんなふうに表記して考えてみると、メソッドが関数である状態とは「classInstanceの値(状態)が固定されている時」であることがわかります。あたりまえですけどw

もう一つは、classInstanceの影響を受けなくなった時。つまりJavaで表記すると

public static int f(int x);

のようにstatic宣言され、インスタンスフィールドにアクセスできなくなった場合。まあこれも当たり前ですね。このコードコンパイル通らねだろ、というツッコミは無視の方向でw

あとは オーバライド不可にする final宣言された時も関数っぽくなりそうですが、classInstanceの状態に依存しているので除外しています。

逆にいえば、これら状態以外の場合は関数ではなくなっているわけです。

メソッドはインスタンスの状態に依存するようになったことで、数学的に関数とはいえなくなった

そんな風に考えると、ただの言い換えでは無かったことに気が付きます。つまり、オブジェクト指向言語におけるメソッドは数学的に関数とはいえなくなったので新たに命名する必要に迫られた。従来のプログラム言語における関数とは、機能・役割が変わったのだから新たに「メソッド」と名付ける必要があった。こう解釈すると命名する必然性に気が付きます。

まあ、こんな深刻に考えなくてもぶっちゃけ 「Smalltalk でそう命名されたからそう呼んでいるだけだろ?」と思わなくもないんですけどw しかし、こんな風にとらえ直すと

オブジェクト指向言語を表面的、文法的に理解しただけでプロジェクト管理に回された人 と
その後プログラミングを重ねてメソッドのポリモーフィズムの価値に気がついた人

の意識差の分水嶺が明確になると思うんです。つまり

「ただの関数をメソッドと言い換えて気取っている」という認識と
「関数性を失って多態性を得たからメソッドと新たに命名するしか無かったのだ」

という認識の違い。この違いに気がつくとあとはオブジェクト指向にのめり込むだけなので、気づきのポイントとしてこの「メソッドという言葉のとらえ方」は結構重要なのではないか? そんなことを思ってこんな文章を書いています。

メソッドという同じ物を見ているのにとらえ方を変えるだけで、「軽蔑」状態から、多態性の価値に気が付いた「尊敬、尊重」状態という真逆の精神状態にひっくり返る訳ですから、「考え方を変えさせるきっかけ」として「関数にしか見えない」という誤解を解くことから始めるというのは結構いい方法論なんじゃないかと思っています。

そんなことを考えているので「ただの関数をメソッドと言い換えて気取っている」という第一印象を引きずり続けていることが、オブジェクト指向以前のプログラム言語を知っているであろう管理者層の人達のオブジェクト指向を軽視する根本的原因なのかもしれない」などと考えたりします。

この仮定が正しいとすると

「メソッドは関数とは違うのだよ、関数とは

と、ランバ・ラル的方法論で関数ではないことに気づかせることが、管理者層の人たちの心を動かすのに結構有効に作用するんじゃないかと思うのです。だからそこを強調するために「関数性=数学的 多態性=文学的」という対比、比喩を基軸にした分析にしてみたわけですね。

もうちょっとだけ脱線は続きます。では、また来週。