Regola
Non usare break nei cicli interni.
Le istruzioni break in cicli profondamente annidati
rendono il flusso di controllo difficile da seguire
Linguaggi supportati: 45+Introduzione
Le istruzioni break nei cicli annidati creano ambiguità su quale ciclo si interrompa e a quali condizioni. Quando un break appare in profondità all'interno di più cicli, chi legge deve risalire con attenzione per determinare quale ciclo termini e se i cicli esterni continuino l'esecuzione. Questo carico cognitivo aumenta a ogni livello di annidamento, rendendo il codice difficile da comprendere e mantenere.
Perché è importante
Manutenibilità del codice: le istruzioni break nei cicli annidati oscurano il flusso di controllo. I futuri manutentori devono tracciare mentalmente quale ciclo si interrompe e cosa accade a quelli esterni. Questo rende il codice soggetto a errori quando si modifica la logica dei cicli o si aggiungono nuove condizioni.
Complessità di debugging: durante il debugging di cicli annidati con istruzioni break, impostare breakpoint e avanzare nel codice richiede di comprendere percorsi di uscita complessi. Un'istruzione break in un ciclo interno potrebbe impedire l'esecuzione di importanti logiche di pulizia o validazione nei cicli esterni.
Esempi di codice
❌ Non conforme:
function findUser(users, id) {
let found = null;
for (let i = 0; i < users.length; i++) {
if (users[i].id === id) {
found = users[i];
break; // break is okay, but this pattern is verbose
}
}
return found;
}Perché è errato: Il parametro break l'istruzione richiede l'introduzione di una variabile temporanea (trovato) per memorizzare il risultato, che viene poi restituito dopo il ciclo. Questo pattern prolisso aggiunge complessità non necessaria e rende il codice più difficile da seguire rispetto ai return diretti o ai metodi sugli array.
✅ Conforme:
function findUser(users, id) {
return users.find(user => user.id === id);
}
OR
function findUser(users, id) {
for (let i = 0; i < users.length; i++) {
if (users[i].id === id) {
return users[i];
}
}
return null;
}Perché questo è importante: L'Opzione 1 utilizza .find() che è concisa ed esprime chiaramente l'intento. L'Opzione 2 utilizza return per uscire immediatamente quando l'utente viene trovato, eliminando la necessità di variabili temporanee e istruzioni break . Entrambi gli approcci sono più chiari e facili da mantenere rispetto al pattern con break.
Conclusione
Estrai la logica dei cicli annidati in funzioni in cui return esce chiaramente da tutti i cicli. Usa metodi sugli array come find(), some(), o every() per sostituire i cicli interni quando possibile. Se i cicli annidati sono inevitabili, usa break con etichetta o flag per rendere esplicite le condizioni di uscita.

