Aikido

Por qué no debe anular los argumentos de las funciones: evitar confusiones y problemas de depuración

Legibilidad

Regla

No anular función argumentos.
Reasignación de función parámetros puede confundir a
las personas que llaman y hacer depuración la depuración.

Idiomas admitidos: 45+

Introducción

Reasignar parámetros de función cambia el valor de los argumentos dentro de la función, haciendo que no esté claro qué valor tiene el parámetro en un momento dado. Cuando se depura, no se puede confiar en que un parámetro siga conteniendo el valor pasado por el invocador. Esto crea confusión para cualquiera que lea el código y dificulta la localización de errores porque el valor del parámetro cambia a lo largo de la ejecución.

Ejemplos de códigos

❌ No 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 qué está mal: En usuario se reasigna varias veces, por lo que es imposible saber lo que el llamante original pasó sin leer toda la función. La depuración muestra los valores modificados, no la entrada real, por lo que es difícil rastrear los problemas hasta el origen.

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

Por qué es importante: Nuevas variables (usuarioactual, usuario procesado) mantienen valores intermedios mientras que el original usuario permanece inalterado. Los depuradores muestran el valor de entrada real, y el código rastrea claramente las transformaciones a través de variables con nombre.

Conclusión

Utilice nuevas variables para las transformaciones en lugar de reasignar parámetros. Esto hace explícito el flujo de datos y preserva la entrada original para la depuración. La ligera verbosidad de las declaraciones de variables adicionales se ve compensada por la mejora de la legibilidad y la depurabilidad.

Preguntas frecuentes

¿Tiene alguna pregunta?

¿Qué ocurre con los valores por defecto de los parámetros?

Los parámetros por defecto (función proceso(usuario = {})) son diferentes de la reasignación. Sólo proporcionan valores cuando los argumentos son indefinidos, no reasignan parámetros existentes. Usa parámetros por defecto para argumentos opcionales, pero no los reasignes dentro del cuerpo de la función.

¿Esto se aplica a los parámetros primitivos frente a los parámetros objeto?

Sí, ambas cosas. Reasignar primitivas (números, cadenas) cambia la referencia local y crea confusión. La reasignación de objetos reemplaza completamente la referencia, aunque la mutación de las propiedades de los objetos (user.name = 'x') es un tema aparte acerca de la inmutabilidad.

¿Y si necesito normalizar o limpiar la entrada?

Cree una nueva variable para el valor normalizado: const cleanedInput = normalizeInput(input). Esto deja claro que la función transforma la entrada y muestra tanto el valor original como el limpiado durante la depuración.

¿Y la modificación de las propiedades de los parámetros?

Modificar propiedades (usuario.nombre = 'x') es diferente de reasignar el parámetro en sí. Sin embargo, mutar parámetros también es problemático ya que crea efectos secundarios. Es preferible tratar los parámetros como inmutables y devolver nuevos objetos con los cambios.

Asegúrese gratis

Proteja el código, la nube y el tiempo de ejecución en un sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No requiere tarjeta de crédito | Escanea resultados en 32segs.