【初心者向け】ポケモンでオブジェクト指向をふわっと学ぶ

# はじめに
__オブジェクト指向とは何か。__
プログラミングを学んでいく上で欠かせないものらしいとわかっていながら、ずっと後回しにしていた方や何回学んでも忘れてしまう方(自分)に向けてアウトプットを兼ねて、馴染みのあるポケモンを例に自分なりにまとめてみました！
できるだけわかりやすい言葉でまとめているのでかる〜い気持ちで読んでくれたら嬉しいです！

# もくじ
[・オブジェクト指向の理解が困難なワケ…](#オブジェクト指向の理解が困難なワケ…)
[・オブジェクト指向誕生のきっかけ](#オブジェクト指向誕生のきっかけ)
[・オブジェクト指向とは](#オブジェクト指向とは)
[・オブジェクト指向で出てくる用語](#オブジェクト指向で出てくる用語)
[・ポケモンでオブジェクト指向を考えてみる](#ポケモンでオブジェクト指向を考えてみる)
[・さいごに](#さいごに)


# オブジェクト指向の理解が困難なワケ…
これにはプログラミング初学者ならではの理由があると思いました。

__・オブジェクト指向自体が考え方や概念であるため。__
__・書籍や記事での解説が実用的な例を使った解説ではないため。__

オブジェクト指向はルールがあって、それに従って書けば動く何かだ！と言うシンプルなものではなく、「概念」「考え方」であるために難しく感じてしまいます。「愛とは何か。」それを考えるのも難しいですよね。。

そして、未経験の人にとってはオブジェクト指向を知らなくてもポートフォリオなどは難なく開発できてしまうために、概念を知ったとしても使うことのメリットは感じづらいことも挙げられるかと思います。
前提として、オブジェクト指向はさまざまな機能を盛り込み、後々修正箇所が多岐に渡るような大規模な開発において力を発揮します。

また、書籍や記事で見る多くの説明は、そのページ内では理解できても、実際の開発現場の使い方が全くイメージできないなようなものが多いなと感じました。

# オブジェクト指向誕生のきっかけ
新たな発明には必ず背景があり、より良いものを生み出そうとする理由があります。オブジェクト指向の理解もまた、背景を知ることで深まると感じました。簡単に誕生のきっかけをまとめてみました。

時代と共にコンピューターの性能が向上し、開発規模が大きくなる。するとソースコードが膨大になり、複雑化することによってバグが多くなるという問題が生まれました。
__・修正したい箇所は一つなのに、他のコードも修正する必要があった
・一つのプログラムの追加や修正が他のプログラムに影響を与えてしまい、バグが発生。
・少しの機能を変更したいだけなのに修正しなければならない箇所が多い。
・冗長なコードで読みづらく、新規アサインメンバーが解読できない。__

以上のように修正が面倒なことや影響範囲が大きいと言った理由から大規模システムを作るのは難しかったみたいです。

このままでは、ソフトウェア需要に対して供給が追いつかない！！
時間が足りない、、、人手も足りない、、、なんとか解消しなければ、、、

そこで!!!
__システム開発の複雑化を解消するために作られたのがオブジェクト指向__
なわけです！


# オブジェクト指向とは
それではオブジェクト指向とは何か、どのような概念・考え方なのか。

<h3><font color="Red">いかに効率よく、わかりやすく、開発ができるか</font><h3>
<h3><font color="Red">そのために機能を共通化し、コードの重複を減らし、再利用性を高める</font><h3>

__これを突き詰めた考え方がオブジェクト指向です。__
しかし、これでは良くわかりません。概念を知っただけじゃその考え方が実際にどのように使われているのか想像もつきません。それがどれほど重要なのかもさっぱりです。。

そこで、以下の用語を使ってポケモンを例にオブジェクト指向をわかりやすく説明しようと思います！！

# オブジェクト指向で出てくる用語
・🌟クラス……設計図
・🌟インスタンス……実体/オブジェクト(モノ)
・🌟プロパティ……属性/性質
・🌟メソッド……機能/処理
・🌟継承……クラスからプロパティやメソッドを引き継ぐ
・オーバーライド……上書き

# ポケモンでオブジェクト指向を考えてみる

__ポケモンが持つプロパティ(属性)は
「体の色」「大きさ」「形」と考えます。
メソッド(処理)は
「鳴き声を発する」「技を繰り出す」だと考えます。__

どれもポケモン一匹ずつがそれぞれ持つものであり、異なるものです。

ポケモン図鑑に登録されているポケモンは全部で何種類でしょうか？
wikiによると、全部で908種類いるみたいです。。ポケモンすご。。

それではあなたがポケモン開発部隊だったとします。

<h4>ーーーーオブジェクト指向じゃない場合ーーーー</h4>

このポケモンたちそれぞれ"1匹"に対して、

__プロパティとして色、形、大きさをセットして、、、
さらに鳴き声を発する機能をつけて、、、
さらにこんな鳴き声にセットして、、、
技を繰り出す機能つけて、、、
こんな技を使えるようにセットして、、、完了っと！！！__

__さっ！この工程であと907種類作るぞぉーー！！！(狂気__

想像しただけで涙が出ます。ここは地獄でしょうか。あぁ、アニメがみたい。ゲームがしたい。実家の味噌汁を啜りたい。。。

それではオブジェクト指向の場合どのようになるのか。

<h4>ーーーーオブジェクト指向の場合ーーーー</h4>

__全ポケモンが共通しているプロパティ(色、形、大きさ)・メソッド(鳴き声を発する、技を出す)を変更を仮定して予め記述したポケモンクラス（ポケモンの設計図）を最初に作成する。__


__そのポケモンクラスを継承し、クラスにセットされた共通のプロパティとメソッドをその1匹独自のものに上書きしていく(オーバーライドする)だけ。__

例えば、「ピカチュウ」というインスタンスを作ろうとした時、
元々ポケモンクラスから与えられた「色」プロパティに対して「黄色」を、
「形」プロパティに対して「ねずみ」を、
「大きさ」プロパティに対して「40cm」を、
「鳴き声を発する」メソッドに対して「ピッピカチュ〜♪」を、
「技を繰り出す」メソッドに対して「10まんボルト」をはめ込みます。

__このようにしてクラスから与えられた情報に対して独自の見た目や技をはめ込むようにして唯一のポケモン(インスタンス/実体)を作れることができ、全てを0から書く必要がなくなります。__

__つまり、予めクラスに書いておいた、「技を繰り出すメソッドの定義や鳴き声をはめ込むための定義」等は改めて書く必要はありません。どんな技かを繰り出すのかをセットするだけです。__

修正箇所が見つかった場合も同様の考え方ができます。
一匹のポケモン（インスタンス）に修正箇所が見つかった場合、独立したそのポケモンのプロパティやメソッドを修正すれば良いだけで、その他のポケモン（別のインスタンス）に修正を加える必要はありません。
つまり、__修正ポイントを見つけやすく、修正による他のコードへの影響も少なく、修正箇所も自然と少なくなります。__

# さいごに
以上で、「オブジェクト指向とは何か、どういう概念なのか。」で述べた
<h4><font color="Red">いかに効率よく、わかりやすく、開発ができるか</font></h4>

<h4><font color="Red">機能を共通化することによって、コードの重複を減らし、再利用性を高めている</font></h4>

ということを突き詰めた考え方である。
と説明したのが少しは腑に落ちるのではないかと思います。

私自身まだまだ理解が乏しい駆け出しの身なので、間違えている箇所等ありましたらご指摘いただけると幸いです！
最後まで読んでいただきありがとうございました！