第46回: リファクタリング実践演習 — 「動く汚いコード」を「動く読みやすいコード」に変える

章: 第5章: テストと品質管理

「動いているから触らない」と、複雑なコードをそのまま放置していませんか?

技術的負債は時間とともに膨らみ、新機能の追加コストを増大させます。リファクタリングは動作を変えずに内部構造を改善する作業です。テストが整っていれば、安心して改善できます。

リファクタリングしないと何が起きるか

コードを追加するたびにバグが増え、修正に修正を重ねた「読めないコード」になっていきます。チームの新メンバーが入るたびに理解コストが膨大になり、スピードが落ちます。テストと組み合わせたリファクタリングで、継続的に品質を維持できます。

リファクタリング前後の比較

パターン リファクタリング前 リファクタリング後
条件分岐 if/elseif/else が深くネスト match 式や早期リターンでフラット化
重複コード 同じロジックが複数箇所にコピー privateメソッドや共通クラスに集約
長いメソッド 50行超のメソッド 1つのことだけを行う10行以内のメソッド
魔法の数値 if ($status === 3) 定数・Enum・名前付きで意味を明確化

チェックポイント: リファクタリングは必ずテストがある状態で始めましょう。テストなしでのリファクタリングは「動作を変えていないつもり」になりやすいです。テストを実行しながら小さく変更を加え、グリーンを維持しながら進めるのが鉄則です。

コードサンプル


<?php
// Before: 条件が増えるほど読みにくくなるパターン
function getLabel(string $status): string {
    if ($status === 'active')    { return '有効'; }
    elseif ($status === 'inactive')  { return '無効'; }
    elseif ($status === 'suspended') { return '停止中'; }
    else { return '不明'; }
}
// After: match式でシンプルに
function getLabel(string $status): string {
    return match ($status) {
        'active'    => '有効',
        'inactive'  => '無効',
        'suspended' => '停止中',
        default     => '不明',
    };
}

まとめ & 次のステップ

  • リファクタリングはテストがある状態でのみ安全に行えます
  • match 式・早期リターン・定数化などで可読性を段階的に改善できます
  • 1回のコミットで変える範囲を小さくし、差分が明確な状態を保ちましょう
  • テストをグリーンに保ちながら進めることが唯一の安全ルールです
  • 「後でリファクタリングする」は後回しになりがちなので、機能追加と並行して少しずつ改善しましょう

次回は Opcacheとキャッシュ戦略 を学びます。PHPの実行速度を大きく改善するキャッシュの仕組みを整理しましょう。

Related Articles