オブジェクト指向で挫折しないために
![オブジェクト指向がわからない! オブジェクト指向がわからない!](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_02.jpg)
オブジェクト指向のプログラミング言語は当たり前の存在になり、たしかに目新しさはなくなりました。業務でオブジェクト指向のプログラミング言語が使っている方も多いと思います。
だとすれば、そもそもオブジェクト指向とはどういうもので、実際のプログラミングでどう役立つのか、特別に学ばなければならないようなものなのでしょうか。
考えてみてください。たとえRubyやJavaを使えているとしても、オブジェクト指向プログラミングができているとは限らないのです。Rubyを学び、Railsの本を読んで自動生成されるコードを書き換えることはできても、自分でクラスを追加することができない方もいるかもしれません。
![Rubyは使えるけどクラスの追加ができない Rubyは使えるけどクラスの追加ができない](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_04.jpg)
Ruby、Java、Pythonといった個別の言語を学習すると、どうしてもその言語の特徴や機能を中心に学ぶことになります。オブジェクト指向は技術書を読む前提知識として扱われがちで、実はオブジェクト指向そのものの考え方を学ぶ機会というのは意外と少ないのです。
そのため、オブジェクト指向の知識がないと、どんな技術書でも読み進めるのが辛くなり、結果として曖昧な知識のままになってしまう恐れがあります。
![途中で投げ出したい 途中で投げ出したい](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_05.jpg)
本書『アジャイル時代のオブジェクト脳のつくり方』はまさにこれからオブジェクト指向を体得したい方、かつて挫折して学び直したい方のために、「オブジェクト脳を目覚めさせる」ための入門書です。
オブジェクト脳を目覚めさせる!
オブジェクト脳を目覚めさせ、オブジェクト指向を正しく理解できれば、どんないいことがあるのでしょうか。本書ではRubyを通じて学習を進めていきますが、Rubyは非常に効率的な言語です。しかし、短いコードでたくさんの機能を実現するには、Rubyの思想そのものであるオブジェクト指向を学ばなければなりません。
オブジェクト指向を身につければ、読みやすく再利用性の高いコードを書けるようになります。もちろんRuby以外のオブジェクト指向言語でも応用が利くでしょう。
![効率のよい言語 効率のよい言語](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_06.jpg)
もっとも、オブジェクト指向は古い、これからは関数型言語だと考えている方もいるはずです。たしかに並列処理に優れる関数型言語には注目が集まっていますが、オブジェクト指向言語はまだまだ開発のメインストリームです。
そして、オブジェクト指向は初期の関数型言語であるLispの影響を強く受けていて、今注目されている関数型言語はオブジェクト指向の影響を受けています。関数型言語をいきなり学ぶよりは、オブジェクト指向を理解しておくほうが早道かもしれません。本書でも最後の第4部で関数型言語を解説しています。
それでは、どうやってオブジェクト脳を目覚めさせればいいのでしょうか。五感を使い、体(脳)を駆使するのです。本書に従って、理論の理解とその実践に取り組みましょう。
![五感を駆使して体で覚える 五感を駆使して体で覚える](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_08.jpg)
オブジェクト指向の特徴とは
ここからはオブジェクト脳を目覚めさせるための準備体操に入ります。
オブジェクト指向を理解するには、「オブジェクト」と「クラス」についてきちんと知っておくことが重要です。まずはそれぞれがどういうものか、どんなイメージがあるかを書いてみてください。
さて、オブジェクトとは何でしょうか。それは辺りにあるすべてのモノのことです。犬や猫など実体があるものだけでなく、天気や温度など実態のない概念も含まれ、プログラミングを行ううえで便利な単位として扱われるものです。
オブジェクト指向では、共有する性質を持つ仲間を抽出して分類する特徴があります。その分類をクラスと呼びます。クラスには三つの要素――名前(クラスそのものの名前)、データ(属性)、ふるまい(動作)があります。これらの要素を持つオブジェクトをまとめて定義したのがクラスというわけです。
ひとまず、これらオブジェクトとクラスがどういうものかを覚えておきましょう。
![オブジェクトとクラス オブジェクトとクラス](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_10.jpg)
それではオブジェクト指向の三大要素に迫りましょう。「継承」、「カブセル化」、「ポリモーフィズム」です。再び、これらの説明をイメージでいいので書いてみましょう。
最初に登場するのは継承です。オブジェクト指向で最も注目される特徴であり、上手に使えばプログラミングの効率を向上させられます。
オブジェクトは具体的なモノから抽象的なモノまで様々に分類されていますが、たとえば下図のようにオブジェクトが抽象化/具体化する過程で共有される特徴があります。
![抽象化と具体化 抽象化と具体化](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_09.jpg)
左の生物から右の会社社員まで、「生きている」「動く」「食べる」など同じ特徴を共有している関係を継承と呼びます。オブジェクト指向では、実装の際に抽象クラスが持つ機能を具体クラスに継承することができるのです。
![継承 継承](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_11.jpg)
続いて、カプセル化も今の自分が持つイメージを書き出してみてください。
カプセル化とは、オブジェクトにカバーを被せて中身を隠してしまうようなことです。なぜ隠すのかというと、オブジェクトが持つ属性を勝手に書き換えたり、属性を直接参照したりできないようにするためです。
そのため、オブジェクト指向では「君何歳?」と尋ねて他人が判断するよりも、「成人している?」と本人に尋ねるほうがいい設計だとされています(20歳で成人する日本人もいれば、18歳で成人するアメリカ人もいますからね)。
データや機能がばらばらに分散していると、誰に何を尋ねればいいのかわからなくなってしまいますが、カプセル化を利用するとデータや機能の範囲が明確になります。知りたいところだけを表に出すのがカプセル化の特徴です。実際にプログラミングでどう利用するかは、この時点ではまだ考えないでおきましょう。
![カプセル化 カプセル化](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_12.jpg)
最後にポリモーフィズムについて。これが最も想像しにくいかもしれませんが、今回もぜひどういうものか自分で説明してみてください。日本語にすると「多態性」です。
ポリモーフィズムは非常に便利な特徴の一つです。先ほどの生物-会社社員の図を用いると、同じニンゲンに指示する場合でも、それぞれニンゲンが持つ役割や性格によって同じ動作の結果が異なることがあります。
たとえば社長が姿の見えない3人の社員に起立するように言ったとき、新入社員は慌てて、主任は自信満々に、部長はゆったりと立ち上がるでしょう。社員は全員起立のメソッドを継承していますから、立ち上がりはするわけです。
ですから、逆に言えば社長が「起立の命令を出す」というやり方を変えなくても、社員側で起立の仕方を変えたり、起立の仕方が違う社員を用意したりすれば、多様な起立の仕方に対応できることになります。この多様なあり方をポリモーフィズムといいます。
![ポリモーフィズム ポリモーフィズム](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_13.jpg)
いよいよオブジェクト指向をプログラミングで……?
さて、頭の準備体操が終わりましたから、手を動かしてオブジェクト指向のとっかかりを掴み、真にオブジェクト脳を目覚めさせていきたいところです。
が、この先はぜひ『アジャイル時代のオブジェクト脳のつくり方』にて確かめてみてください。本書の続きでは、「社長命令・起立!プログラム」を書いていきます。現実世界にあることをモデル化して、オブジェクトとして表現していく演習です。
![社長命令・起立!プログラム 社長命令・起立!プログラム](http://cz-cdn.shoeisha.jp/static/images/article/10215/10215_14.jpg)
あなたのオブジェクト脳が本格的に目覚めるのは、これからです!