ルール
避ける 深い 入れ子 レベル
深い ネスト は コード 難しい コードを 読みづらく そして 理解しにくい。
対応言語 45+はじめに
4、5、または6レベルのネストを持つコードは、開発を遅らせる認知的負担を生み出します。ネストのレベルが増えるごとに、アクティブな条件、エラーパス、ビジネスロジックの追跡が困難になります。過度なネストは、抽象化の欠如や、早期リターンおよびガード節を使用する機会の逸失を示すことがよくあります。
なぜ重要なのか
コードの保守性とバグのリスク: 深いネストは、ロジックが画面外に押し出される「アローコード」を生み出し、コードレビューを遅らせます。開発者は、ネストされたコードを修正する際に、満たされるべきすべての条件を確認できないため、エッジケースを見落とすことがあります。単独では正しく見える変更でも、上位レベルで行われた前提を破る可能性があります。
テストとデバッグの複雑さ: ネストレベルが1つ増えるごとに、カバレッジに必要なテストケースが倍増し、パスの爆発的な増加を引き起こします。エラーからのスタックトレースは、その原因となった条件を示さないため、バグの再現を困難にします。
コード例
❌ 非準拠:
function processOrder(order) {
if (order) {
if (order.items && order.items.length > 0) {
if (order.customer) {
if (order.customer.address) {
if (order.paymentMethod) {
if (validatePayment(order.paymentMethod)) {
return submitOrder(order);
}
}
}
}
}
}
return { error: 'Invalid order' };
}
誤っている理由: 6段階のネストにより、実際のビジネスロジック(注文送信)が一番下に埋もれてしまい、見つけるのが困難になります。各条件チェックがさらにインデントの層を追加し、どの特定の検証が失敗したかを示す表示がないため、エラー処理が不明確です。
✅ 準拠済み:
function processOrder(order) {
if (!order) {
return { error: 'Order is required' };
}
if (!order.items || order.items.length === 0) {
return { error: 'Order must contain items' };
}
if (!order.customer?.address) {
return { error: 'Customer address is required' };
}
if (!order.paymentMethod || !validatePayment(order.paymentMethod)) {
return { error: 'Invalid payment method' };
}
return submitOrder(order);
}
これが重要な理由:早期リターンを持つガード句は、ネストを単一レベルに平坦化します。各検証は明示的であり、特定のエラーメッセージを返します。ハッピーパス(注文送信)は、ネストなしで最後に表示されます。コードは自己文書化されており、既存の条件を壊すことなく簡単に変更できます。
まとめ
可能な限り、ネストレベルは3以下に保ってください。早期リターン、ガード句、ヘルパー関数を使用して、深くネストされた構造を平坦化してください。3レベルを超えるネストに遭遇した場合は、メソッドの抽出、条件の反転、またはアプローチの再考によってリファクタリングする合図です。平坦なコードは、深くネストされた代替案よりも読みやすく、テストしやすく、デバッグしやすく、保守しやすいです。

