LoginSignup
0
0

More than 1 year has passed since last update.

「リーダブルコード」をPHPで実践しよう(第二章)

Last updated at Posted at 2023-03-18

概要

自分の所属する会社の人が「リーダブルコード」を読んだあとのインプットの質を上げられればと思い作成しました。
問題の後に回答を折りたたみで記載しているので、確認する際は開いていただければと思います。

問題1:変数名

  • コード内の変数名の問題点とその理由を示してください。

$users = [
    [
        'name' => '佐藤太郎',
        'birthday' => '1971年2月2日',
    ],
    [
        'name' => '鈴木一郎',
        'birthday' => '1981年5月7日',
    ],
    [
        'name' => '小林三郎',
        'birthday' => '1995年12月20日',
    ],
];

$allUserCount = count($users);
for ($i = 0; $i <= $allUserCount; $i++) {
    $users[$i] += [
        'age' => calcAge($users[$i]['birthday'])
    ];
}

function calcAge($birthday) 
{
    ~~~~~~~
    return $age;
}

回答

コード・解説
  • 変数名は汎用的な名前を付けないようにしましょう。省略やただ汎用的な命名の変数名は、初めて読む人が誤って意味を取り違えて認識するなどのケースを発生させる恐れがあります。変な抽象的な命名はあらぬ誤解を生みかねません。
    • 少し冗長かもしれませんが、以下のような変数名にしたほうが誤用を防げると思います。
$users = [
    [
        'name' => '佐藤太郎',
        'birthday' => '1971年2月2日',
    ],
    [
        'name' => '鈴木一郎',
        'birthday' => '1981年5月7日',
    ],
    [
        'name' => '小林三郎',
        'birthday' => '1995年12月20日',
    ],
];

for ($userCount = 0; $userCount <= count($users); $userCount++) {
    $users[$i] += [
        'age' => calcAge($users[$i])
    ];
}

function calcAge() 
{
    ~~~~~~~
    return $age;
}

また、もしループが多次元化してしまっているケースにおいて$iを使用していると変数名被りが発生し、無限ループを生み出してしまう恐れがあります。


for ($i = 0; $i <= 5; $i++) {
    if ($i === 0) {
        continue;
    }
    for ($i = 0; $i <= 2; $i++) {
        echo "{$i}回目のループです";
    }
}

問題2:メソッド名

  • コード内の変数名、メソッド名の問題点とその理由を示してください。

// 会社の一覧を取得
$c = getCompany();

function getCompany()
{
    return [
        'Qiita1株式会社',
        'Qiita2株式会社',
        'Qiita3株式会社',
    ];
}

回答

コード・解説
  • メソッドの命名は、メソッド内の処理の結果を可能な限り正確に反映するようにしましょう。今回のケースでは複数の会社名の取得が行われているので、メソッド名もそれを反映する名前にする必要があります。もし単数形かつ抽象的な命名のままでは、今後ほかの場合に使用した際に誤ってメソッドの拡張(コードの付け足し)をしてしまうことが起こりかねません。
    • また、getなどの動詞部分についても検討してもよいかもしれません。機能要件に店舗名の検索が含まれていたり、当のメソッド内で何らかの条件が含まれているといった場合にはsearchCompanyNamesという名前にしても良いと思います。
$companyNames = getCompanyNameList();

function getCompanyList()
{
    return [
        'Qiita1株式会社',
        'Qiita2株式会社',
        'Qiita3株式会社',
    ];
}

終わりに

解決策や回答案につきまして他にもあると思います。
こういう指摘がある、こういうケースは?などについても仰っていただければと思います。

謝辞

@kyok01_japan さんのこちらの記事を参考にこの記事を書きました。
事後報告で申し訳ございません、ありがとうございます。

0
0
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
0
0