オブジェクト指向とは犬と猫は動物、バスとトラックは自動車
動物基底クラスを作り鳴く関数を実装し、動物基底クラスを継承する
何を言っているんだ?
この例えは自分が新米プログラマだったころ見た入門書かなにかに書かれていた例えだ。
当時は理解したつもりで居たが現場にでてプログラミングしようとすると全く役立たなかった。
正確に言うとオブジェクト指向プログラミングと言う機能の説明としては的を得てる。
しかし、どうその機能を使っていく、作っていくとなるとフリーズすることになる。
この例え、最初に理解できんと思った人は将来有望なプログラマやシステムエンジニアの素質があるかもしれない。
Tips「犬と猫 オブジェクト指向」で検索すると同じく異を唱える先駆者を見て回ると良い
理解できないポイントは人により異なるだろうが、今回重視するのは、なぜ動物でくくるのか、自動車で括る必要性がどこにあるのかと言う点だ。
プログラマが日常的に作っているものはメルカリに最安品が出たらツイートするプログラムだったり、商品テーブルからご希望に沿う商品を検索するシステムだ。
そこに犬と猫を動物で括り、鳴くのは共通だと求められる場面はどこにも存在しない。
つまり犬と猫は動物だと決まっているが
プログラマが作るソースコードには決まった正解が存在していることは稀である。
これを常に意識しなければならない。
(ベストやベターという話は出てくるが正解は無いと考える)
必要なのは想像力
"犬" と聞いて吠える、嗅ぐ、調教するあるいは、動物なのか4足歩行なのか哺乳類なのかネコ目なのかと思慮する想像力が必要である。
そのうえでどうして犬と猫に 鳴く を実装しなければならないのか考えなければならない。
「走る」は必要なのでは?とか「マーキング」はいらないのかとか「爪を研ぐ」はいらないのかなどなどあらゆる要素から必要なものを選びだすことが重要である。
これがオブジェクト指向の3原則「継承」「カプセル化」「ポリモーフィズム」に繋がっていく。
三原則がなぜ大切なのかはオブジェクト指向と10年戦ってわかったことが参考になる。
意識するのは使う側
「ツイート」するプログラムを「犬が鳴く」に置き換え、「猫が鳴く」は
「フェイスブック投稿」するプログラムとするともうちょっとわかりやすい例えに思える。
想像力を働かせ、このプログラムに拡張性がでてくるならどんな物をそうぞうするだろうか。
想像力を働かせ、このプログラムに拡張性がでてくるなら、「Google+」するだったり、「LINEに送る」「はてブに追加」機能の追加の予想ができればかなりいい線を行ってる。
これは使う側がSNSに投稿する機能を求めていると想像できたからだ。
その時点で求められた機能
この時点の想像できる粒度(抽象化カプセル化する単位)は「SNSに投稿する」とできる。
だが「メールでリンクを送信」する機能を追加となれば「SNSに投稿する」という粒度は崩壊する。
しかし「メールでリンクを送信」まで考えた実装をしてしまうと求められていない機能が載った過剰な実装になりがちだ。
多くのSNSがAPIを用意しており、さらにOAuthで認証するであろうという点で、
SNSに投稿するという粒度はその時点でもっともベターで妥当性のある実装あるとと主張できるだろう。
しかしこれらの判断は最初から出来るかというとそれは難しい。
これらを主張するためには経験と知識に裏打ちされた自信がなければ出来ない。
思考せよ
経験、知識、自信は悩んだ分だけ成長する。
現場に出ていくと初めのうちはテストだったり、クラス設計までされた設計書をもとにプログラミングして行くことが多く思うような経験知識がつかないかもしれない。
しかしそこで思考を止めず、想像を膨らませ、思考せよ。
つまりコーディング中なぜこの処理が必要なのか考えることが大切である。設計書には平気で辻褄が合わない事や常識知らずな事が書いてある。
(ログインIDを忘れたのに再発行にログインしてる必要があったり、パスワードを平分でDBに突っ込んだり)
それらを何も考えずあとから指摘され設計書に書いてあるからと言い訳するのは成長をするチャンスを失うことになる。
(とは言え多くの場面で設計書に書いてんだろオラアアァアア!!!という言い訳は多用するけどね…)
(まぁ大規模PJの一翼の木っ端だと全容を掴むのは難しいところも有るが…)
というわけで
先のツイートの例しかり適切な粒度は個人によって異なり正解は無い。
なので違和感を覚える人も居ると思うが少なくても考えて作られた実装、どういう粒度にするか考えた作りは仮にその粒度が変更になっても改修は少なく収まる場合が多いと考えている。
悲しくも大きく読みを外した場合でも早々にこのクラスは拡張できないと判断し、流用した別クラスを作ると決断するのも容易だ。
これは想像せず思考せず作られた1クラス1ファンクションで2000行を超える超大作なソースコードには不可能なことである。
考えて作った実装が役立たずであってもそれは次に生かせる成長になる。
それは考えた上での結論を導き出した結果は蓄積され次に同じ失敗を犯すことが減るからだ。
残念ながら考えないで作った実装では平気で同じ失敗を繰り返すのでこのような成長は得られない。
当然他人と衝突もするだろうが、奥せず考えを伝えよう。
それらすべてが経験となり、いざという時、かならず力になる。
以上
ご清聴ありがとうございました。
この記事
自社で新人教育のために夜も寝ないで昼寝して作った資料を再編したもので
これは自分自身がこの業界に入った時というか
学校にいる時からずっとモヤモヤしてたオブジェクト指向の説明に使われる”動物-自動車のたとえ”に対する10年前の自分への回答のようなものです。