ルール
使用する 早期 リターン そして ガード 句。
深い ネスト そして 遅い パラメータ 検証
~にする 関数 より困難 ~すること 読む そして 保守。
対応言語: 45+はじめに
ガード句は関数の開始時に事前条件を検証し、条件が満たされない場合は直ちにリターンします。これにより、エラーケースを事前に処理することでネストが平坦化され、メインロジックはネストされず、読みやすくなります。パラメータを途中で検証したり、複数の条件文の中に成功パスをネストしたりする関数は、読者に多くのインデントレベルにわたってコンテキストを追跡することを強います。
なぜ重要なのか
コードの可読性:ガード句は、ネストなしで関数の最後にハッピーパスを可視化します。読者はすべてのエラー条件を事前に確認し、複数のネストされた条件を頭の中で追跡することなく、単一のインデントレベルで主要なロジックを読み進めることができます。
メンテナンスと変更: 深くネストされたコードに新しいバリデーションやエラー条件を追加するには、既存のロジックを壊さないように慎重な配置が必要です。上部にガード句を配置することで、メインロジックに触れることなく新しいチェックを追加でき、バグを導入するリスクを軽減します。
コード例
❌ 非準拠:
function processPayment(user, amount) {
if (user) {
if (user.isActive) {
if (amount > 0) {
if (user.balance >= amount) {
user.balance -= amount;
return { success: true, newBalance: user.balance };
} else {
return { success: false, error: 'Insufficient funds' };
}
} else {
return { success: false, error: 'Invalid amount' };
}
} else {
return { success: false, error: 'Inactive user' };
}
} else {
return { success: false, error: 'User required' };
}
}誤っている理由: 4段階のネストにより、主要なロジック(残高引き落とし)が関数の奥深くに隠れてしまいます。各エラー条件がさらにインデントレベルを追加するため、正常な処理パスを一目で把握し理解することが困難になります。
✅ 準拠済み:
function processPayment(user, amount) {
if (!user) {
return { success: false, error: 'User required' };
}
if (!user.isActive) {
return { success: false, error: 'Inactive user' };
}
if (amount <= 0) {
return { success: false, error: 'Invalid amount' };
}
if (user.balance < amount) {
return { success: false, error: 'Insufficient funds' };
}
user.balance -= amount;
return { success: true, newBalance: user.balance };
}
これが重要な理由:ガード句は早期リターンですべての事前条件を検証し、関数を単一のインデントレベルに保ちます。ハッピーパス(残高控除)はネストなしで最後に明確に表示され、関数を読みやすく、変更しやすくします。
まとめ
ガード句を使用して、関数の開始時に入力の検証とエラーケースの処理を行います。成功パスをネストするのではなく、条件が失敗した場合は早期にリターンします。これにより、コードはフラットで読みやすく、既存のロジックを壊すことなく簡単に変更できるようになります。

