今日勉強したことを
つらつらと
logo

日本一簡単なオブジェクト指向入門!オブジェクト指向といえばクラスって言い出すやつは気をつけろ

2020/06/21 13:06

プログラミング始めたときに、必ずはまりますよね、オブジェクト指向。何言ってるかさっぱりわかりません。

オブジェクト指向とはで検索しても、的を射ない答えばっかり出てきます。

特に気をつけてほしいのは、「オブジェクト指向とは、カプセル化やポリモーフィズムといった~」という説明が出てくる場合です。カプセル化やポリモーフィズムはたしかにオブジェクト指向のテクニックの一つですが、実は本質ではありません。例えるなら、「自動車とは」の質問に対して、「タイヤとエンジンから構成されるものである」という説明をされているイメージです。ほしいのは「乗り物である」ということで、補足でエンジンで自動で動くとか、トラックや乗用車があるとかそういった情報がほしいところです。

使う必要ありますか?

わからない原因は、そもそも使う必要がないからだと思います。google が作った go 言語は、オブジェクト指向向きの機能は一部しか実装されていません。google に勤めるスーパープログラマたちが実際に開発していく上で不要だと思ったから削ったのだと思います。

オブジェクト指向の一番のメリットは、非常に複雑なプログラムを書く時に整理しながらコーディングできるメリットがあります。プログラミングしていて思うのは、優れたプログラマほど複雑なプログラムを書きません。シンプルに留めるスキルが高い人を優れたプログラマと呼ぶように思います。

つまり、優れたプログラマはオブジェクト指向も使いこなしますが、ほとんどの場合で必要としないのです。初心者プログラマも複雑なプログラムを書くことはないので、必要としないのではないでしょうか。

オブジェクト指向の本質

とはいえ、オブジェクト指向とはどんなものか知っていて損はないです。

オブジェクト指向の本質は「実体」と「側面」を切り分けて考えることです。

例えば「自分」という実体を考えてみてください。自分自身ではどういう人間かだいたい把握していると思います。しかし他の人からみたらどうでしょうか。例えば親からみたら、いくつになってもまだまだ面倒を見なければいけない子供という側面が見えますし、社会からみたら「学生」や「会社員」といった職業的な側面がよく見えます。

本質的にどういうものかという「実体」を object と呼び、外から見える見え方の「側面」は違うものだという考え方がオブジェクト指向です。

メッセージでやりとりする

実体の object に対して、「これやって?」というメッセージを投げます。例えば初対面の人と話すときは「ご職業は?」といったメッセージを投げると、「プログラマーです」といった返答が帰ってきます。

これは、「社交辞令」が実装されているオブジェクト同士なので実現できています。幼稚園児には社交辞令は実装されていないので、「ご職業は?」と聞いても「わかんなーい」と帰ってきます。

実装されていない場合の挙動は言語ごとに決められています。オブジェクト指向といえば Java ですが、Java はプログラムを書いた時点で「幼稚園児には社交辞令は実装されていないよ!」と怒ってきます。ruby は反対で、プログラムを書いた時点ではエラーはなく、「ご職業は?」と聞くとundefined method ‘ご職業は?’ for 幼稚園児という感じに「わかんなーい」と返事が帰ってきます。

ダックタイピング

Ruby のような場合はとても単純な方法で実現しています。とりあえず聞いてみてから考えます。「鳴け」とメッセージを送って「ガァ」と帰ってくるし、「姿を見せて」とメッセージを送ったら「白い体で黄色いくちばし」と帰ってきます。そいつが何者か考えてみると、「アヒルだ!」となります。このような方法をダックタイピングと呼びます。

Ruby のみでなく、javascript や Objective-C といった言語もダックタイピングを採用しています。

ダックタイピングは非常に高い柔軟性を持つ一方で、聞いてみるまでどうなるかわからないという問題があります。非常に複雑なプログラムを書くと、本当にここに来るオブジェクトがアヒルかどうか実行してみるまでわからなくなります。オブジェクト指向の考え方にはマッチしていますが、複雑なコードを整理したいためにオブジェクト指向言語を使用している人にとっては不便なものです。

静的型付け、インターフェース指向

ほんとうの意味でのオブジェクト指向と少し離れた考え方に、インターフェース指向があります。

インターフェース指向では、先に「ご職業は?」と聞けるかどうかを先に宣言します。現実ではありえない考え方です。先程の例でいうと、大人には「ご職業は?」メソッドが実装されてなければならず、幼稚園児には絶対聞いてはいけないことになっています。

この先に宣言する仕組みが Java でいう interface や class です。

Java などがインターフェース指向の言語です。オブジェクト指向といえば Java みたいな解説をたまに見かけますが、Java は厳密にはオブジェクト指向とは言えないのではないかと思っています。オブジェクト指向とはという解説で、いきなり class の話を始めるのは理解が足りないので注意しましょう。

どんな時にオブジェクト指向が役立つのか

オブジェクト指向は使っていて楽しいです。人間寄りの考え方ができるツールです。非常に複雑なロジックでも、自然な考え方ができるのでイメージを膨らませやすいです。

ただ、使い所はかなり限られてきます。プログラミングには(KISS の原則)[https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87]という格言があります。極力シンプルさを保つことはとても大事なことです。オブジェクト指向は「複雑なプログラムを作りやすくする」という KISS の原則に反したことを可能にするテクニックです。

もしもオブジェクト指向を使いこなしたと思ったら、シンプルさを損ねた間抜けになっていないか考え直してもよいではないでしょうか。


© 2021 simodake