Clean Code en JavaScript: principios y ejemplos
El código limpio (Clean Code) no es solo un término de moda, sino un enfoque fundamental para el desarrollo que hace que el programa sea comprensible, fácil de mantener y escalable. En el mundo de JavaScript y Node.js, donde los proyectos crecen rápidamente y requieren cambios frecuentes, los principios de Clean Code se vuelven especialmente importantes. En este artículo analizaremos las prácticas clave para escribir código limpio en JavaScript con ejemplos concretos que te ayudarán a mejorar la calidad de tus proyectos.
1. Nombrado correcto de variables y funciones
El nombre de una variable o función debe responder a las preguntas "¿qué es esto?" y "¿qué hace?". Evita nombres de una sola letra (excepto contadores de bucles) y abreviaciones que no sean obvias.
Ejemplo incorrecto:
const d = new Date();const a = [];const fn = (x, y) => x + y;Ejemplo correcto:
const currentDate = new Date();const userList = [];const calculateSum = (firstNumber, secondNumber) => firstNumber + secondNumber;Reglas de nombrado:
- Usa
camelCasepara variables y funciones. - Para valores booleanos utiliza prefijos:
is,has,should(por ejemplo,isActive,hasPermission). - Nombra las funciones con verbos:
getUser,sendEmail,validateInput. - Evita abreviaciones:
usr→user,conf→configuration.
2. Funciones pequeñas y de una sola tarea
Cada función debe realizar exactamente una tarea. Si una función hace más de una acción, debe dividirse en varias. Esto mejora la legibilidad y la capacidad de prueba.
Ejemplo incorrecto (la función hace 3 cosas a la vez):
function processUserData(user) { // Validación if (!user.email || !user.password) { throw new Error('Invalid data'); } // Formateo const formattedUser = { email: user.email.toLowerCase(), password: hashPassword(user.password) }; // Guardado en BD db.save(formattedUser); return formattedUser;}Ejemplo correcto (división en funciones separadas):
function validateUserInput(user) { if (!user.email || !user.password) { throw new Error('Email and password are required'); }}
function formatUserData(user) { return { email: user.email.toLowerCase(), password: hashPassword(user.password) };}
function saveUserToDatabase(user) { return db.save(user);}
function processUserData(user) { validateUserInput(user); const formattedUser = formatUserData(user); return saveUserToDatabase(formattedUser);}Este enfoque hace que el código sea autodocumentado y simplifica la búsqueda de errores.
3. Manejo de errores y casos límite
El código limpio incluye obligatoriamente el manejo de errores y contempla los casos límite. No dejes espacio para fallos inesperados.
Ejemplo incorrecto (sin manejo de errores):
function getUserAge(user) { return user.age; // Si user o user.age es undefined — error}Ejemplo correcto (con protección):
function getUserAge(user) { if (!user || typeof user.age !== 'number') { return null; // o throw new Error('Invalid user data') } return user.age;}Principios de manejo de errores:
- Usa
try/catchpara operaciones asíncronas (especialmente en Node.js). - Crea tus propias clases de error para diferentes situaciones.
- No tragues errores en silencio — regístralos o propágalos hacia arriba.
class ValidationError extends Error { constructor(message)