Clean Code em JavaScript: princípios e exemplos para iniciantes
Código limpo (Clean Code) não é apenas um conceito da moda, mas uma habilidade fundamental de qualquer desenvolvedor profissional. No mundo do JavaScript (especialmente no ambiente Node.js), o código é escrito rapidamente, mas mantê-lo sem princípios claros se torna um verdadeiro pesadelo. Este artigo é para iniciantes que desejam escrever não apenas código funcional, mas bonito, legível e escalável.
Código limpo é aquele que é fácil de ler, fácil de modificar e fácil de testar. Ele não desperta o desejo de reescrevê-lo do zero. Vamos analisar os princípios principais com exemplos práticos.
1. Nomeação de variáveis e funções: diga a verdade
A regra mais simples e ao mesmo tempo mais complexa — o nome deve refletir a essência. Não economize caracteres, economize tempo de compreensão.
Ruim (não claro):
const d = new Date();const arr = ['apple', 'banana', 'grape'];const fn = (x) => x * 2;Bom (legível):
const currentDate = new Date();const fruitList = ['apple', 'banana', 'grape'];const doubleValue = (value) => value * 2;Regras de nomeação:
- Variáveis — substantivos (user, productList, errorMessage).
- Funções — verbos (getUser, calculateTotal, validateEmail).
- Valores booleanos — comece com
is,has,should(isActive, hasPermission, shouldUpdate). - Evite números mágicos — coloque-os em constantes.
// Ruimconst t = 3600000; // Que número é esse?
// Bomconst MILLISECONDS_IN_AN_HOUR = 3600000;const timeout = MILLISECONDS_IN_AN_HOUR;2. Funções: um passo — uma ação
O princípio da responsabilidade única (Single Responsibility Principle) também se aplica às funções. Uma função deve fazer uma coisa e fazê-la bem.
Ruim (faz tudo de uma vez):
function processUserData(user) { const fullName = `${user.firstName} ${user.lastName}`; const email = user.email.toLowerCase(); const isValid = email.includes('@'); if (isValid) { const result = { fullName, email }; saveToDatabase(result); sendWelcomeEmail(email); return result; } else { throw new Error('Invalid email'); }}Bom (dividido em pequenas funções):
function buildFullName(firstName, lastName) { return `${firstName} ${lastName}`;}
function normalizeEmail(email) { return email.toLowerCase().trim();}
function isValidEmail(email) { return email.includes('@');}
function processUserData(user) { const fullName = buildFullName(user.firstName, user.lastName); const email = normalizeEmail(user.email); if (!isValidEmail(email)) { throw new Error('Invalid email'); } const result = { fullName, email }; saveToDatabase(result); sendWelcomeEmail(email); return result;}Esse código é fácil de testar, fácil de modificar e fácil de entender.
3. Gerenciamento de complexidade: evite aninhamento profundo
Aninhamento profundo de if e for é inimigo da legibilidade. Use retorno antecipado (early return) e Guard Clauses.
Ruim (inferno profundo):
function processOrder(order) { if (order) { if (order.isPaid) { if (order.items.length > 0) { // ... 50 linhas de código } } }}Bom (estrutura plana):
function processOrder(order) { if (!order) { return; }