Clean Code en JavaScript: principios y ejemplos prácticos
El código limpio no es solo un término de moda, sino una necesidad profesional. En el mundo de JavaScript y Node.js, donde los proyectos crecen y cambian rápidamente, la habilidad de escribir código comprensible y mantenible distingue a un desarrollador experimentado de un principiante. En este artículo, analizaremos los principios clave de Clean Code con ejemplos concretos de la práctica real.
¿Por qué es importante el código limpio para un desarrollador de JavaScript?
JavaScript es un lenguaje de tipado dinámico, lo que lo hace flexible, pero también más propenso a errores. El código mal escrito en Node.js puede convertir el mantenimiento del proyecto en una pesadilla. Clean Code ayuda a:
- Reducir el tiempo de depuración y refactorización
- Facilitar la incorporación de nuevos desarrolladores al proyecto
- Disminuir la cantidad de errores en producción
- Aumentar la productividad del equipo
Pasemos a los principios y ejemplos concretos.
Principio 1: Nombres significativos de variables y funciones
La regla más simple y, al mismo tiempo, la más violada. El nombre de una variable debe responder a la pregunta "¿qué es esto?" o "¿para qué sirve esto?".
Ejemplo malo:
// Mal: ¿qué es d? ¿qué hace fn?const d = new Date();const fn = (a, b) => a + b;const arr = [1, 2, 3, 4];const x = arr.filter(i => i > 2);Ejemplo bueno:
// Bien: comprensible sin comentariosconst currentDate = new Date();const sum = (firstNumber, secondNumber) => firstNumber + secondNumber;const numbers = [1, 2, 3, 4];const filteredNumbers = numbers.filter(number => number > 2);Regla para Node.js: si trabaja con operaciones asíncronas, agregue sufijos que indiquen el tipo de valor de retorno: getUserDataAsync, fetchPosts.
Principio 2: Las funciones deben ser pequeñas y hacer una sola cosa (KISS)
El principio KISS (Keep It Simple, Stupid) en JavaScript es críticamente importante. Una función no debe ser una "navaja suiza".
Ejemplo malo — función monstruo:
// Mal: una función lo hace todofunction processUserData(user) { // Validación if (!user.email || !user.name) { throw new Error('Invalid user data'); } // Formateo const formattedName = user.name.trim().toLowerCase(); const formattedEmail = user.email.trim().toLowerCase(); // Guardar en BD db.save({ name: formattedName, email: formattedEmail }); // Enviar email emailService.sendWelcome(formattedEmail); // Registro logger.info(`User ${formattedName} processed`);}Ejemplo bueno — separación de responsabilidades:
// Bien: cada función se encarga de una tareafunction validateUserData(user) { if (!user.email || !user.name) { throw new Error('Invalid user data'); }}
function formatUserData(user) { return { name: user.name.trim().toLowerCase(), email: user.email.trim().toLowerCase() };}
async function processUserRegistration(userData) { validateUserData(userData); const formattedUser = formatUserData(userData); await db.save(formattedUser); await emailService.sendWelcome(formattedUser.email); logger.info(`User ${formattedUser.name} processed`); return formattedUser;}Este código es más fácil de probar, depurar y ampliar.
Principio 3: Evite números y cadenas mágicas (DRY)
Los "números mágicos" son literales cuyo significado no es evidente. Extráigalos en constantes con nombres claros.
Ejemplo malo:
// Mal: ¿qué es 1000? ¿por qué 60?setTimeout(() => { if (user.age > 65)