ガード節
関数の先頭で異常条件を早期にチェックし、ネストを浅く保つプログラミングパターン
ガード節とは
ガード節 (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 個以上になる場合 (関数の責務が大きすぎる兆候)
より深く学ぶには関連書籍が役立つ。
この記事は役に立ちましたか?
関連用語
関連する記事
「動くコード」と「良いコード」の間にある本
コードが動くようになった後、次に何を学べばよいのか。「動くコード」を「良いコード」に変えるために必要な知識と、それを効率的に学べる本の選び方を解説します。
あの有名 OSS のコードは、この本の影響を受けている
広く使われているオープンソースソフトウェアの設計には、特定の技術書の影響が色濃く反映されています。OSS のコードと技術書の関係を知ると、両方の理解が深まります。
Pull Request が通らない人に足りないのは、たいてい語彙力
コードレビューで指摘が多い人に共通する「設計の語彙力不足」という問題と、技術書で語彙力を効率的に増やす方法を解説します。