オブジェクト指向とは

この記事では、初学者がオブジェクト指向について学んだことをまとめたものです、ご了承ください。
#目次
- オブジェクト指向誕生の背景
- オブジェクト指向とは
- オブジェクト指向の具体例
- オブジェクト指向を用いられる言語
- まとめ
- 参考

##オブジェクト指向誕生の背景
技術が進歩していくことでプログラムが複雑化していく一方で、それに伴ってバグの発生頻度も増えていくことになる。
プログラムの一箇所だけを修正したいだけなのに、他のコードも合わせて修正する必要があった。
プログラムを追加したら、他のプログラムにも影響してバグが発生した。
などの様々な要因を解消できないかと開発されたのがオブジェクト指向プログラミング
##オブジェクト指向とは
オブジェクト指向とは、定められたルールではなく概念といった考え方のこと。
オブジェクト指向でコードを書く理由は、**変更に柔軟に対応できるようにする**ためです。
誕生の背景にある問題を解消すべく、**独立性・再利用性・拡張性**を兼ね備えた**「いかに効率よく、分かりやすく開発ができるか」**を突き詰めた考え方。
###オブジェクト指向の考え方
そもそもオブジェクトとは、関連する変数(値)とメソッド(動作)をまとめて、そのまとまりに名前をつけたものです。
オブジェクト指向では、そのモノを定義して、それらがどのように動作するのかを設計していくことからプログラミングが始まる。
設計とは、
モノの振る舞いや定義が明確になっているか
利用する人が分かりやすいような形になっているか
利用者が増えても拡張性の高いものになっているか
違うモノとの関連性でバランスが崩れないか


オブジェクト指向では3つの重要な要素がある。
**1,独立性(カプセル化)**
他のプログラムから干渉されないように作る考え方
**2,再利用性(継承)**
同じようなプログラムは共通化して使う考え方
**3,拡張性(ポリモーフィズム)**
凡庸的な形にできるようにしようという考え方

##オブジェクト指向の具体例
###5種類のキャラを作る
例えば、固有の職業を持った複数の主人公たちから一人を選んでストーリーを始めるRPGゲームを作るとする。
職業の種類は、剣士・魔法使い・格闘家・弓使い・槍使いの5つ。
<img width="60" alt="剣士" src="https://2.bp.blogspot.com/-kX0PnaF5PC8/W9RcW7TRweI/AAAAAAABPqU/tCXGl6Srcx44kp8pMx0OEc2AHzdC8qNUACLcBGAs/s800/game_ken_seiken.png"><img width="60" alt="魔法使い" src="https://3.bp.blogspot.com/-Y_Rasi56JrM/Wj4Iu7BemaI/AAAAAAABJPw/Vk7JkrhQzugji1WMNRiGrQUItnfXtIqOwCLcBGAs/s800/tsue_sennin.png"><img width="60" alt="格闘家" src="https://4.bp.blogspot.com/-NaePMSx20D4/XNE-mmPe3dI/AAAAAAABSq4/TsDCoNzxDqwqcllpyBllIE67LbcIn6X9QCLcBGAs/s800/body_punch_hand_red.png"><img width="60" alt="弓使い" src="https://4.bp.blogspot.com/-XrhkP4gaMdw/VMIvpXSjxlI/AAAAAAAAq_M/deHxUoeddfY/s800/yumiya.png"><img width="60" alt="槍使い" src="https://2.bp.blogspot.com/-vGhRFSu7AQQ/WKbK-rXOHBI/AAAAAAABB4k/4HqEm7dZIMImtNtT92P_Um5FTdjm0ojgwCLcB/s800/war_trident.png">
これらの職業は戦い方が異なるため、それぞれに定義が必要になってくる。しかし、いきなり５種類のキャラを作成するのではなく、キャラごとの特徴を精査して設計図をプログラミングしていく。
このときの設計図を**クラス**という。
クラスとは、モノの構成要素と振る舞いが定義されている、複数のデータの集合体からなるデータ構造体のことをいう。
構成要素(データ) = **プロパティ(属性)** 
振る舞い = **メソッド(処理)**

プロパティには、名前・年齢・出身国・HP・声
メソッドには、攻撃する・ジャンプする・声を発する

というような設計をする。これらは全てのキャラの骨組み(初期キャラクター)となる。

