Regola
Usa return anticipati e guard clause.
Un annidamento profondo e una validazione
tardiva dei parametri rendono le funzioni difficili
Linguaggi supportati: 45+Introduzione
Le guard clause convalidano le precondizioni all'inizio di una funzione e restituiscono immediatamente un valore se le condizioni non vengono soddisfatte. Questo riduce l'annidamento gestendo preventivamente i casi di errore, lasciando la logica principale non annidata e facile da leggere. Le funzioni che convalidano i parametri a metà o che annidano i percorsi di successo all'interno di molteplici condizioni costringono chi legge a tracciare il contesto attraverso numerosi livelli di indentazione.
Perché è importante
Leggibilità del codice: Le guard clause rendono visibile l'happy path alla fine della funzione senza ricorrere all'annidamento. Chi legge individua subito tutte le condizioni di errore e successivamente analizza la logica principale a un unico livello di indentazione, senza dover tenere traccia mentalmente di più condizioni annidate.
Manutenzione e modifica: L'aggiunta di nuove convalide o condizioni di errore a un codice profondamente annidato richiede un posizionamento accurato per evitare di compromettere la logica esistente. Le guard clause all'inizio consentono di aggiungere nuovi controlli senza toccare la logica principale, riducendo il rischio di introdurre bug.
Esempi di codice
❌ Non conforme:
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' };
}
}Perché è errato: Quattro livelli di annidamento celano la logica principale (detrazione del saldo) in profondità all'interno della funzione. Ciascuna condizione di errore aggiunge un ulteriore livello di indentazione, rendendo l'happy path difficile da trovare e comprendere a colpo d'occhio.
✅ Conforme:
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 };
}
Perché è importante: Le guard clause convalidano tutte le precondizioni con return anticipati, mantenendo la funzione a un unico livello di indentazione. L'happy path (detrazione del saldo) è chiaramente visibile alla fine senza alcun annidamento, rendendo la funzione semplice da leggere e modificare.
Conclusione
Valida gli input e gestisci i casi di errore all'inizio delle funzioni utilizzando le guard clause. In presenza di condizioni non soddisfatte, esegui un return anticipato anziché annidare il percorso di successo. In questo modo il codice rimane lineare, leggibile e facile da modificare senza alterare la logica esistente.

