Regola
Non inserire assegnazioni all'interno di condizioni.
Mischiare assegnazione e logica condizionale rende il codice soggetto a errori
e più difficile da comprendere. Separa le assegnazioni dai controlli logici.
Linguaggi supportati:** JavaScript, TypeScript, Python, PHPIntroduzione
Gli operatori di assegnazione all'interno di istruzioni condizionali rappresentano una fonte comune di bug che spesso i compilatori e i linter non rilevano. L'errore classico consiste nell'usare = (assegnazione) anziché == o === (confronto) in un'istruzione if, ma il problema è più profondo. Anche le assegnazioni intenzionali all'interno delle condizioni creano codice difficile da leggere, revisionare ed eseguire il debug. Quando l'assegnazione e la valutazione avvengono sulla stessa riga, chi legge deve mentalmente analizzare quale operazione abbia la precedenza e quale sia effettivamente il valore testato.
Perché è importante
Perché è importante
Introduzione di bug: Un errore di battitura che trasforma === in = non genererà un errore di sintassi, ma modificherà silenziosamente il comportamento. La condizione restituirà il valore assegnato (truthy/falsy), non il risultato del confronto.
Leggibilità del codice: Chi legge si aspetta che le condizioni verifichino dei valori, non che li modifichino. Quando entrambe le cose avvengono simultaneamente, chi effettua la manutenzione deve rintracciare quali variabili vengano modificate e quando.
Esempi di codice
❌ Non conforme:
function processUser(userData) {
if (user = userData.user) {
console.log(`Processing user: ${user.name}`);
return user.id;
}
return null;
}
function validateInput(value) {
if (result = value.match(/^\d{3}-\d{2}-\d{4}$/)) {
return result[0];
}
return false;
}
Perché è errato: Le assegnazioni all'interno delle condizioni rendono poco chiaro se si tratti di un'intenzione o di un errore di battitura. Il primo esempio potrebbe essere un bug in cui si intendeva usare ===, mentre il secondo unisce la corrispondenza di un'espressione regolare a un'assegnazione, rendendo difficile seguire il flusso del codice.
✅ Conforme:
function processUser(userData) {
const user = userData.user;
if (user) {
console.log(`Processing user: ${user.name}`);
return user.id;
}
return null;
}
function validateInput(value) {
const result = value.match(/^\d{3}-\d{2}-\d{4}$/);
if (result) {
return result[0];
}
return false;
}
Perché questo è importante: Separare l'assegnazione dalla condizione rende l'intento estremamente chiaro. Chi legge vede immediatamente che user viene estratto per primo e poi testato. Il risultato della corrispondenza dell'espressione regolare viene catturato e successivamente valutato. Nessuna ambiguità, nessun carico cognitivo ed errori di battitura come = contro === diventano evidenti.
Conclusione
Tenere le assegnazioni separate dalle condizioni è una regola semplice che previene un'intera classe di bug. Il carico cognitivo derivante dall'analisi di operazioni combinate supera qualsiasi vantaggio di presunta brevità. Un codice chiaro ed esplicito, in cui l'assegnazione e la valutazione sono operazioni distinte, migliora la leggibilità, riduce i bug e rende la code review più efficace.