###5種類のキャラを設計する。
骨組みの初期キャラクタークラスから新たなクラスを作る場合、継承を使う。
**継承**というのは、初期クラスの機能つまりプロパティ、メソッドを引き継いだ新たなクラスを作ること。
親クラス(スーパークラス)
↓
子クラス(サブクラス) ※この時点ではまだ同じ機能

`Aの子クラスに特有のプロパティを追加`
剣士　名前:剣太郎、年齢:18歳、出身:日本、HP:100、声:男性
`メソッドを追加`
攻撃する→剣を振る、声を発する→「ｾｲﾔｰｯ!(松岡●丞風)」

`Bの子クラスに特有のプロパティを追加`
弓使い　名前:弓子、年齢:17歳、出身:日本、HP:100、声:女性
`メソッド追加`
攻撃する→弓を射る、声を発する→「ﾊｯ！(沢城●●き風)」

<img width="100" alt="剣士" src="https://3.bp.blogspot.com/-la0WXIEj3Og/VA7mbmBn1UI/AAAAAAAAmQY/FlJynwAD9ro/s800/yuusya_game.png">
剣士キャラであれば、攻撃は「剣を振る」になり、声を発するは「男性」キャラなので、男性の声に設定する。
クラスのメソッドを子クラスで上書きすることを**オーバーライド**という。
このようにオーバーライドによる継承したキャラが違う動きをする特性のことを**拡張性(ポリモーフィズム)**という。

また、プロパティのHPは攻撃を受けたときのみ通るメソッドからでしかいじれなくする。これは、何らかの形で外部から値をいじれてしまったら最大HPを超える値を入れることができてしまい、バグ発生につながるからです。
このようにプロパティのデータに正しい値が入ってるかをメソッドで判断して保護することで、他のプロプログラムから干渉されないように作ることができます。
このような独立性を持たせることを**独立性(カプセル化)**という。

###キャラ以外でも、、、
キャラ以外でもステージもモノとして捉えることができる。
ステージの場合だと、プロパティには、気候、モンスターエンカウント、土地の広さなど。メソッドには、気候によるキャラへの状態異常、エンカウントするモンスターの種類など。多くの多種多様なステージが作れる。
上記の例はとても簡素なため、もはや個別に設定すればいい話になるが、**実際の開発現場では、キャラクターやステージの共通部分が膨大になるため、こういった継承を使うことで手間を省くことができる。**
もし、キャラやステージの仕様が変更する場合、継承していなければ、すべてのキャラのプロパティを手直ししなければならない。それが継承していれば、初期キャラクターのクラスの1ヶ所だけ直せばよくなる。

##まとめ
このように継承をすることによって、共通のプロパティ、メソッドをまた書かなくてよくなるのでコードの重複を減らしてコードの再利用性を高めることができる。モノとして考える理由は、共通する特徴ある者同士をまとめて、プログラムを共通化するため。

共通化つまりクラスでまとめることにより、独立性、再利用性、拡張性がそれぞれ高まることになる。
つまり継承によって機能を共通化して再利用しやすくして、カプセル化によってプログラムが独立でき、ポリモーフィズムによって機能を拡張しやすくなり、よって**『効率よくわかりやすく開発』**することができるようになる。
###オブジェクト指向のメリット
- 同じようなモノを複製しやすい
- 機能の変更・追加がしやすい
- 大人数で開発するときに便利
- 大変な作業を無くす

###オブジェクト指向のデメリット
- 理解するのが難しい
- クラス別に処理する必要があり、詳細なクラス分けは返ってコードの複雑化に繋がってしまう
- 継承という仕組みによって、どこのコードが実行されているのかが分かりにくい(特に読み手)
- オブジェクトコードの肥大化
- オブジェクト指向のメリットを活かした設計能力が必要になる

###感想
オブジェクト指向の書籍を読まずにwebの情報だけで学んだため、改めて書籍でも勉強していきたい。
現時点では、実務においてのオブジェクト指向によるプログラミングがどれほど有用なものなのかは分からず、理論とともに実戦経験がなければ、それは測れないと思いました。
ただ、オブジェクト指向を用いられる言語を学ぶ上では、とても大切な考え方なので今後とも勉強していきたい。
##オブジェクト指向を用いられる言語の一例
Java、Ruby、Python、PHP、C++、JavaScript、Swift、Eiffel

また、オブジェクト指向以外の概念には、**手続き型プログラミング**、**関数型プログラミング**というものもある。
##参考
[【図解】オブジェクト指向とは？【完全マスター】
](https://u-ful.com/16757#i-2)
[オブジェクト指向と10年戦ってわかったこと](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)