メッセージメタファ有害論は有害か

調子に乗って 3本目。

メッセージメタファは、何かと「解りにくいOOPの解説」として槍玉にあがりがちなのですが、そう言うの場合、カプセル化や擬人化の説明として取り上げられ、メッセージメタファがポリモーフィズムを上手に説明しているという点はあっさり無視されている気がします。

メッセージを受け取ったとしても、実際にどう動くか(=どんなメソッドを起動するか)は受け取ったオブジェクト次第です(だって「命令」じゃなくって「メッセージ」なんだもの)。だから同じメッセージを違うオブジェクトに送れば、違う動きをするのは当然です。*1

動的ディスパッチを「メッセージ送信」に喩えるのは、ナイスな比喩だと思います。動的型言語ではポリモーフィズムは動的ディスパッチで実現されますので「メッセージ」という押しの弱さ感が上手くポリモーフィズムの雰囲気を醸し出しています。


* * *


ただ、注意しなければならないのは、動的言語と静的言語ではポリモーフィズムのカラクリが違うことです。

静的言語のポリモーフィズムは、サブタイピング(とオーバーロード)で実現されます。これは(制約があるものの)ポリモーフィズムと静的タイプシステムの「いいとこ取り」を実現する上手な仕組みなのですが、お陰でクラス継承とポリモーフィズムが切っても切れない仲になってしまいました。

動的言語では ポリモーフィズムにクラス継承は必須ではありません。このような世界ではメッセージメタファは理解を助けてくれますが、「継承関係にないとポリモーフィズムできない」世界では、メッセージメタファなんて全然嬉しくないでしょう。(静的言語のポリモーフィズムは、メッセージメタファの示すポリモーフィズムの仕組み とは全く違うんですから、このケースではむしろ有害です)

*1:良く聞く「犬に"鳴け"というメッセージを送るというが、現実の犬は鳴けと言ったところで鳴かないかもしれない」は、むしろ「そう言う物なんだよ、メッセージ送信って」です。