実務の現場でコードレビューをしていると、if…else文が積み重なった「巨大な条件分岐」に出会うことが多々あります。いわゆる「ネストの深いコード」は、可読性を下げるだけでなく、修正時のバグ混入リスクを劇的に高めます。今回は、if…elseに依存しない、より保守性の高いコードを書くための具体的な戦略を解説します。
ガード節による早期リターン
最も基本的かつ効果的な手法は、早期リターン(Early Return)です。関数内で条件が満たされない場合に即座にreturnすることで、if…elseの階層をフラットにします。
例えば、ユーザーの権限チェックを行う関数で、elseを使い続けると、処理の終着点がどこにあるのか直感的に理解しづらくなります。これを、条件に合致しないケースを先に弾く形に書き換えるだけで、メインのロジックがインデントなしで記述できるようになり、脳の認知負荷が大幅に軽減されます。
オブジェクトリテラルによる分岐のデータ化
複雑な条件分岐の多くは、実は「キーと値のペア」で表現可能です。状態に応じて処理を切り替える際、switch文やif文を並べるのではなく、ルックアップテーブル(Object Literal)を活用しましょう。
例えば、ステータスに応じて異なるメッセージを表示する処理であれば、状態をキー、メッセージを値としたオブジェクトを定義し、該当するキーでアクセスするだけで済みます。これにより、分岐ロジックが「データ」として分離され、条件の追加や変更があっても、オブジェクトを更新するだけで完了するため、関数本体を触る必要がなくなります。
ポリモーフィズム的な発想で責務を分割する
さらに高度なケースでは、条件分岐自体を「クラス」や「関数」に切り出すアプローチが有効です。特定の条件で動作が変わる処理がある場合、その動作を小さな関数群として定義し、実行時に適切な関数を選択して呼び出すようにします。
これは、「開閉原則(Open/Closed Principle)」を守るための重要なテクニックです。既存のコードを修正することなく、新しい機能を追加できる構造を意識してください。
まとめ:ifを減らすことは「未来の自分へのプレゼント」
if文は強力ですが、多用するとコードは「命令的(Imperative)」になりがちです。私たちが目指すべきは、何をしたいかが一目でわかる「宣言的(Declarative)」なコードです。
今日から皆さんのプロジェクトで、まずはネストが深いif文を一つ見つけ、ガード節やルックアップテーブルに置き換えてみてください。その小さなリファクタリングが、将来の保守コストを劇的に下げる鍵となります。