Revisão de código em JavaScript: o que realmente irrita os seniors
\n\nTodo desenvolvedor já recebeu pelo menos um pull request com um comentário como "é melhor reescrever isso aqui" ou "isso é um antipadrão". Se você é Júnior ou Pleno, essas observações muitas vezes parecem picuinhas. Mas por trás de cada palavra de um sênior há experiência real: um problema em produção, um bug às três da manhã ou uma queda de desempenho.
\n\nReunimos as observações mais comuns que os seniors deixam nas revisões de código em JavaScript. Não é apenas uma lista de "isso é ruim, isso é bom". É uma análise do porquê uma abordagem específica é considerada ruim e com o que pode ser substituída.
\n\nO artigo será útil para todos que escrevem em JS: desde iniciantes até desenvolvedores experientes que desejam melhorar a qualidade do código.
\n\n1. Mutação de dados de entrada: o pecado capital
\n\nUm dos erros mais comuns em revisões é modificar objetos ou arrays passados para uma função. Os seniors odeiam isso porque a mutação quebra a imutabilidade e leva a bugs difíceis de rastrear.
\n\nExemplo ruim
\nfunction addUser(users, newUser) {\n users.push(newUser); // mutação do array original!\n return users;\n}\n\nconst allUsers = [{ id: 1 }, { id: 2 }];\nconst updated = addUser(allUsers, { id: 3 });\nconsole.log(allUsers.length); // 3 — o array original foi alterado!\n\nComo fazer
\nfunction addUser(users, newUser) {\n return [...users, newUser]; // retorna um novo array\n}\n\nconst allUsers = [{ id: 1 }, { id: 2 }];\nconst updated = addUser(allUsers, { id: 3 });\nconsole.log(allUsers.length); // 2 — o original não foi tocado\n\nPor que isso é importante: quando você muta os dados de entrada, qualquer outro código que referencie o mesmo objeto sofre alterações inesperadas. Este é um caminho direto para bugs em operações assíncronas, stores do Redux e estados do React.
\n\n2. Números e strings mágicas: assassinos da legibilidade
\n\nOs seniors frequentemente escrevem nos comentários: "Que número é 86400?" ou "De onde veio essa string?". Valores mágicos tornam o código incompreensível e dificultam sua manutenção.
\n\nExemplo ruim
\nfunction calculateDiscount(price) {\n if (price > 1000) {\n return price * 0.9;\n }\n return price * 0.95;\n}\n\nComo fazer
\nconst DISCOUNT_THRESHOLD = 1000;\nconst HIGH_DISCOUNT_RATE = 0.9;\nconst STANDARD_DISCOUNT_RATE = 0.95;\n\nfunction calculateDiscount(price) {\n if (price > DISCOUNT_THRESHOLD) {\n return price * HIGH_DISCOUNT_RATE;\n }\n return price * STANDARD_DISCOUNT_RATE;\n}\n\nDica: coloque todas as constantes em variáveis nomeadas ou em um arquivo de configuração separado. Isso simplifica a revisão de código em JavaScript e o torna autodocumentado.
\n\n3. Erros com async/await e promises
\n\nCódigo assíncrono é uma área onde até mesmo plenos tropeçam. Os seniors nas revisões prestam atenção a dois pontos principais: tratamento incorreto de erros e mistura de sintaxes.
\n\nExemplo ruim (promise sem catch)
\nasync function loadData() {\n const response = await fetch('/api/data');\n const data = await response.json();\n return data;\n}\n\nComo fazer
\nasync function loadData() {\n try {\n const response = await fetch('/api/data');\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data;\n } catch (error) {\n console.error('Erro ao carregar dados:', error);\n throw error; // repassa adiante, se necessário\n }\n}\n\nImportante: nunca ignore erros. Um catch vazio é um mal. Se um erro ocorrer, você deve pelo menos registrá-lo, e melhor ainda, tratá-lo corretamente.
Outro erro comum — esquecer o await
\nfunction processUsers(users) {\n users.forEach(async (user) => {\n await updateUser(user);