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

「メソッドは関数ではなくなった」

この事に気がつくと「メソッドは関数性を失った代わりに多態性を得た」ということに気が付きます。この事に気がつくともうひとつの不思議バズワードである

たかが関数の呼び出しを「オブジェクトにメッセージを送る」と言い換える

というオサレフレーズにも、新しく命名された必然性があることに気が付きます。どういうことか? ちょっと説明しましょう。「関数を呼び出す」この言葉は普通に使いますよね? では「メソッドを呼び出す」はどうでしょうか? これもよく使われますよね。しかしよく考えてみてください。

本当にメソッドって呼び出せますか?

呼び出すということは、呼び出し先を知っているということですよね? 病院の窓口とかで「誰々さーん、内科の診療室にお入りくださーい」なんて呼び出されることありません。 

メソッドはオーバライドされる可能性がある以上、確実にこのメソッドが呼び出される、と言い切れるなくなります(インスタンスが固定されない限り)。少しわかりにくいのでJavaのコードで説明します。

AnyClass any = new AnyClass();
any.anyMethod();

このコードは AnyClass#anyMethod() が呼ばれるのは確実です。それはany というインスタンスの状態が any = new AnyClass(); という代入によって状態が固定(厳密に言えば型が固定)されているからです。

しかし、この AnyClassクラスを引数やクラスフィールドに設定しただけで、AnyClass#anyMethod() が呼ばれるかどうかは不確実になります。たとえば、下記の様などこかのクラスのメソッドとして書きます。

public void someMethod(AnyClass any){
  any.anyMethod():
}

こうしただけで any.anyMethod() が AnyClass#anyMethod() を呼び出すかどうかはわからなくなってしまう。なぜなら

public SubAnyClass extends AnyClass {
  public void anyMethod(){
  } 
}

の様なAnyClassを継承したサブクラスを作成して

someMethod(new SubAnyClass());

と呼べば、someMethod 内部の any.anyMethod() は SubAnyClass#anyMethod() を呼ぶようになるからです。ある程度知っている人にとっては、説明するまでもないことですが。これがオブジェクト指向言語を学ぶ上で重要になる多態性(ポリモーフィズム)と呼ばれるものですが、ここでは軽く流します。

覚えておくべき大切な事は「メソッドは呼び先がよくわからない」ということです。そしてこの「よくわからない」という特徴がプログラミングを柔軟にした、ということです。さらにいえば、この「よくわからない」という特徴がシステムの「フレームワーク化」が可能になった理由だったりします。

さて、一休さん的なトンチワールドに突入してきましたねw 「よくわからなくなった」ことがプログラムの可能性を広げた、意味分かんないですよね? 

正確に言えば「どこかの誰かがクラス(メソッド)を継承(実装)した場合、オーバライドされるかもしれないメソッドが呼ばれるかもしれない」そんな、かもしれない運転的現象の事なのですが、余計にわかならなくなりましたねww

しかし、なぜよくわからないのでしょうか? それはメソッドが呼ぶものは

未来

だからですw … 電波さんスイッチON!! つまり

メソッドは未来人に向かってメッセージを送っているのです!!
ΩΩΩ「ナ、ナンダッテー!!」

正気をとりもどしましょうw ここで言う未来とは

どこかの誰かかがメソッドをオーバライドするかもしれない未来

の事です。メソッドは、static や final (Javaの場合) にしてオーバライド禁止にしない限り常に未来の誰かにオーバライドされる可能性があるわけです。つまり、未来のメソッドを呼ぶ可能性があるわけです。

そう考えるとメソッドを呼ぶ、とはいわば「どこかの誰かを呼ぶ」「未来を呼ぶ」ということと同義なので言葉として変ですね。

しかし、誰かが作ったクラス(メソッド)がいることは確実なので、それに対して「メッセージを送る」ならまあ意味は通るわけです。逆に言うと依頼メッセージしか送れなくなったんですね。お願いしまーす、きちんと処理してください〜〜、そんなゆるい依頼。このゆるさがプログラムの柔軟性を生んだわけですが、それについてはまた後で。

そろそろまとめます。個人的にオブジェクト指向を理解する上で重要だと思っていることは、この「メソッドが関数でなくなったことで得たものとは何か?」を理解することだと思っています。その答えを僕なりに短くまとめると

メソッドは関数性を失うことで多態性を得た。また多態性を得たことで、呼ぶことはできなくなったが、未来に向かってメッセージを送ることが可能になった。

と、やや強引な答えになりますw ここらへんはよく知る人にとってはツッコミどころが多い解釈かもしれません。「メッセージを送る、もSmalltalk由来では...」とかw

ただ、こんなことを初学者が頭に入れておくと学習をすすめる過程での気付きを早めるんじゃないか、などと考えていたりします。

まあ、ぶっちゃけ「メッセージを送る」なんてオサレな言い方は、俺も普段しないし普通にメソッドを呼ぶって言っちゃうけど、厳密には呼べないものだという認識は持っておくといいと思っています。

さて、脱線していく内に一体どこのレベルの人に向けて書いているのだかよくわからなくなってしまった感はありますが、まあBLOGなんでそんなもん、と流していただければ幸いです。

ということで、ようやく来週は本題に戻れそうです。