ガード節
関数の先頭で異常条件を早期にチェックし、ネストを浅く保つプログラミングパターン
プログラミング品質
ガード節とは
ガード節 (Guard Clause) は、関数の先頭で異常条件や境界条件をチェックし、条件に合致しない場合は早期にリターン (Early Return) するパターンである。if-else のネストを浅く保ち、コードの可読性を向上させる。Martin Fowler が「リファクタリング」で「ガード節による条件記述の置き換え」として体系化した。
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);
}
ガード節を使うと、関数の先頭を読むだけで「この関数が処理しないケース」が一目で分かる。残りのコードは「すべてのガードを通過した正常系」であることが保証される。
なぜガード節が有効なのか
人間の認知負荷は、ネストの深さに比例して増大する。ネストが 3 段以上になると、「今どの条件分岐の中にいるか」を追跡するのが困難になる。ガード節は条件分岐をフラットに並べることで、認知負荷を下げる。
コードレビューでも効果的だ。異常系の処理が関数の先頭にまとまっているため、「このケースは考慮されているか」を確認しやすい。
ガード節と 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 個以上になる場合 (関数の責務が大きすぎる兆候)
より深く学ぶには関連書籍が役立つ。