オブジェクト指向を語ろうと思ったけど、一旦クラスの話をしようwithアンパンマン

どうも、やまうちです。

先日(てか昨日読み終わった)この本を読みました。
「オブジェクト指向でなぜつくるのか 第2版」

[オブジェクト指向でなぜつくるのか](https://www.amazon.co.jp/dp/B00ISP0QB2/ref=cm_sw_r_tw_dp_U_x_CsehEbFS7DVXM)

有名な本なので読んだことがある方も多いとは思いますが、半分素人の弱弱エンジニアの僕はこの本からオブジェクト指向とは？を学ぶべく、3連休を利用して読んだんですね。
ということで、自分の理解度をチェックしつつアウトプットで知識の定着をはかりつつ、よくわからん！って方のためになるようわかりやすくアウトプットしていく感じの記事です。
ちなみに今回触れている内容はオブジェクト指向っていうよりも、クラスの話になります。

なんか違くね？
って思ったら最大限優しく教えてくださいm(_ _)m
最大限です。
※大事なことなので2回言いました

## クラスに備わる3つの仕組み
- まとめる
- 隠す
- たくさん作る

って書いてました！！！！
なのでこれに沿って書いていきます。

### まとめる
まとめるとはなんぞや？という話ですが、察しの良い方はすでにお気づきかと思いますが、まとめるってことです。←
はい。
とりあえずコードを書いてみましょう！ｗ
今回はPHPのコードです。
あ、PHPしか書けないので毎回PHPです。

```php
// アンパンマンのスタンダードな技
function anPunch(){ /* ロジックは省略 */ }

// アンパンマンがたまに使うただのキック
function anKick(){ /* ロジックは省略 */ }

// アンパンマンのまじ卍な技
function starlightAnPunch(){ /* ロジックは省略 */ }
```

このコードはまとまってない状態です。
書いてる場所的にはまとまってるかもしれませんが、今回はクラスの話なのでその観点的にはまとまってません。
ではまとめてみましょう。

```php
class AnpanmanAtack
{
    // アンパンマンのスタンダードな技
    function punch(){ /* ロジックは省略 */ }
    
    // アンパンマンがたまに使うただのキック
    function kick(){ /* ロジックは省略 */ }

    // アンパンマンのまじ卍な技
    function starlightPunch(){ /* ロジックは省略 */ }
}
```

AnpanmanAtackという**クラスでまとめました**。
これだけです！ｗ

んー、これだけだと中々便利さが分かりにくいと思います。
3人しかいないのに、「君たちを一つのチームとしてまとめよう！」って言われても、
「せ、せやな」としかならないですからね(；・∀・)
でもこれが100人くらいいたとしたら、「君たちはAチーム、君たちはBチーム・・・」
こんな感じでまとめた方が統制とれる気がしませんか？
**数が多くなればなるほど、まとめるメリットが大きくなります。**

それともう一つ。
クラスでまとめるタイミングで、少し関数をいじっています。
何をいじったかわかりますか？

そう、関数名です！
アンパンマンアタッククラスのパンチ、それすなわち**アンパンチ**。
アンパンマンアタッククラスのキック、それすなわち**アンキック**。
アンパンマンアタッククラスのスターライトパンチ、それすなわち**スターライトアンパンチ**。

関数名はクラス内でオリジナルであればモーマンタイなので、関数名の被りで悩むことがなくなります！
これもまとめるメリットですね。

### 隠す
さて少しクラスの中身(コード)を増やしながら「隠す」という話をしていこうと思います。
一旦コードを追加しましょう。

```php
class AnpanmanAtack
{
    // アンパンマンの調子
    private $condition;

    // アンパンマンのスタンダードな技
    public function punch(){ /* ロジックは省略(アンパンマンの調子次第で威力が変わるロジック) */ }

    // アンパンマンがたまに使うただのキック
    public function kick(){ /* ロジックは省略(アンパンマンの調子次第で威力が変わるロジック) */ }

    // アンパンマンのまじ卍な技
    public function starlightPunch(){ /* ロジックは省略(アンパンマンの調子が悪いと使えないロジック) */ }
}
```
※setConditionのようにコンディションの値をセットする関数だったり、newしたときにコンストラクタで初期コンディション値をセットする処理だったりも入れたいところですが、わかりやすさのために割愛しております。

アンパンマンは「顔が濡れて力が出ない」とか「元気100倍、アンパンマン！」とか
調子の幅がかなりエグいです。
ということでクラスの中に`$condition`という変数を用意しました。

`$condition`の前に`private`という修飾子がついているのに気づきましたでしょうか？
これは**同じクラス(今回のケースだとAnpanmanAtackクラス)の中でのみ使える**変数であることを意味します。
修飾子は変数だけでなく関数にも使えます。

ということで関数を見ると・・・！！
なんと`public`と書いてあります！！
これも修飾子ですね！！
やったぜ！！！

はい。
`public`は**どこから(クラスの外から)でもアクセスができる**ということになります。
ですのでアンパンマンアタッククラスの外からパンチを呼び出して、アンパンマンにアンパンチをさせることができるわけです。
※publicは記載しなくでも動作しますが、わかりやすさ的にも書きましょう

#### なぜ隠すのか

ではなぜ`$condition`をわざわざ`private`にしてクラスの外から使えないようにしているかというと、ズバリ**保守性**です。
「クラスの中でしか使えない ＝ 他では使っていない」
これが非常に大切です。

ちょいと例え話。
仮に「バイキンマンがアンパンマンに攻撃するクラス」があったとします。

- バイキンマンの攻撃はアンパンマンの調子に左右される
- アンパンマンの調子は「アンパンマンアタッククラス」のものを使う

中身はこんな感じ。
そうするとこんな弊害があります。

- 「アンパンマンアタッククラス」に修正が必要になる
- 「アンパンマンアタッククラス」を修正
- 「バイキンマンがアンパンマンに攻撃するクラス」にも影響があるため修正

「アンパンマンアタッククラス」を修正したいだけなのに、それに付随して「バイキンマンがアンパンマンに攻撃するクラス」の修正も必要になるわけです。
こういった状況は、可能であれば避けるべき状況です。
ですので`private`とすることで、そういった状況をさけることができます。

これが「隠す」理由です。
※protectedという修飾子もあり、これはそのクラスとサブクラスで使用可能です。

### たくさん作る
突然ですが、アンパンマンはナマモノです。
ち、違う？
ですので顔はなるべく更新していく必要があります。
そこで今回のたくさん作るです！！

```php
class MakeAnpanmanFace
{
    // ロジックは省略
}
```

こんなクラスがあったとしましょう。
おそらく製作者はジャムおじさんです。
僕の知る限りレシピは公開されていないので、ロジックが書けませんでした()

さて、アンパンマンの顔ですが、彼もヒーローモノの故にいつも一旦顔が濡れます。
ようするに必ずピンチになるということです。
そこからチーズが運転するアンパンマン号がやってきて、バタコさんがアンパンマンの顔をメジャーリーガー顔負けのコントロールと回転でぶん投げます。
なんと元気100倍です。

瀕死状態から復活することで強くなる。
ほぼサイヤ人です。

余談はこれくらいにして、何が言いたいかというと顔がたくさん必要ってことです。
安心してください！~~履いてｍ~~顔たくさん作れますよ！！

クラスがあればたくさん作れます。
特に細かい話はありません！ｗ

```php
$anpanman1 = new MakeAnpanmanFace;
$anpanman2 = new MakeAnpanmanFace;
$anpanman3 = new MakeAnpanmanFace;
```

もうなんぼでも作れますよ！
この**たくさん作れる**というのがメリットなわけです。
使うたびに新しいコードが必要だったら大変ですからね(；・∀・)

![それいけアンパンマン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281895/43e56cb4-6135-14fc-34da-f5e82fdc234a.jpeg)
※公式HPで画像GETしました。欲しい方はこちらからどうぞ↓
https://www.anpanman.jp/otanoshimi/index.html


## まとめ
クラスに備わる3つの仕組みについて書いてみました。

1. まとめる
2. 隠す
3. たくさん作れる

変数と関数をクラスでまとめて、他から使う必要のないものは隠して、使いたいときに何回でも使える。
クラスは便利屋さんなので、ぜひ覚えましょう！
今回触れたのはクラスの話のみでしたが、そのままオブジェクト指向も学びましょう！！

以上！！ｗ