Clean Code em JavaScript: princípios e exemplos na prática
Código limpo não é apenas um termo da moda, mas uma necessidade profissional. No mundo do JavaScript e Node.js, onde os projetos crescem e mudam rapidamente, a habilidade de escrever código compreensível e sustentável diferencia o desenvolvedor experiente do iniciante. Neste artigo, vamos analisar os princípios-chave do Clean Code com exemplos concretos da prática real.
Por que o código limpo é importante para o desenvolvedor JavaScript?
JavaScript é uma linguagem com tipagem dinâmica, o que a torna flexível, mas também mais propensa a erros. Código mal escrito em Node.js pode transformar a manutenção do projeto em um pesadelo. Clean Code ajuda a:
- Reduzir o tempo de depuração e refatoração
- Simplificar a integração de novos desenvolvedores no projeto
- Diminuir a quantidade de bugs em produção
- Aumentar a produtividade da equipe
Vamos passar para os princípios e exemplos específicos.
Princípio 1: Nomes significativos para variáveis e funções
A regra mais simples e, ao mesmo tempo, a mais violada. O nome da variável deve responder à pergunta "o que é isso?" ou "para que serve isso?".
Exemplo ruim:
// Ruim: o que é d? o que fn faz?const d = new Date();const fn = (a, b) => a + b;const arr = [1, 2, 3, 4];const x = arr.filter(i => i > 2);Exemplo bom:
// Bom: compreensível sem comentáriosconst currentDate = new Date();const sum = (firstNumber, secondNumber) => firstNumber + secondNumber;const numbers = [1, 2, 3, 4];const filteredNumbers = numbers.filter(number => number > 2);Regra para Node.js: se você trabalha com operações assíncronas, adicione sufixos que indiquem o tipo de valor retornado: getUserDataAsync, fetchPosts.
Princípio 2: Funções devem ser pequenas e fazer uma única coisa (KISS)
O princípio KISS (Keep It Simple, Stupid) em JavaScript é criticamente importante. Uma função não deve ser um "canivete suíço".
Exemplo ruim — função-monstro:
// Ruim: uma função faz tudofunction processUserData(user) { // Validação if (!user.email || !user.name) { throw new Error('Invalid user data'); } // Formatação const formattedName = user.name.trim().toLowerCase(); const formattedEmail = user.email.trim().toLowerCase(); // Salvamento no BD db.save({ name: formattedName, email: formattedEmail }); // Envio de email emailService.sendWelcome(formattedEmail); // Registro de log logger.info(`User ${formattedName} processed`);}Exemplo bom — separação de responsabilidades:
// Bom: cada função é responsável por uma tarefafunction 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;}Esse código é mais fácil de testar, depurar e expandir.
Princípio 3: Evite números e strings mágicos (DRY)
"Números mágicos" são literais cujo significado não é óbvio. Extraia-os para constantes com nomes compreensíveis.
Exemplo ruim:
// Ruim: o que é 1000? por que 60?setTimeout(() => { if (user.age > 65)