ガード節

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

プログラミング品質

ガード節とは

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

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

この記事は役に立ちましたか?

関連用語

関連する記事