今回は、私がポートフォリオとして
作成した音楽共有アプリの中で工夫した点について書いていこうと思います。
その中の「マジックナンバーを避ける」について書いていきます。
Square Music
マジックナンバーとは
プログラム内で出てくる何の意図で使われているかわからない数字
例:太郎さんの年齢と平均寿命を比べた場合
<?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というマジックナンバー
が入っているので、そのマジックナンバー
を避ける様にました。
トランザクションとは??(現在作成中)
/**
* 自身のユーザ情報を変更するためのページ表示
*
* @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の中の下記の部分です。
// デッドロック時のトランザクションリトライ回数
$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という数字が何のために使っているかを書くことにより、可読性が上がります。
#最後に
個人開発の際に自分で書いたコードすら何日かたつと「このコードってどういう意味だったっけ?」となることがあります。
それが共同開発になると他人が書いたコードを読んで開発を進めていかないといけないのでできるだけ誰にもわかる様にコードを記述していかないといけないと感じました。
今回は、最後まで読んでいただきありがとうございました。