マジックナンバーを避ける(ポートフォリオの工夫点)

今回は、私がポートフォリオとして<br>作成した音楽共有アプリの中で**工夫した点**について書いていこうと思います。
その中の<font color="red">**「マジックナンバーを避ける」**</font>について書いていきます。
# Square Music

![toppage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1020633/6b75e252-8d29-38c8-0e4e-a0e80020d83e.png)

http://square-music.herokuapp.com/

---
# マジックナンバーとは
**プログラム内で出てくる何の意図で使われているかわからない数字**

例：太郎さんの年齢と平均寿命を比べた場合

```php:マジックナンバーがある場合
<?php
    $avarageLifeSpan = 80;

    if($avarageLifeSpan < 90) {
        print '平均寿命より長く生きています。'.PHP_EOL;
    }

```
上記のコードを見ると、<span style="font-size: 90px;">90</font>という数字がいきなり出てきています。
この数字こそが``マジックナンバー``です。

**他の人がこの数字を見ると何の数字なの？？**
となると思う。

年齢について書いているので、何か年齢に関係した数字であることはわかるが、年齢の何を示している数字かがわからない！！この様な``マジックナンバー``を避ける方法として**変数に数字を格納してあげる**という方法がある

```php:マジックナンバーを避けた場合
<?php
    $avarageLifeSpan = 80;
    $ageOfTarou = 90;

    if ($avarageLifeSpan < $ageOfTarou) {
        print '平均寿命より長く生きています。'.PHP_EOL;
    }
```

この様に```マジックナンバー```であった**90**という数字を<font color="red">**変数に格納する**</font>ことにより**90という数字が何に使われている**かが誰にでもわかる様に記述することができる。

# ポートフォリオでの利用
私もポートフォリオ作成時に``マジックナンバー``を避ける様に開発をしてきました。
そのポートフォリオの``マジックナンバー``を避けた部分を書いていきます。

## 環境
|  言語  |  バージョン |
| ---- | ---- |
|  PHP  |  7.2.34  |
|  Laravel  |  6.20.27  |

## 情報
ログインユーザのユーザ情報更新(updateUserメソッド)の中の**トランザクション処理の際にデッドロックが起きた場合のトランザクションの試行回数**に5という``マジックナンバー``が入っているので、その``マジックナンバー``を避ける様にました。

**トランザクションとは？？(現在作成中)**

```php:UsersController.php
    /**
     * 自身のユーザ情報を変更するためのページ表示
     * 
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function editUser($id)
    {
        if (Auth::id() == $id) {
            $user = User::findOrFail($id);
            $registeredCountryName = $user->country->country_name;
            $registeredAgeName = $user->age->age_name;
            $sexName = $user->sex;

            return view('users.user_edit', compact(
                'user',
                'registeredCountryName',
                'registeredAgeName',
                'sexName'
            ));
        } else {
            return back();
        }
    }

    /**
     * 自身のユーザ情報を更新する処理
     * 
     * @param  App\Http\Requests\UpdateUserRequest  $request
     * @param int $id
     * @return \Illuminate\Http\Response
     */
    public function updateUser(UpdateUserRequest $request, $id)
    {
        $updatingUserInfo = User::findOrFail($id);
        $selectRequestParameter = $request
            ->only([
                'id',
                'first_name',
                'middle_name',
                'last_name',
                'email',
                'country_id',
                'age_id',
                'sex',
                'self_introduction',
                'insta_id'
            ]);

        // デッドロック時のトランザクションリトライ回数
        $retryTimes = 5;
        if (Auth::id() == $id) {
            DB::transaction(function () use ($selectRequestParameter, $updatingUserInfo) {
                $updatingUserInfo->fill($selectRequestParameter)->save();
            }, $retryTimes);
        }

        return redirect()->route('user.index')->with('flash_message', __('ユーザ情報を更新しました'));
    }

```
上記のコードの今回注目する部分は**UpdateUserの中の下記の部分**です。

```php:UsersControllerのUpdateUserメソッドの抜粋
        // デッドロック時のトランザクションリトライ回数
        $retryTimes = 5;
        if (Auth::id() == $id) {
            DB::transaction(function () use ($selectRequestParameter, $updatingUserInfo) {
                $updatingUserInfo->fill($selectRequestParameter)->save();
            }, $retryTimes);
        }
```

上記の**updateUserメソッドの中のトランザクション処理の第2引数**に``$retryTimes``という変数があるのがわかると思いますが、もし``$retryTimes``という**変数が使われずトランザクション処理の第2引数にただの数字の5**が使われていた場合

```php:マジックナンバーがある場合
        if (Auth::id() == $id) {
            DB::transaction(function () use ($selectRequestParameter, $updatingUserInfo) {
                $updatingUserInfo->fill($selectRequestParameter)->save();
            }, 5);
        }
```

トランザクション処理の**第2引数の5という数字は何に使われているのだろうか**？？と他の開発者・数日後の自分が感じる可能性があります。
それを避けるために数字の5を変数の中に格納して``マジックナンバー``を避けると他の開発者などが後日コードを見たとしてもなのために使用されている数字かがわかりコード自体の可読性が上がる。
<br/>
デッドロック時のトランザクションの**リトライ回数**についての変数なので変数名を、
``retryTimes = リトライ回数``
という名前で変数を命名してトランザクション処理の第2引数に変数を格納しました。
<br />

その結果が

```php:マジックナンバーを避けた場合
        // デッドロック時のトランザクションリトライ回数
        $retryTimes = 5;
        if (Auth::id() == $id) {
            DB::transaction(function () use ($selectRequestParameter, $updatingUserInfo) {
                $updatingUserInfo->fill($selectRequestParameter)->save();
            }, $retryTimes);
        }
```
上記のコードの様に**$retryTimes**を入れることにより5という数字が何のために使っているかを書くことにより、可読性が上がります。


#最後に 
個人開発の際に自分で書いたコードすら何日かたつと「このコードってどういう意味だったっけ？」となることがあります。

それが共同開発になると他人が書いたコードを読んで開発を進めていかないといけないのでできるだけ誰にもわかる様にコードを記述していかないといけないと感じました。

今回は、最後まで読んでいただきありがとうございました。