第46回: リファクタリング実践演習 — 「動く汚いコード」を「動く読みやすいコード」に変える
技術的負債は時間とともに膨らみ、新機能の追加コストを増大させます。リファクタリングは動作を変えずに内部構造を改善する作業です。テストが整っていれば、安心して改善できます。
Category
技術的負債は時間とともに膨らみ、新機能の追加コストを増大させます。リファクタリングは動作を変えずに内部構造を改善する作業です。テストが整っていれば、安心して改善できます。
スタイルのズレは本質的な問題ではないのに、レビュー時間を消費します。PHP CS Fixerを使えば、コードスタイルをコマンド1本で自動統一でき、レビューはロジックの議論に集中できます。
PHPは動的型付け言語のため、実行するまでわからないバグが潜みやすいです。PHPStanを使えば、コードを実行せずに型エラー・ヌル参照・存在しないメソッド呼び出しなどを事前に検出できます。
テストを書いても、実際にどのコードパスが通過しているかを確認しなければ、未テストの分岐が本番でバグを起こします。コードカバレッジを可視化することで、テストが不足している箇所を客観的に把握できます。
「ユーザーが投稿を作成できるか」という検証は、Unitテストだけでは限界があります。Laravelでは、ユーザー操作の流れを検証するFeatureテストと、個別ロジックを検証するUnitテストを使い分けることで、テストが過不足なく整います。
実装後のテストは「動いているコードを確認する作業」になりがちで、設計の改善には繋がりにくいです。TDDではテストを先に書くことで「何を作るか」が明確になり、余分な実装が増えにくくなります。
外部依存が絡むテストは遅く・不安定で・副作用が生じます。モックとスタブを使えば、テスト中に依存クラスを「替え玉」に差し替えて、速くて安定したテストを書けます。
機能が増えるにつれて手動確認のコストは指数的に増えます。PHPUnitによるテストを自動化しておけば、変更のたびに「全体が壊れていないか」を数秒で確認できます。
古いデータのクリーンアップ・通知の一括送信・マスタデータの投入など、定期的に実行する作業をコマンド化しておくと、運用ミスと手作業コストを大幅に削減できます。Artisanカスタムコマンドを作成すれば、php artisan 1本で実行できます。
「ユーザー登録後にウェルカムメール送信・ポイント付与・Slack通知をしたい」という要件が増えるたびに同じコントローラを修正するのは、変更のリスクと範囲が広がります。イベントとリスナを使えば、既存コードを触らずに新しい動作を追加できます。