概要
世の中では動的型付きオブジェクト指向のことをダックタイピングと呼ぶらしい。なんでも、"If it walks like a duck and quacks like a duck, it must be a duck"、つまり、ダックのように歩き、ダックのように鳴けば、そいつはダックだ、という意味らしい。馬鹿げた話だ。動的型付きオブジェクト指向はむしろにゃんこタイピングがふさわしい。猫に帰依せよ。
背景
動的型付きオブジェクト指向言語はとかく誤解されがちである。例えば、世の中では、動的型付けのことを「型無し」と呼ぶことがあるらしい。とんでもない話だ。ほとんどの動的型付き言語は強い型付けがされている。そこで、動的型付きオブジェクト指向言語における型への捉え方として、動的型付きオブジェクト指向言語の1つであるRubyのコミィニティからダックタイピングと呼ばれる考え方が提唱された。
ダックタイピングとは、「ダックのように歩き、ダックのように鳴けば、そいつはダックだ」という視点で型を捉える考え方である。同様に、カモのように歩き、カモのように鳴けば、そいつはカモなのだろう。賑やかで結構なことだ。
ダックタイピングによって、あるオブジェクトがダックであると判定されたとして、だから何だというのだろう?焼いて食うのか?だとしたら、歩いたり鳴いたりすることと食われることの間に、一体何の関係があるのか。ダックならば必ず美味いのか?それとも一部の個体はマズイのか?何もわからないではないか。
ダックタイピングは、実践的なようでいて、実は何も言っていないのである。本ポエムでは、「にゃんこタイピング」を提案し、それに基づくオブジェクト指向プログラミングのプラクティスを示す。
にゃんこタイピング
ダックを叩けばクワッと鳴く。一方、我々は猫を叩くような理不尽なことはしない。猫には「にゃーん」と語りかけるのだ。すると猫は「にゃーん」と答えるか?必ずしもそうではない。猫は気まぐれなのだ。猫パンチをしてくることもあるし、多くの場合、何の反応もせずに無視する。たまに尻尾で反応を示すこともある。我々人間が猫の行動を規定しようなど、百年早いのだ。
猫と遊ぶのであれば、猫がどのような反応を示す、もしくは示さなくても、その猫を慈しみ愛でる、それが我々の立場である。額を撫でたら、鼻水を飛ばしてくるかもしれない。その鼻水を甘んじて受けるのが人間の務めである。猫に帰依する。それこそが我々と猫のあるべき関係と言える。
にゃんこタイピングに基づくオブジェクト指向プログラミング
オブジェクトとは猫のようなものである。オブジェクトにはメッセージを送る。叩いたり、外部からオブジェクト内部の変数に代入するような乱暴なことはしない。ダックならともかく、猫である以上、叩いてはいけない。
では何を手掛かりにメッセージを送れば良いのだろうか?メソッドの引数としてオブジェクトが渡されてきたと仮定しよう。ダックタイピングでは、叩いたりすることでダックなのかカモなのかを判定するらしいが、にゃんこタイピングでは、猫は猫であって、区別しても仕方ないという態度で臨む。どのような猫が引数として渡されてきても、猫は猫なのである。どのみち気まぐれなのである。撫でたからといって機嫌が良くなるとは限らない。どのような猫が渡されても、撫でたり、猫じゃらしで遊んであげたりする。猫がどのように反応しようが、それを甘んじて受け入れる。
動的型付けオブジェクト指向言語でのプログラミングでは、引数にどのようなオブジェクトが渡されようがそれなりに動くコードを書くことが理想である。もちろん限界はある。限界はある上で、原則として、引数のオブジェクトについて決め打ち的なコードはできるだけ避け、広く多様なオブジェクトを引数として受け入れ可能なコードを書く習慣を身につけることが、動的型付きプログラミング言語の基本である。
まとめ
猫に帰依せよ。オブジェクトは猫である。オブジェクトを選別するな。オブジェクトに任せよ。あるがままのオブジェクトの振る舞いを尊重せよ。いわんや、動的型付きのオブジェクトと契約など全くの無駄である。ってのは言い過ぎですごめんなさい。