【CakePHP】1人前のケーキ職人になるまで

パティシエじゃないよエンジニアだよ

オブジェクト指向とは何か

さて、今回はオブジェクト指向について勉強します。

プログラミングをしていると、必ず聞く用語、オブジェクト指向
オブジェクト指向という単語を聞くだけで正直うわっとなってしまいますが、そうなってしまうのはオブジェクト指向の定義が曖昧で、明確な答えが無いかららしいです。

確かに、Google等で調べてみてもいろんなサイトが様々な解説をしているのでわかりづらくなることも有ると思います。

ここでは、ざっくりとオブジェクト指向について話せるようになるくらいのレベルまで理解できたらなと思います。

オブジェクト指向とは?

オブジェクト指向とは、システムをオブジェクト同士の相互作用とみなす考え方のことです。
そもそもオブジェクトって何だよ、っていう話ですが、オブジェクトは内部構造を持つデータです。

例えば、ここに1匹の猫がいるとします。猫は、4本の足があり、目があり、耳があり、鼻がありますね。そういうあらゆるものがオブジェクトになります。

「猫」のオブジェクト
内部構造:
     ー耳
     ー目
     ー鼻
     ー口
     ー尻尾
     ー足

なんのために有るのか?

オブジェクト指向で書く理由、それは変更に対して柔軟に対応するためです。

オブジェクト指向によるアプリケーション開発は、変更されない箇所を軸に、頻繁に変更される箇所をクラスに抽出するプログラミングスタイルです。

例えば、格闘ゲームのシステムを作るとします。
そのゲームは50人のキャラクターが操作できて、それぞれアクションや繰り出す技が違います。そのキャラクターを一人ずつ設定していくのもいいですが、基本的な「走る」「ジャンプする」「ガードする」「攻撃する」のコマンドは誰でも持っているので、これをいちいち設定するのは面倒ですよね。ですが、必殺技や特殊コマンドはそれぞれのキャラクターで全然違ってきます。その場合は、基本コマンドを軸に、特殊コマンドをクラスに抽出します。そうすることで作業がとても楽になってきます。

オブジェクト指向三原則

カプセル化

カプセル化とは、オブジェクト指向プログラミングの特徴のひとつであり、
「他のクラスに見せたくない」もしくは「他のクラスから見えなくても良い」フィールドやメソッドを、private に設定すると見えなくできるということです。

例えば、あるエレベーターがあるとします。私たち乗る側から見たエレベーターの機能は、「開閉ボタン」と「階層ボタン」のみです。しかし、裏側のシステムでは管理のための非常に細やかなプログラムが動いています。

ここで、エレベーターのボタン以外に、裏側で動作するはずの機能ボタンがあるとしたらどうなってしまうでしょうか?もし、そのボタンを押してしまえば、予想しない動作が怒り、エレベーターがギロチンカッターになってしまう可能性もあるのです。

そのため、他のクラスに見せない、使用できないようにするためにカプセル化は非常に大切な原則になります。

継承

継承は親クラスの機能を受け継ぐ機能です。

例えば「猫」と「犬」というオブジェクトを作りたい時、「動物」というクラスをあらかじめ作っておけば、猫も犬も動物なので「動物」クラスを継承することができます。動物クラスにパラメータやメソッドが定義されているので、犬や猫オブジェクトでいちいち定義する必要性がなくなりますね。

また、「動物」クラスに変更を加えても、その変更が犬や猫にも反映されるので管理が楽になります。

ポリモーフィズム

クラスによって同一のメソッドで異なる処理が行えるという性質をポリモーフィズムといいます。

例えば、「人間」という抽象クラスに「挨拶」というメソッドがあるとします。
人間クラスを実装した「日本人」の挨拶メソッドは「こんにちは」ですし、「アメリカ人」の挨拶メソッドは「Hello」ということです。


メリットは、「人間」を使う側は「人間」というクラスにどの国籍の人が入ってるのかをしらなくても、「挨拶」をさせれば何かしらの挨拶をできることが確認できるので、実際の中身を気にしなくてもいいらしいです。

まとめ

オブジェクト指向について勉強してみましたが、簡単に説明できるくらいにはなったかなーと思います。ただ、実際に使ってみないと理解できない部分もあるのでそのあたりはまた追々していきたいですね。横文字覚えるの苦手なので頑張ります。。。

<参考にしたサイト>
eng-entrance.com

qiita.com

javalove.hatenablog.com