オブジェクト指向を教える方法を考える
オブジェクト指向とはなにか,と最近聞かれたので,メモ.
そもそもぉとかいう話をなしにすると,話がとても長くなる.
短いコードで,説明したいなとおもう.でもいい例が思いつかない.
結構,使い古された説明としては,
「スパゲティコードは保守しにくい,オブジェクト指向を導入すると保守が簡単になる」
とかいう説明がある.
でも,よく思うのは,初心者が勉強している次のようなコードを
<?php $given = "Kentaro"; $sur = "Ishitoya"; echo "$given $sur"; ?>
<?php class Person { protected $given; protected $sur; public function __construct($given, $sur){ $this->given = $given; $this->sur = $sur; } public function getFullname(){ return $this->given . " " . $this->sur; } } $kent = new Person("Kentaro", "Ishitoya"); echo $kent->getFullname(); ?>
のように書き換えても,あまり分かってもらえないということ.
使い捨てを前提に書かれたコードを,抽象概念を用いて再利用できるようにしても,何のメリットもないから.
特に言語仕様的にオブジェクト指向になっている言語でオブジェクト指向を教えようと思うと,日本に暮らしている平和ボケ(含む俺)に,イラクの人が平和について滔々と説明しても分かってもらえないのと同じくらい(あぁこの例えは逆もまた真だ・・・)難しいことになってしまう.
じゃーまずスパゲティコード書いてみようか!というのは仕事だろうが何だろうが,そんな時間はない!ということになってしまう.むしろ,教えてるほうが途中でいらいらしてきて,そんなコード書かせるくらいなら,俺が書く!とか言い出す始末.
彼らにとって一番わかりやすい説明は何だろうなぁ.
そういうものがあるってだけ,教えればいいのかなぁ.
それとも,プラトンのイデア論から英語と日本語の違いまで話したほうがいいのかな.でもそれってバッドノウハウに近いからな〜何でもかんでもオブジェクト指向しても意味ないし.
クラスの話で一番面倒くさいのは,class hieralchyとinterfaceの話.クラス階層の話をした後にインターフェースの話をすると,当然ながら全員ついてこない.
だって,abstract classで実現できることがinterfaceで実現できてるもんね.そんな純粋仮想関数ってのがあってぇ,って話しても分かってもらえないし・・・
抽象クラスは,classの物の抽象概念で,interfaceは操作の抽象概念だ!
いや,要は理論的な話と,実践的な話は必ずしも合致しないというか.
理想と現実はちがうというか.
PersonはPersonFactoryじゃ生成されないし,PersonFactoryはComponentFactoryからは生成されないし.
だのに,現場的には普通にありえる
<?php $person = ComponentFactory::getComponent("PersonFactory")->create("Kentaro", "Ishitoya"); ?>
なコードはどう説明すりゃいいんだろ.現場で
<?php $addressBook = ComponentFactory::getComponent("AddressBook"); $person = $addressBook->find("Kentaro Ishitoya"); ?>
とか抽象化しないし・・・普通はむしろ
<?php $dao = ComponentFactory::getComponent("PersonDao"); $person = $dao->getById(1); ?>
とか,抽象化されてんだかされてないんだか分からないコードを使うのが当たり前だし.
まぁ結局はコードかいてもらうしかないってことだよね.
スパゲティ書かせて,
「ほら見てごらんスーザン!」
「なぁに?ジョン.あぁらホント,すっごい綺麗になったわね」
ぐらいの衝撃を与えられる,サンプルないかなぁ.
もう,そのコード書かせただけで,クラスとメソッドとプロパティとクラス階層とインターフェースと,多態性と・・・あまつさえDIまで分かっちゃうみたいな!
・・・俺が知りたい.
ちなみに,後輩に依存性注入って言ったら,メダパニかけたみたいになってました.
あー.休み中に考えよ.とりあえず整理しとくと.
- 「そもそも論(英語・日本語・歴史・哲学orz)手法」
- 「スパゲティからオブジェクト指向」手法
- 「現場で覚えろ」手法
かな.教わるほうにやる気があるなら3手法織り交ぜればいいだけなんだけど.
あとは,インパクトがほしいな,楽しい!とか嬉しい!とかかっこいい!とかすげぇ!とか・・・情動的だな.
言語だし.
はてさてどうしたもんか.
まず,サーベイかな.