Aikido

Perché non si dovrebbero sovrascrivere gli argomenti delle funzioni: evitare confusione e problemi di debug

Leggibilità

Regola

Non sovrascrivere gli della funzione.
Riassegnare i parametri può creare confusione
chi chiama e rendere il debug difficile.

Linguaggi supportati: 45+

Introduzione

La riassegnazione dei parametri di una funzione modifica il valore degli argomenti all'interno della funzione stessa, rendendo poco chiaro quale valore il parametro contenga in un dato momento. Durante il debug, non è possibile dare per scontato che un parametro contenga ancora il valore passato dal chiamante. Ciò crea 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é è sbagliato: Il utente Il parametro viene riassegnato più volte, rendendo impossibile sapere cosa abbia passato il chiamante originale senza leggere l'intera funzione. Il debug mostra i valori modificati, non l'input effettivo, rendendo difficile risalire alla fonte dei problemi.

✅ 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é è importante: Nuove variabili (utente corrente, utente elaborato) assumono valori intermedi, mentre l'originale utente Il parametro rimane invariato. I debugger mostrano il valore effettivo immesso e il codice tiene traccia in modo chiaro delle trasformazioni tramite variabili denominate.

Conclusione

Utilizza nuove variabili per le trasformazioni invece di riassegnare i parametri. In questo modo il flusso dei dati risulta esplicito e l'input originale viene conservato per il debug. La leggera verbosità derivante dalle dichiarazioni di variabili aggiuntive è compensata da una maggiore leggibilità e facilità di debug.

Domande frequenti

Hai delle domande?

E i valori predefiniti dei parametri?

I parametri predefiniti (funzione process(user = {})) sono diversi dalla riassegnazione. Essi forniscono valori solo quando gli argomenti non sono definiti, senza riassegnare i parametri esistenti. Utilizza i parametri predefiniti per gli argomenti opzionali, ma non riassegnarli all’interno del corpo della funzione.

Questo vale anche per i parametri primitivi rispetto a quelli oggetto?

Sì, entrambe le cose. La riassegnazione dei tipi primitivi (numeri, stringhe) modifica il riferimento locale e crea confusione. La riassegnazione degli oggetti sostituisce completamente il riferimento, anche se la modifica delle proprietà degli oggetti (user.name = 'x') è una questione a sé stante che riguarda l'immutabilità.

E se dovessi normalizzare o pulire i dati in ingresso?

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

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

La modifica delle proprietà (user.name = 'x') è diversa dalla riassegnazione del parametro stesso. Tuttavia, anche la modifica dei parametri è problematica in quanto genera effetti collaterali. È preferibile considerare i parametri come immutabili e restituire nuovi oggetti con le modifiche apportate.

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.