ガード節

関数の先頭で異常条件を早期にチェックし、ネストを浅く保つプログラミングパターン

プログラミング品質

ガード節とは

ガード節 (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 個以上になる場合 (関数の責務が大きすぎる兆候)

より深く学ぶには関連書籍が役立つ。

関連用語