導入
開発現場で「動くけれど読みにくい」「修正するたびにバグが出る」というソースコードに頭を抱えたことはありませんか?PHPは柔軟な記述が可能な言語ですが、その自由度が災いして、知らぬ間に「技術的負債」を積み重ねてしまいがちです。本記事では、実務で頻出する「やってしまいがちな汚いソースコード」を振り返り、明日からコードを劇的に改善するための具体的なアプローチを解説します。
基礎知識
PHPは動的型付け言語であり、短い記述でロジックを組めるのが魅力です。しかし、その手軽さが「命名の適当さ」「ネストの深掘り」「変数の使い回し」を助長します。これらを放置すると、コードの保守性が低下し、チーム開発におけるレビューコストやバグ発生率が跳ね上がります。「コードは書く時間より読まれる時間の方が長い」という意識を持つことが、プロフェッショナルへの第一歩です。
実装/解決策
コードを綺麗に保つための鉄則は、以下の3点に集約されます。
1. 目的ごとに関数を細分化する
ネストが深くなる最大の原因は、一つの関数に処理を詰め込みすぎることです。責務を分割し、関数名を「何をするか(動詞)」で明確にしましょう。
2. マジックナンバーを排除する
意味の不明な数値は定数(const)として定義し、名前を付けます。これにより、修正時に変更箇所が特定しやすくなります。
3. 変数名を省略しない
「$p」や「$arr」のような省略形は、後から読む人にとって解読のクイズになります。日本語のローマ字表記も避け、英語で「何が入っているか」を明示しましょう。
サンプルプログラム
悪い例と、それをリファクタリングした実務的なコード例です。
/
function process($arr) {
if ($arr[0] == 1) { // 1が何を指すか不明
for ($i = 0; $i < 10; $i++) {
// 処理...
}
}
}
/
- 改善例:定数化と関数分割、命名の明確化
/
const STATUS_ACTIVE = 1;
const MAX_LOOP_COUNT = 10;
/
- 有効なユーザーに対してループ処理を行う
/
function processActiveUsers(array $userList): void
{
if (!isUserActive($userList[0])) {
return;
}
runLoop(MAX_LOOP_COUNT);
}
function isUserActive(int $status): bool
{
return $status === STATUS_ACTIVE;
}
function runLoop(int $count): void
{
for ($i = 0; $i < $count; $i++) {
// 処理内容をここに記述
}
}
?>
応用・注意点
現場で役立つコツとして、「早期リターン(ガード節)」の活用を強く推奨します。if文のネストが深くなる場合、条件を満たさない場合に早期にreturnすることで、インデントを浅く保つことができます。
また、変数の型を意識することも重要です。PHP 7以降では型宣言(引数や戻り値の型)が強化されています。`function calculate(int $a, int $b): int` のように型を明示することで、エディタの補完が効きやすくなり、予期せぬ型変換によるバグを未然に防ぐことが可能です。完璧を目指しすぎず、まずは「昨日書いた自分のコードを読んで理解できるか」という基準から改善を始めてみてください。