OOPのたとえ話が奇妙すぎる件


なんかそれおかしくないか?

個人ブログや初心者向けの書籍等でたまに見かけるのだが、オブジェクト指向プログラミングを実際のプログラミング言語で説明しようとする例として、長いことおかしいと思っていたことを文章にまとめたいと思う。

うまい例えが見つからないのは確かだが

そもそも説明しようとしている本人が継承やインタフェースについて「なぜそういう実装が必要なのか?」という原点を見失っているように思えてならない。無理やり例を作り出して、その例に沿って継承やインタフェースを実装して「便利だろ?」と自画自賛する例が少なくない。
だがその例えは日本じゃあ二番目だ。

OOPは進化論ではない

よくありがちな大間違い(最近は見かけなくなってきた)

  • Monkeyクラスに実装を追加してHumanクラスを作り~
  • DogクラスからPoodleクラスとChiwawaクラスを作り~

プログラミングと進化論や生物多様性とは本質的に何の関連もない。クラスに実装が追加されたり継承して異なる振る舞いになることを、生物の多様性とか環境適応になぞらえているのだろうがまったくの誤りである。

OOPは差分プログラミングではない

ある人の説明で、共通する処理を親クラスにくくり出し、処理の異なる部分だけをサブクラスで実装すればコード量が少なくて済む、というような内容を見かけたのだがアホか!差分プログラミングじゃねぇよと思わず心の中で叫んでしまった。そんなものはOOPのごく一部のそのまたごく一部の特性をOOPだと勘違いしているに過ぎない。

設計は具象から、実装は抽象から

飲食店に出向いて食事をして帰るというタスクを考える。
1.店に出向く
2.注文する
3.食べる
4.会計して帰る
これは飲食店がガストでもロイヤルホストでも通用する振る舞いだ。ということは具象オブジェクトであるガストとかロイヤルホストという部分は実は本質ではなくて、具象部分をそぎ落とした振る舞いのフレームワークを抽出することこそが大切なのだ。上記1~4のアクションを行うフレームワークを抽象的にクラス化することで、あとは飲食店がどこであろうが多少のカスタマイズと実装の追加で対応できる。後払い先払いが乱立している牛丼業界なんかは多少の工夫は必要だろうが、大枠は同じだ。

OOPの利便性はいい例題が少ない

なかなか理解するためのGoodな例題が少ないのがOOPの世界だと思う。
結城浩さんの本はなかなかいい書籍だと思うのだが、GoFのパターンをどう実装するか、という形式なので、現実の課題から具象をそぎ落として抽象フレームワークをいかにして抽出するか、という部分の学習には向かない。残念だ。