オブジェクト指向のメリットを車に例えてみる

# オブジェクト指向のメリットとは!?編

## [登場人物]
![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png) プログラミングを教える先生。技術一筋で説明は少し苦手のようだ  

![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg) プログラミング初心者 新人Aくん

## [オブジェクト指向のメリットについての話]

| ＊　　　＊ | 会話 |
|-----------:|:-----------|
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)先生| 「こんにちは、今日も頑張りましょう。早速ですがAさん、オブジェクト指向のメリットって何だと思いますか？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)新人A| 「こんにちは、今日もよろしくお願いします。オブジェクト指向ですか？えーと、名前ぐらいは聞いたことがあるのですが...」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「これから、プログラミング初心者にもわかるように、オブジェクト指向のメリットについてをお話しようと思います。身近な話なので理解しやすいと思いますよ。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はい、よろしくお願いします！」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「唐突ですが、Aさんは車の免許を持っていますか？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はい、一応持ってます。学生の頃取ったっきり一度も乗ってないペーパードライバーですが。」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「Aさんの免許証は、どのような車に乗れるのですか？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「えーと、いわゆる普通免許(中型免許)というやつなので・・厳密な定義は忘れましたが、普通程度の形、大きさの車に乗れるのだと思いますが・・」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「普通の車ということですが、普通とはどういった物を想像しますか？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「そうですね・・4つのタイヤがあってエンジンの力で走る。右足でアクセル、ブレーキを操作して発進、停止を行う。ハンドルで向きを調整する。といったあたりでしょうか？」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「そうですね。そのようなものだと思います。例えば、Aさんが今度新しく車を買うとして、車を変えるたびに免許を取り直す必要がありますか？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「まさか！そんな面倒なことをする訳がないですよ！」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「なぜでしょうか？車種によって微妙に操作が違っていると思いますが？場合によっては右ハンドルが左ハンドルになったりもしますね。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「その程度の違いは、乗りながら覚えていけば良い範囲ではないでしょうか？自動車なんてものは大体操作方法は同じように出来ているんですから。」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「つまり**一度免許を取っておけば、同じ様な操作方法の車には乗れる**ということですよね。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「そうですね。」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「実は、まさにこれがオブジェクト指向のメリットなんですよ。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「へ？」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「車種が変わっても免許を取り直す必要がないことは、Aさんにとってのメリットですよね？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「間違いなくそうだと思います。」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「車種の変更ごとに免許を取り直さなくてよい仕組みというのは、何がそうさせているかというと、**車を操作するための共通の方法を決めて、その統一した仕組みに従いましょう**ということを、各自動車メーカーが守っているからなんです。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「なるほど・・」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「各自動車メーカーが統一した仕組みを守ることで、Aさんはどの車にも免許の更新なしで乗ることが出来るのです。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はい、確かにそうですね。」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「このメリットをプログラミングの世界に持ってきたのが、オブジェクト指向という考え方なのですよ。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「えぇっ！？」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「Aさんと車の関係ですが、Aさんは車を操作する側、車は操作される側になりますよね？」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はい」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「オブジェクト指向の考え方をプログラムに取り込むと、**操作される側の変更に対して操作する側が影響を受けない、変更に強い構造**を作ることが出来ます。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はぁ・・」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「それを実現するために、*抽象クラス、インターフェース*というものがあるのです！」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「分かったような、分からないような・・」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「つまりですよ、*抽象クラスやインターフェース*で一般的な車の操作方法を定義しておく訳です。例えば、アクセルを踏む（進む）、ブレーキを踏む（止まる）、ハンドルを切る（曲がる）などです。車に共通した仕組みを定義するとも言えますね。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はい」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「この仕組みに従って操作を行う限り、**操作する側のソースコードは一切変更する必要がないようにすることが出来ます。これがオブジェクト指向の最大のメリット**なのです。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「な、なるほど！プログラムとしてどう実現されるのか実感としてはないですが、車の例は分かった気がします。」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「あるクラスの変更が他のクラスに影響してしまうようなクラス構成は良くないのです。変更は最小限（出来れば1クラス内）に留めるようにするのです。それが良いクラス設計というものです。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「はい！」 |
|![20121006_Profile_manet_square_small.PNG](https://qiita-image-store.s3.amazonaws.com/0/172671/628af233-b3bc-5a34-f1a6-a397b7be72a0.png)| 「それを実現するのが、オブジェクト指向の数々の概念です。以下にまとめておいたので、今回の話と合わせて考えて見てくださいね。」 |
|![publicdomainq-0007177ejz.jpg](https://qiita-image-store.s3.amazonaws.com/0/172671/b483d06e-dab8-fcdb-d59a-aa3960e7f082.jpeg)| 「ありがとうございました！！」 |
<br>
- - -

## [オブジェクト指向用語の説明]
### 抽象クラス/インターフェース
アクセル、ブレーキ、ハンドルで操作できるという特徴を定義するためのもの。
抽象クラスとインターフェースで実現できることは同じですが、使い分けるにはニュアンスの違いを理解する必要があります。
抽象クラスは概念としてモノがイメージできるものでなければなりませんが、インターフェースはモノではなく機能/操作だけを定義するものです。

車の例で言うと、
抽象クラス：車というモノ。車に共通する特徴を持つクラス。でも実際に実在する車のことではないので抽象概念となる。
インターフェース：アクセル、ブレーキ、ハンドルで操作できる何かという感じ。車以外にも同じ操作方法で操作できるものがあれば、同じインターフェースを実装する仲間と言える。

よく分からなければ、まずは同じようなものだと理解しておけば良いと思います。

### 具象クラス
アクセル、ブレーキ、ハンドルで操作できる実際のモノを定義するためのもの。
具象クラスとは、抽象クラスから派生したクラス、またはインターフェースを実装したクラスを指します。

車の例で言うと、
プリウス、スカイライン、インプレッサなど実際の車種を表します。

### 継承
抽象クラス/インターフェースと具象クラスの関係性を定義するためのもの。
継承している関係が、親子関係に似ているので、親クラス-子クラスと言われたり、基本クラス-派生クラスと言われたりします。
親クラスや基本クラスは抽象クラスでない場合もあるので、厳密には少しニュアンスが違います。

車の例で言うと、
車という概念と、プリウス、スカイライン、インプレッサという実際の車種の関係性を表します。

### ポリモーフィズム
車の車種が変わろうとも運転できますよということを定義するためのもの。
車種ごとの微妙な違いを上手く隠してくれる仕組みとでも言うんでしょうか。
具象クラスの違いを他のクラスへ伝搬させないようにする仕組み。

車の例で言うと、
プリウス、スカイライン、インプレッサと乗る車種が変わっても、運転手は免許を取り直す必要がないということを表します。