#はじめに#
オブジェクト指向について、聞いたことがある方も多いと思いますが初心者には理解しづらい壁の一つかと思います。(私もその一人です・・・。)これは当然のことで、そもそも概念的な話なので明確な答えはありません。人によって説明の仕方が違ったりします。ですから100%理解する必要はなく、ここでは何となくこんなものかな?と言う程度で十分かと思います。
#オブジェクト指向とは#
オブジェクト指向とは、プログラミングにおける考え方の一つです。様々な処理の一つ一つを「モノ」として捉えて、必要な場所で使います。単に処理を記述していくだけのプログラミングよりもたくさんメリットがあります。どんなメリットがあるのでしょうか。
・可読性が上がる
・メンテナンスが容易
・複数人での開発で役立つ
こんなところでしょうか。
####可読性が上がる####
車の設計図で例えてみましょう。例えば、赤・白・黄の3種類の車があったとしましょう。赤い車に走ったり止まったり曲がったりする機能を付け加えます。次に白い車に走ったり止まったり・・・、次に黄の車に・・・のようにいちいち初めから作っていると中々大変です。そして処理が増えれば増えるほどコードが長くなり読みにくくなります。
オブジェクト指向であればこういったことが解決できます。走ったり止まったり曲がったりする様々な動作をあらかじめ設計図に定義しておきます。そしてその設計図をもとに赤い車、白い車、黄色い車を作っていきます。そうすることでいちいち動作を記述する必要はなくなり、全体のコード量を減らすことが出来ます。
####メンテナンスが容易####
車にクラクションを鳴らすという動作を追加する場合を考えてみましょう。オブジェクト指向を使わない方法だと、赤・白・黄それぞれにクラクションを鳴らすと言う動作を追加する必要があるため、やはり結構大変です。3台くらいなら何とかなるかもしれませんが、これが100台だとどうでしょうか。残業確定です。
ところがオブジェクト指向だと設計図にクラクションを鳴らすと付け加えるだけでOKです。これが3台だろうが100台だろうが1000台だろうが一回の記述で済むので非常に簡単ですね。
####複数人での開発に役立つ####
あらかじめ設計図を作っておけば、その中身を詳しく知っておく必要はありません。車が走るメカニズムを知っていなくても設計図があれば作れると言うわけですね。これによって、複数人で開発をする際でも非常に効率よく行えます。
#用語#
オブジェクト指向には独特の用語がありますので一応覚えておきましょう。
####クラス####
クラスとはあらかじめ定義されたもののことを言います。車で言うと設計図に当たります。クラスから個別のモノを作っていくことが出来ます。
####インスタンス####
インスタンスとは、クラスから作られたモノのことを言います。車の設計図から作られた赤・白・黄の車がこれに当たります。設計図からモノを作ることをインスタンス化すると言います。
####プロパティ####
プロパティとは、インスタンスが持っているデータのことです。車の名前や色、メーカーなど様々です。
####メソッド####
メソッドとは、インスタンスが持つ動作のことを言います。走ったり止まったり曲がったりクラクションを鳴らすといった動作のことを言います。
#オブジェクト指向の3原則#
オブジェクト指向には3原則と呼ばれるものがあります。
・継承
・ポリモーフィズム
・カプセル化
の3つになります。
少し難しくなってきましたね。一つずつ見ていきましょう。
##継承##
継承とは、あるクラスを受け継いで新しいクラスを作ることを言います。
車の例で見ていくと、「車」と言うクラスには走ったり止まったり曲がったりといったメソッドやプロパティが定義されています。そこで、新しく「オープンカー」というクラスを作りたくなったとします。この時、最初から新しく作る必要はなく、「車」クラスからメソッドやプロパティを受け継いで「オープンカー」クラスを作ることができるのです。オープンカークラスは車クラスが持っているメソッドやプロパティを全て受け継いでいますので、走ったり止まったり・・・といった定義を改めて作る必要はありません。
##ポリモーフィズム##
英語で多様性といった意味になります。ポリモーフィズムとは簡単に言うと、異なるクラスで同じメソッドがあった場合に、クラスによってよしなにメソッドの動作を変えてくれるということです。よく、ゲームの勇者一行に例えられますが、戦士・魔法使いというクラスがあったとします。普通であれば、"パンチ"とか"魔法"といったメソッドがそれぞれ与えられると思いますが、仮に新しい剣士というクラスを作った場合には新たに"切る"というメソッドを作る必要があります。これと同じようなことが何十件、何百件と増えれば結構面倒ですね。
そんな場合に、役職に関わらず"攻撃"というメソッドを作っておけば、クラスをインスタンス化してメソッドを使う際に、クラスごとに区別する必要がなくなります。つまり、クラスによって同じメソッドでも異なる動きができるというのがポリモーフィズムという考え方になります。
##カプセル化##
カプセル化とはあるクラスが他のクラスから干渉を受けないような設計にすることです。外部からアクセスできると、何かの間違いでプロパティの内容が書き換えられてしまう可能性があります。こういったことを防ぐためにクラスの内部だけで扱えるようにする設定が出来ます。
具体的にはアクセス修飾子をprivateに変えることで設定ができます。プロパティやメソッドの頭にprivateと付け加えることでクラスの外から参照することが出来なくなります。アクセス修飾子にはその他にpublicとprotectedがあります。publicはクラスの外からでも参照可能で、protectedは自クラスおよび継承した子クラスからのみ参照可能になります。
#まとめ#
オブジェクト指向についてまとめてきました。いずれも共通しているのは、面倒な処理をしたくない、同じ処理を何度も書きたくない、読みやすくしたいといった思想からきています。実に合理的で美しい考え方ですね。
少し解釈が難しい部分もありますが、(私も理解出来ていない部分が多々ありますが)しっかり復習していきましょう!