
Clean Code: princípios práticos para times brasileiros em 2026
Conteúdo educativo. Não somos consultoria nem vendemos cursos de Clean Code. As recomendações abaixo seguem o livro original de Robert C. Martin (2008) e revisões públicas recentes (Dan Abramov, John Ousterhout) — referências completas no fim do artigo.
Clean Code, publicado por Robert C. Martin em 2008, virou referência quase obrigatória em entrevistas técnicas no Brasil. Mas o livro tem quase 20 anos, e a comunidade já reviu várias das suas recomendações. Este artigo resume os princípios que continuam úteis, mostra exemplos em TypeScript e aponta onde aplicar literalmente o livro pode piorar o código.
O que Clean Code propõe
O livro defende que código é lido muito mais do que escrito, então otimizar para leitura paga dividendos ao longo da vida do projeto. Os capítulos cobrem nomes, funções, comentários, formatação, objetos, tratamento de erros e testes. Não é um padrão fechado: é um conjunto de heurísticas com exemplos em Java.
Princípios que envelheceram bem
1. Nomes que revelam intenção
Variáveis e funções devem ser nomeadas pelo que representam, não pelo tipo ou pela posição. O custo de digitar um nome longo é desprezível frente ao custo de reler o código.
// ruim
const d = 7; // dias até expirar
function fn(u: User, l: Item[]) { /* ... */ }
// melhor
const diasAteExpirar = 7;
function calcularTotalDoCarrinho(usuario: User, itens: Item[]) { /* ... */ }2. Funções pequenas com uma responsabilidade
Funções com 5–15 linhas são mais fáceis de testar, nomear e reusar. O limite exato não importa; o que importa é cada função fazer uma coisa identificável. Quando você precisa escrever “e” na descrição (“valida e salva e envia email”), provavelmente são três funções.
3. Evite efeitos colaterais escondidos
Uma função chamada calcularImposto() não deveria alterar o estado da sessão nem enviar email. Efeitos colaterais devem estar explícitos no nome ou centralizados em camadas dedicadas (serviços, repositórios).
4. Trate erros como cidadãos de primeira classe
Erros não são exceções no sentido coloquial — fazem parte do contrato. Use tipos de retorno explícitos (Result, Either) ou throws documentados, e nunca engula erros com catch vazio. O TypeScript ajuda com unknown em catch desde 4.4.
// trate o erro, não o esconda
try {
await salvarPedido(pedido);
} catch (err) {
if (err instanceof PedidoInvalidoError) {
return { ok: false, motivo: err.message };
}
logger.error({ err }, "falha inesperada ao salvar pedido");
throw err;
}5. Teste o que importa, não a sintaxe
Cobertura de 100% não é sinônimo de qualidade. Foque testes em comportamentos observáveis (entrada → saída, efeitos visíveis) em vez de detalhes de implementação. Testes acoplados à estrutura interna quebram a cada refatoração legítima.
Princípios que envelheceram mal
1. "Funções devem ter no máximo 4 linhas"
O livro chega a sugerir funções de 2–4 linhas. Na prática, extrair tudo gera um efeito conhecido como over-decomposition: o leitor precisa pular entre 8 arquivos para entender uma rotina linear. Dan Abramov, em "The Wet Codebase" (2019) e "Goodbye, Clean Code" (2020), mostra como a abstração prematura cria acoplamento pior que a duplicação.
2. Comentários são quase sempre ruins
O livro recomenda eliminar comentários sempre que possível, alegando que código bom se explica sozinho. Funciona para lógica trivial. Para regras de negócio complexas, integrações externas com APIs erráticas ou workarounds de bugs conhecidos, comentários explicando o porquê (não o quê) são essenciais. John Ousterhout (A Philosophy of Software Design, 2018) defende explicitamente o oposto: comentários são parte do design.
3. Hierarquias de herança profundas
Os exemplos em Java do livro recorrem a herança que hoje seria considerada antipadrão. Composição sobre herança é a recomendação mainstream desde GoF (1994) e foi reforçada no movimento de Domain-Driven Design e na própria evolução de TypeScript/React (hooks > HOC > mixins).
Métricas objetivas que ajudam mais
| Métrica | O que mede | Limite saudável (mediana) |
|---|---|---|
| Complexidade ciclomática | Caminhos lógicos por função | ≤ 10 |
| Tamanho de arquivo | Linhas de código por arquivo | ≤ 300 |
| Profundidade de aninhamento | Níveis de if/for/while | ≤ 3 |
| Duplicação | Blocos idênticos em arquivos diferentes | < 5% |
| Cobertura por caminho crítico | Testes nas rotas de negócio principais | ≥ 80% |
Ferramentas como ESLint (plugin sonarjs), SonarQube e CodeClimate calculam essas métricas em CI. Defina limites no pipeline e falhe o build quando ultrapassar — é mais objetivo do que revisão subjetiva em PRs.
Refatoração: quando vale o custo
Refatorar tem custo: tempo, risco de regressão e revisão de PR. A regra do escoteiro ("deixe o código mais limpo do que encontrou") só funciona se as mudanças forem pequenas e cobertas por testes. Refatorações grandes (>500 linhas) precisam de uma justificativa explícita: bug recorrente, performance, ou bloqueio para uma nova feature.
- Sempre refatore: quando você está prestes a alterar a função (custo marginal próximo de zero).
- Avalie caso a caso: código duplicado em 3+ lugares; nomes confusos que já causaram bug em produção.
- Evite: código legado que ninguém mais toca, está em produção há anos e ninguém abriu issue. Custo > benefício.
Checklist prático para code review
- O nome da função descreve o que ela faz sem precisar abrir o corpo?
- Há efeitos colaterais não óbvios pelo nome?
- Funções com mais de 30 linhas têm justificativa (algoritmo, parser, configuração estática)?
- Erros são tratados com tipo específico ou apenas catch genérico?
- Há testes para o comportamento novo, não só para a implementação?
- Comentários explicam o porquê das decisões não óbvias?
Perguntas frequentes
+Clean Code ainda é leitura obrigatória em 2026?
É leitura útil, não obrigatória. Recomendo combiná-lo com A Philosophy of Software Design (Ousterhout) e com os ensaios de Dan Abramov para ter uma visão equilibrada. Ler só Clean Code pode levar a over-engineering por abstrações desnecessárias.
+Devo aplicar todos os princípios em código pessoal?
Não. Em scripts, MVPs e exploração de ideias, escrever rápido e descartável é mais valioso que código limpo. Aplique Clean Code quando o código vai ser mantido por mais de uma pessoa por mais de seis meses.
+Como introduzir Clean Code em um time que nunca usou?
Comece por linter (ESLint, Prettier) e métricas automáticas no CI. Code review subjetivo gera atrito; regras automatizadas são neutras. Depois introduza um princípio por sprint, com exemplos concretos do próprio repositório.
+Qual a diferença entre Clean Code e Clean Architecture?
Clean Code (2008) trata de qualidade no nível de função/classe. Clean Architecture (2017) trata de organização do sistema em camadas. São livros complementares do mesmo autor, mas Clean Architecture é mais controverso — muitos times consideram dogmático para web apps comuns.
Fontes consultadas
- Robert C. Martin — Clean Code (Prentice Hall, 2008)
- John Ousterhout — A Philosophy of Software Design (2018)
- Dan Abramov — Goodbye, Clean Code
- Dan Abramov — The Wet Codebase (talk)
- SonarSource — Cognitive Complexity (white paper)
- ESLint — sonarjs plugin
Revisão editorial: publicado em . Última revisão em . Conteúdo educativo, sem patrocínio das ferramentas citadas.
Leia também

Como Começar na Programação do Zero em 2026: Guia Definitivo
Roteiro completo para quem quer entrar na programação em 2026: escolha de linguagem, setup de ambiente, lógica de programação, primeiros projetos, comunidades e como evitar armadilhas comuns de iniciantes.

HTML, CSS e JavaScript: O Trio Essencial da Web Moderna
Domine os três pilares do desenvolvimento web: HTML semântico para estrutura, CSS moderno para estilo e layout responsivo, e JavaScript para interatividade, manipulação do DOM e consumo de APIs.

Git e GitHub Básico: Controle de Versão para Quem Coda
Guia prático de Git e GitHub para iniciantes: instalação, commits, branches, merge, rebase, pull requests, resolução de conflitos e fluxos de trabalho profissionais em equipe.