章: 第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の実行速度を大きく改善するキャッシュの仕組みを整理しましょう。