哺乳類クラスって言うなキャンペーン

http://d.hatena.ne.jp/m-hiyama/20060203/1138935625
を見て笑った。
僕も「動物クラスのサブクラスに犬クラスと猫クラスを作って、『歩け』メッセージを送って歩かせてみましょう」とか馬鹿なことを書いてある本を読んでまったく意味がわからなかった。”うんうん抽象化と情報隠蔽と多態ですか。で、それは何がうれしいの?
オブジェクト指向を理解できた気分になったのは、GoFを読んでからだ。”なるほど!オブジェクト指向言語はこういうことができるのか!”
僕はプログラムで犬や猫を歩かせようと思ったことはなかったが、GoFに書いてあるような設計上の具体的な問題には多少心当たりがあった。


抽象的な説明のメリットは、それが実装に縛られないことだ。まったく違う処理系を持ってこられても説明だけは生きのこる。一方、デメリットはその説明が役に立たないことだ。例えて言うと、高校1年生にベクトルを教えるのに、線型性とベクトル空間の定義から入るようなものだ。
「集合Vの元について加法とスカラー倍を定義できて、∀x,y∈Vが以下の公理を満たすものをベクトル空間といいます。このような条件を線型性と呼びます。これらについていろんな性質があります。定義命題証明、定義命題証明…。さあこれでベクトルが理解できましたね?これでもう行列が来ようが矢印が来ようが問題を解けますね!
ヒント:無理。たいていの人間は、具体的な基底をとった行列演算とか矢印の比喩の助けなしに、いきなりこんな抽象概念を理解することはできない。


だから僕は初学者向けの説明は実装べったりでいいのではないかと思う。どこまでが実装に依存していてどこからが本質なのか理解することは最終的には必要だけれど、初学者に本質だけを教えてハイお終い!で理解できるわけがない。ここまでが実装依存ですね、っていうことが本当に腑に落ちるのは、色々な実装を見て回ったそのあとでしかないのではないかと思うのだ。