オブジェクト指向プログラミングの原理

Unity Learnでオブジェクト指向プログラミングの原則についてのチュートリアルがあったので，「個人的に」メモしておく．
実際に学びたい方は[こちら](https://learn.unity.com/tutorial/principles-of-object-oriented-programming?uv=2020.3&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f751af7edbc2a0022cdbbb6)から元記事に飛べるので，そちらで学ぶことを推奨します．

# 概要

このチュートリアルでできるようになること：

- カプセル化の定義
- 継承の定義
- ポリモーフィズムの定義
- 抽象化の定義
- OOPの柱がどのように連携して，整理された効率的なコードを作成するかを説明すること．

## はじめに

プログラミングの練習を重ねるうちに，「もっと効率的にコードを書けるはずだ」と思うような状況が見えてくるはず．
例えば，コードをコピペしたり，
プロジェクトにスクリプトを追加する際に変数の保護レベルを何度も変更してしまったり，などなど．
このような観察はより良いプログラマになるための重要な要素である．
つまり，純粋なコードの機能を超えて，コードの使いやすさを考える．

コードの使いやすさを向上させる方法はたくさんあるが，経験を積むには，自分でやってみることに尽きる．
ここでは，最も一般的なプログラムパラダイム(パターン)の一つであるオブジェクト指向プログラミングを紹介する．

## オブジェクト指向プログラミングって？

オブジェクト指向プログラミング(OOP; Object-oriented programming)とは，
互いに関連するメソッドや変数をまとめて**オブジェクト**と呼ぶプログラミングパターンのこと．

![object](https://connect-prd-cdn.unity.com/20210527/learn/images/dd52fc80-78b9-4b64-ab9f-a54eae8fa313_98.png.2000x0x1.png "object")

データをオブジェクトに整理しておくことは，多くの利点がある．
コードがより理解しやすくなり，そのコードが何を達成しようとしているのかがわかりやすくなる．

また，オブジェクトを使用すると，コードのアクセス性を制御できるようになる．
つまり，プロジェクトを作成する際に，他の人が誤ってコードを壊してしまう可能性を減らすことができる．

プロジェクトには，少なくとも2人のプログラマが関わっていることを心に留めておいてください：
今から6ヶ月後，自分が何をどうしたのか，なぜそうしたのかを覚えていないはず．
OOPは，自分自身のためだけでなく，他のプログラマのためにも，コードをより読みやすく，壊れにくくする．

OOPの柱と呼ばれる4つの主要な原則がある：

- **抽象化**
- **カプセル化**
- **継承**
- **ポリモーフィズム**

この4つの原則を学び，適用するだけでよい．
それぞれの柱については，後ほど詳しく説明するが，ここでは大まかにおさらいしておこう．

## 4つの柱

![The Four Pillars](https://connect-prd-cdn.unity.com/20210602/learn/images/5c8e1698-2cbe-4051-9c19-8d7d37d56d7c_JP_PSA_3.3.0_FourPillarsOriginal.png.2000x0x1.png "The Four Pillars")

**抽象化**とは，他のプログラマが目にするスクリプトから複雑なコードを取り除き，
他のプログラマが本当に必要とする機能のみを公開するプロセスのこと．
詳細を「抽象化」することで，重複するコードを減らし，最も有用なメソッドに簡単にアクセスできるようになる．
抽象化の目的は，コードをできるだけきれいに保ち，他のプログラマや自分にとって使いやすいシンプルなものにすること．
> 先のRabbitクラスの例
Rabbitを動かそうとすると，Hopメソッドがあるので，
どのようにホップするかではなく，いつホップするかということに集中できる．

**継承**とは，親クラスを作成し，そこから子クラスと呼ばれる他のクラスを作成すること．
子クラスは，親クラスの機能をすべて自動的に受け継ぐ．
これにより，両方のクラスが利用する必要があるコードを書き換える必要がなくなる．
> 例
Bunnyという新しいクラスを作りたい！
このクラスは，Rabbitクラスと同様に，飛び跳ねることができる．
継承がなければ，すでに書いたコードをすべてコピーして新しいクラスに貼り付けなければならない．
継承を使えば，Rabbitクラスを拡張するだけで，Bunnyクラスがすでに持っている機能にアクセスできるようになる．
また，Bunnyクラスは，Bunny特有の機能を持たせることもできる．(Bunny用の餌を食べるなど)

**ポリモーフィズム**は，継承を利用する上で最も便利なものの1つ．
親クラスから継承したコードに別の機能を持たせることができる．
> 例
子クラスのBunnyは家畜化されたRabbitを表す．
Bunnyは，Rabbitと同じようにホップすることができるが，野生の親クラスより少し遅いはず．
ポリモーフィズムを使うと，Hopメソッドの内容をオーバーライドして，Bunny独自のカスタムコードを書くことができる．
メソッド呼び出しは同じままだが，どのエンティティで呼び出されたかに基づいて正しいコードが呼び出される．

**カプセル化**は，プログラマをコードの複雑さから切り離すという点では抽象化と似ているが，
ここではアクセシビリティという形でコードの安全性に重点を置いている．
カプセル化は，他のプログラマがコードを書くためのツールを提供し，
自分の変数やメソッドを意図したとおりにしか使わないようにできる．
カプセル化されたコードでは，他のプログラマは変数の値やオブジェクトのプロパティを簡単に変更することはできない．
他のスクリプトが自分のコードにアクセスするさまざまな方法をすべて考慮することは不可能なので，
自分が作成したものが意図したとおりにしか実行できないようにカプセル化する方がはるかによい．
> 例
Rabbitの耳のタイプが聴覚に影響するとする．
この値は一度設定されると，後から変更することはできない．
この値を確実に保護するために，privateに設定し，外部のスクリプトがアクセスできないようにする．

## ミッションにおけるOOP

このミッション[^1]の残りをこなしながら，プロジェクトの新しい機能を書くときに，どの柱を適用するか考えてみる．
次のチュートリアルでは，それぞれの柱を深く掘り下げ，自分のコードを反復し改善する方法を探す．

[^1]: [ミッションの詳細](https://learn.unity.com/mission/programming-systems-and-architecture?uv=2020.3&pathwayId=5f7e17e1edbc2a5ec21a20af)

## 最後に

ここで，重要なのは，プログラミングパターンはオブジェクト指向だけではない，ということ．
Unityで作るものすべてにオブジェクト指向のアプローチを使うことはまずない．
常に，直面している課題に対して最も理にかなったツールを選択することを忘れないこと．
とはいえ，OOPは確立されたものであり，新人プログラマには最適なツールである．
ミッションを進むにつれ，これらの核となる概念に関する知識を広げていくことになる．

次のチュートリアルでは，いよいよプロジェクト開始！
シーンフローを実装し，ユーザーが2つのシーンの間を移動してアプリケーションを終了できるように，ボタンを設定しよう！

> 前のチュートリアルでするんだと思ってた・・・
皆さんは次のチュートリアルからしましょうw

今回のチュートリアルはオブジェクト指向プログラミンの原理というものでした！
恥ずかしながら，オブジェクト指向プログラミングに4つの柱があることを初めて知りました．
(知らぬ知らぬのうちに使ってはいましたが)
僕は，成長するにはとりあえず手を動かすべきと考えてきましたが，
Unity Learnのような素晴らしい教材から学び始めるのが，最も有効な成長する方法なのかもしれません．

ありがとうございました．