1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-23

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

Square Music

toppage.png


マジックナンバーとは

プログラム内で出てくる何の意図で使われているかわからない数字

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

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

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

上記のコードを見ると、90という数字がいきなり出てきています。
この数字こそがマジックナンバーです。

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

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

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

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

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

ポートフォリオでの利用

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

環境

言語 バージョン
PHP 7.2.34
Laravel 6.20.27

情報

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

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

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の中の下記の部分です。

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が使われていた場合

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

トランザクション処理の第2引数の5という数字は何に使われているのだろうか??と他の開発者・数日後の自分が感じる可能性があります。
それを避けるために数字の5を変数の中に格納してマジックナンバーを避けると他の開発者などが後日コードを見たとしてもなのために使用されている数字かがわかりコード自体の可読性が上がる。


デッドロック時のトランザクションのリトライ回数についての変数なので変数名を、
retryTimes = リトライ回数
という名前で変数を命名してトランザクション処理の第2引数に変数を格納しました。

その結果が

マジックナンバーを避けた場合
        // デッドロック時のトランザクションリトライ回数
        $retryTimes = 5;
        if (Auth::id() == $id) {
            DB::transaction(function () use ($selectRequestParameter, $updatingUserInfo) {
                $updatingUserInfo->fill($selectRequestParameter)->save();
            }, $retryTimes);
        }

上記のコードの様に**$retryTimes**を入れることにより5という数字が何のために使っているかを書くことにより、可読性が上がります。

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

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

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?