ガード節
関数の先頭で異常条件を早期にチェックし、ネストを浅く保つプログラミングパターン
ガード節とは
ガード節 (Guard Clause) は、関数の先頭で異常条件や境界条件をチェックし、条件に合致しない場合は早期にリターン (Early Return) するパターンである。if-else のネストを浅く保ち、コードの可読性を向上させる。Martin Fowler の『リファクタリング』のカタログには "Replace Nested Conditional with Guard Clauses" (ネストした条件記述をガード節に置き換える) として収録されている。
Before / After
改善前と改善後のコードを比較する。
// ❌ ネストが深い: 正常系がどこにあるか分かりにくい
function processOrder(order: Order | null) {
if (order !== null) {
if (order.items.length > 0) {
if (order.status === 'pending') {
if (order.total > 0) {
// ようやく本来の処理 (ネスト 4 段)
return calculateShipping(order);
}
}
}
}
return null;
}
// ✅ ガード節: 異常系を先に排除し、正常系がフラットに読める
function processOrder(order: Order | null) {
if (!order) return null;
if (order.items.length === 0) return null;
if (order.status !== 'pending') return null;
if (order.total <= 0) return null;
// 本来の処理 (ネスト 0 段)
return calculateShipping(order);
}
ガード節を使うと、関数の先頭を読むだけで「この関数が処理しないケース」が一目で分かる。残りのコードは「すべてのガードを通過した正常系」であることが保証される。
ただし、この書き方には代償もある。上の例は 4 つの異なる理由をすべて null に潰しているため、呼び出し側は「注文が存在しないのか、明細が空なのか、状態が違うのか」を区別できない。理由を呼び出し側に伝える必要がある場面では、null を返す代わりに例外を投げるか、失敗の理由を持つ戻り値 (Result 型やエラーオブジェクト) を返す。ガード節が整えるのは制御フローであって、エラー情報の設計はそれとは別に決める必要がある。
なぜガード節が有効なのか
ネストが深いコードを読むときは、目の前の 1 行の意味を確定させるために「ここまでに成立している条件」を頭の中に積み上げ続けることになる。段が増えるほど保持すべき条件が増え、else に降りたところでは「どの条件が偽なのか」を逆向きにたどる作業が加わる。ガード節は条件を上から順にフラットに並べるので、この積み上げが要らなくなる。ガードを抜けた後の行は、それまでに書かれた条件すべてが偽だった場合だけが到達する。
コードレビューでも効果的だ。異常系の処理が関数の先頭にまとまっているため、「このケースは考慮されているか」を確認しやすい。
ガード節と TypeScript の型絞り込み
TypeScript ではガード節が型の絞り込み (Type Narrowing) としても機能する。
function processUser(user: User | null | undefined) {
if (!user) return; // この行以降、user は User 型に絞り込まれる
if (!user.email) return; // この行以降、user.email は string 型
sendEmail(user.email); // 型安全に呼び出せる
}
適用の判断基準
ガード節が有効なケース:
- 入力バリデーション (null チェック、型チェック、範囲チェック)
- 認証・認可チェック
- 前提条件の確認 (リソースの存在確認)
ガード節が不適切なケース:
- 複数の条件分岐で異なる処理を行う場合 (switch 文や Strategy パターンの方が適切)
- ガード節が 10 個以上になる場合 (関数の責務が大きすぎる兆候)
より深く学ぶには関連書籍が役立つ。
この記事は役に立ちましたか?
関連用語
クリーンアーキテクチャ
ビジネスロジックを外部の技術的詳細から分離し、依存関係を内側に向けることで変更に強い設計を実現するアーキテクチャ原則
リファクタリング
外部の振る舞いを変えずにコードの内部構造を改善し、保守性と可読性を向上させる手法
コードの不吉な匂い
リファクタリングが必要であることを示唆するコード上の兆候や構造的な問題のパターン
ヘルスチェックパターン
サービスの稼働状態を定期的に確認し、異常を検知したらトラフィックを切り離す仕組み
静的解析
コードを実行せずに構文・型・データの流れから性質を推論し、バグ・脆弱性・規約違反の候補を検出する手法
Null Object パターン
null チェックの代わりに、何もしないオブジェクトを使って条件分岐を排除するデザインパターン
関連する記事
写経を超える - 技術書のコードを自分のプロジェクトに応用する方法
技術書のサンプルコードを写経するだけでは実力は伸びません。書籍のコードを自分のプロジェクトに応用し、実務で使える力に変える 5 つのステップを解説します。
「動くコード」と「良いコード」の間にある本
コードが動くようになった後、次に何を学べばよいのか。「動くコード」を「良いコード」に変えるために必要な知識と、それを効率的に学べる本の選び方を解説します。
設計 / アーキテクチャ本ガイド - 設計力を上げる技術書の選び方
ソフトウェア設計を学べる技術書をコード / モジュール / システムの 3 レイヤーに分類し、レベルに応じた読む順番の指針を紹介します。