Aikido

Porque é que não deve substituir argumentos de funções: evitar confusões 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

A reatribuição de parâmetros de função altera o valor dos argumentos dentro da função, tornando pouco claro o valor que o parâmetro possui num determinado momento. Ao depurar, não se pode 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 o rastreamento de bugs porque 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;
}

Porque é que é errado: O utilizador é reatribuído várias vezes, tornando impossível saber o que o chamador original passou sem ler a função inteira. A depuração mostra os valores modificados, não a entrada real, tornando difícil rastrear os problemas até a fonte.

Conformidade:

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

Porque é que isto é importante: Novas variáveis (utilizador atual, processadoUsuário) mantêm valores intermédios, enquanto o original utilizador permanece inalterado. Os depuradores mostram o valor real de entrada e o código rastreia claramente as transformações através de variáveis nomeadas.

Conclusão

Utilize novas variáveis para transformações em vez de reatribuir parâmetros. Isto torna o fluxo de dados explícito e preserva a entrada original para depuração. A ligeira verbosidade das declarações de variáveis extra é compensada pela melhoria da legibilidade e da depuração.

FAQs

Tem perguntas?

E os valores dos parâmetros predefinidos?

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

Isto aplica-se a parâmetros primitivos ou a parâmetros de objectos?

Sim, ambos. A reatribuição de primitivas (números, cadeias de caracteres) altera a referência local e cria confusão. A reatribuição de objectos substitui completamente a referência, embora a mutação de propriedades de objectos (user.name = 'x') seja uma questão separada sobre imutabilidade.

E se eu precisar de 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 os valores originais e limpos durante a depuração.

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

Modificar propriedades (user.name = 'x') é diferente de reatribuir o próprio parâmetro. No entanto, a mutação de parâmetros também é problemática, pois cria efeitos colaterais. Prefira tratar os parâmetros como imutáveis e devolver novos objectos com alterações.

Obter segurança gratuitamente

Proteja seu código, nuvem e tempo de execução em um sistema central.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados do scan em 32secs.