Aikido

Por que você não deve sobrescrever argumentos de função: prevenindo confusão e problemas de depuração

Legibilidade

Regra

Não substituir função argumentos.
Reatribuir argumentos de função parâmetros pode confundir
quem chama e tornar a depuração difícil.

Idiomas suportados: 45+

Introdução

Reatribuir parâmetros de função altera o valor dos argumentos dentro da função, tornando incerto qual valor o parâmetro contém em qualquer ponto. Ao depurar, não é possível confiar que um parâmetro ainda contém o valor passado pelo chamador. Isso cria confusão para quem lê o código e dificulta a localização de bugs, pois o valor do parâmetro muda durante a execução.

Exemplos de código

❌ Não-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;
}

Por que está errado: O usuário o parâmetro é reatribuído múltiplas vezes, tornando impossível saber o que o chamador original passou sem ler a função inteira. A depuração mostra valores modificados, não a entrada real, dificultando o rastreamento de problemas até a origem.

✅ Compatível:

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;
}

Por que isso importa: Novas variáveis (Usuário atual, usuário processado) armazenam valores intermediários enquanto o original usuário o parâmetro permanece inalterado. Depuradores mostram o valor de entrada real, e o código rastreia claramente as transformações através de variáveis nomeadas.

Conclusão

Use novas variáveis para transformações em vez de reatribuir parâmetros. Isso torna o fluxo de dados explícito e preserva a entrada original para depuração. A ligeira verbosidade de declarações de variáveis extras é superada pela melhoria na legibilidade e depurabilidade.

FAQs

Dúvidas?

E quanto aos valores padrão de parâmetro?

Parâmetros padrão (função process(user = {})) são diferentes de reatribuição. Eles fornecem valores apenas quando os argumentos são indefinidos, não reatribuem parâmetros existentes. Use parâmetros padrão para argumentos opcionais, mas não os reatribua dentro do corpo da função.

Isso se aplica a parâmetros primitivos versus de objeto?

Sim, ambos. Reatribuir primitivos (números, strings) muda a referência local e cria confusão. Reatribuir objetos substitui completamente a referência, embora mutar propriedades de objeto (user.name = 'x') seja uma questão separada sobre imutabilidade.

E se eu precisar normalizar ou limpar a entrada?

Crie uma nova variável para o valor normalizado: const cleanedInput = normalizeInput(input). Isso deixa claro que a função transforma a entrada e mostra tanto os valores originais quanto os limpos durante a depuração.

E quanto à modificação de propriedades de parâmetros?

Modificar propriedades (user.name = 'x') é diferente de reatribuir o próprio parâmetro. No entanto, mutar parâmetros também é problemático, pois cria efeitos colaterais. Prefira tratar parâmetros como imutáveis e retornar novos objetos com as alterações.

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.