Aikido

Perché non bisogna sovrascrivere gli argomenti delle funzioni: prevenire confusione e problemi di debugging

Leggibilità

Regola

Non sovrascrivere gli argomenti
delle funzioni. Riassegnare i parametri
può confondere chi chiama la
funzionee rendere difficile il debugging.

Linguaggi supportati: 45+

Introduzione

La riassegnazione dei parametri di una funzione modifica il valore degli argomenti all'interno della funzione stessa, rendendo incerto il valore effettivo del parametro in un dato momento. Durante il debugging, non è possibile dare per scontato che un parametro contenga ancora il valore passato dal chiamante. Questo genera confusione per chiunque legga il codice e rende più difficile individuare i bug, poiché il valore del parametro cambia nel corso dell'esecuzione.

Esempi di codice

❌ Non conforme:

function processUser(user) {
    if (!user) {
        user = { id: null, name: 'Guest' };
    }

    user = { ...user, processedAt: Date.now() };

    if (user.age < 18) {
        user = { ...user, restricted: true };
    }

    return user;
}

Perché è errato: Il parametro user viene riassegnato più volte, rendendo impossibile sapere cosa abbia passato il chiamante originale senza leggere l'intera funzione. Il debugging mostra valori modificati anziché l'input effettivo, ostacolando il tracciamento dei problemi alla fonte.

✅ Conforme:

function processUser(user) {
    const currentUser = user || { id: null, name: 'Guest' };

    const processedUser = {
        ...currentUser,
        processedAt: Date.now()
    };

    if (currentUser.age < 18) {
        return { ...processedUser, restricted: true };
    }

    return processedUser;
}

Perché questo è importante: Le nuove variabili (currentUser, processedUser) contengono valori intermedi mentre l'originale user il parametro rimane invariato. I debugger mostrano il valore di input effettivo e il codice traccia chiaramente le trasformazioni attraverso variabili denominate.

Conclusione

Usa nuove variabili per le trasformazioni anziché riassegnare i parametri. Questo rende esplicito il flusso dei dati e preserva l'input originale per il debug. La leggera verbosità delle dichiarazioni di variabili extra è ampiamente ripagata da una migliore leggibilità e manutenibilità in fase di debug.

FAQ

Hai domande?

E per quanto riguarda i valori predefiniti dei parametri?

I parametri predefiniti (function process(user = {})) sono diversi dalla riassegnazione. Forniscono valori solo quando gli argomenti non sono definiti, senza riassegnare i parametri esistenti. Usa i parametri predefiniti per gli argomenti opzionali, ma evita di riassegnarli nel corpo della funzione.

Questo vale per i parametri di tipo primitivo o a oggetto?

Sì, per entrambi. Riassegnare tipi primitivi (numeri, stringhe) modifica il riferimento locale e genera confusione. Riassegnare gli oggetti sostituisce completamente il riferimento, sebbene la mutazione delle proprietà dell'oggetto (user.name = 'x') sia un aspetto separato legato all'immutabilità.

Cosa succede se devo normalizzare o pulire l'input?

Crea una nuova variabile per il valore normalizzato: const cleanedInput = normalizeInput(input). In questo modo sarà chiaro che la funzione trasforma l'input e verranno mostrati sia il valore originale che quello pulito durante il debug.

E per quanto riguarda la modifica delle proprietà dei parametri?

La modifica delle proprietà (user.name = 'x') è diversa dalla riassegnazione del parametro stesso. Tuttavia, mutare i parametri è comunque problematico poiché genera effetti collaterali. È preferibile trattare i parametri come immutabili e restituire nuovi oggetti con le relative modifiche.

Metti in sicurezza ora

Metti in sicurezza il tuo codice, il cloud e il runtime in un unico sistema centralizzato.
Trova e risolvi le vulnerabilità rapidamente e automaticamente.

Nessuna carta di credito richiesta | Risultati della scansione in 32 secondi.