Regola
Evita livelli di nidificazione eccessivi.
Una nidificazione profonda rende il codice difficile da leggere e comprendere.
Linguaggi supportati: 45+Introduzione
Un codice con quattro, cinque o sei livelli di nidificazione genera un carico cognitivo che rallenta lo sviluppo. Ogni livello di nidificazione rende più complesso tenere traccia delle condizioni attive, dei percorsi di errore e della logica di business. Un'eccessiva nidificazione indica spesso la mancanza di astrazioni o l'opportunità di utilizzare early return e guard clause.
Perché è importante
Manutenibilità del codice e rischi di bug: Una nidificazione profonda crea il cosiddetto "arrow code" che spinge la logica fuori dallo schermo, rallentando la code review. Gli sviluppatori rischiano di trascurare i casi limite quando modificano codice nidificato, poiché non riescono a visualizzare tutte le condizioni che devono essere soddisfatte. Modifiche che sembrano corrette in isolamento possono compromettere assunzioni fatte diversi livelli più in alto.
Complessità di testing e debugging: Ogni livello di nidificazione raddoppia i test case necessari per la copertura, causando un'esplosione esponenziale dei percorsi. Gli stack trace degli errori non mostrano quali condizioni abbiano portato a quel punto, rendendo i bug difficili da riprodurre.
Esempi di codice
❌ Non conforme:
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' };
}
Perché è errato: Sei livelli di nidificazione rendono difficile individuare la logica di business effettiva (l'invio dell'ordine) nascosta in fondo. Ogni controllo condizionale aggiunge un ulteriore livello di indentazione e la gestione degli errori risulta poco chiara poiché non vi è alcuna indicazione su quale specifica validazione sia fallita.
✅ Conforme:
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);
}
Perché questo è importante: Le guard clause con early return riducono la nidificazione a un singolo livello. Ogni validazione è esplicita e restituisce un messaggio di errore specifico. Il percorso principale (invio dell'ordine) è visibile alla fine senza alcuna nidificazione. Il codice è autoesplicativo e facile da modificare senza alterare le condizioni esistenti.
Conclusione
Mantieni i livelli di nidificazione a tre o meno quando possibile. Utilizza early return, guard clause e funzioni di supporto per appiattire le strutture troppo nidificate. Quando incontri una nidificazione superiore a tre livelli, è un segnale che è il momento di effettuare un refactoring estraendo metodi, invertendo le condizioni o ripensando l'approccio. Un codice piatto è più facile da leggere, testare, sottoporre a debugging e mantenere rispetto ad alternative profondamente nidificate.

