Regras de Lint: Como usar no código

Regras de lint

Você já perdeu uma hora debugando um erro que era só um ponto e vírgula faltando? Ou pegou aquele pull request com 47 arquivos onde cada dev usava um estilo diferente de indentação? Regras de lint existem para matar esses problemas na raiz. Elas são um revisor automático que lê seu código antes de qualquer humano e aponta inconsistências, erros potenciais e violações de padrão.

Lint não é frescura. Times que ignoram linting gastam cerca de 23% mais tempo em code review tratando questões de estilo em vez de discutir lógica e arquitetura. Esse dado vem de pesquisas da SmartBear sobre práticas de code review em equipes de desenvolvimento. Quando você configura regras de lint no seu projeto, o computador cuida da parte mecânica e os desenvolvedores focam no que realmente importa.

Aqui tem tudo: o que são regras de lint, como elas funcionam por dentro, quais ferramentas usar para cada linguagem e como integrar tudo no seu pipeline de desenvolvimento. Se você trabalha com APIs, consumindo ou construindo, vai ver como o linting impacta diretamente a qualidade do código que interage com serviços externos como consulta de CPF, CNPJ ou CEP.

O que são regras de lint?

O nome “lint” vem de uma ferramenta criada em 1978 por Stephen C. Johnson nos laboratórios Bell. Ela analisava código C procurando construções suspeitas que o compilador aceitava mas que provavelmente eram bugs. O nome faz referência àquelas bolinhas de tecido que grudam na roupa — pequenos resíduos que você não percebe até olhar de perto.

Quatro décadas depois, o conceito evoluiu bastante. Um linter hoje cobre muito mais que erros de sintaxe. Ele verifica estilo de código, padrões de segurança, acessibilidade em HTML, complexidade ciclomática (quantidade de caminhos independentes que o código pode seguir) e até importações desnecessárias. Cada regra é uma instrução específica que o linter aplica ao ler seu código-fonte.

Como um linter funciona na prática

Um linter opera em três etapas. Primeiro, ele faz o parsing (leitura e interpretação estrutural) do seu código, transformando texto em uma árvore sintática abstrata (AST). Depois, percorre essa árvore aplicando cada regra configurada. Por fim, gera um relatório com os problemas encontrados, separados entre warnings e errors.

Diferença entre lint, formatação e testes

Lint, formatação e testes
Lint, formatação e testes

Muita gente confunde linting com formatação. São coisas diferentes. Formatadores como o Prettier cuidam da aparência — espaços, quebras de linha, aspas simples ou duplas. Já o linter analisa a semântica e lógica do código.

Testes verificam se o código funciona corretamente para inputs específicos. O linter verifica se o código segue padrões antes mesmo de rodar. São camadas complementares: lint pega problemas estruturais, testes pegam problemas de comportamento.

Principais ferramentas de lint por linguagem

O ESLint domina o ecossistema JavaScript. Nicholas Zakas criou a ferramenta em 2013, e hoje ela passa de 40 milhões de downloads semanais no npm. O ESLint é totalmente plugável — você cria regras customizadas, usa presets da comunidade e integra com qualquer editor.

Para TypeScript, o typescript-eslint estende o ESLint com regras que entendem tipos. Ele detecta coisas como usar any quando existe um tipo específico, ou promises não tratadas.

Outra ferramenta ganhando tração é o Biome (antigo Rome). Ele combina linting e formatação num único binário escrito em Rust. A execução é muito rápida — até 35x mais veloz que ESLint em benchmarks com projetos grandes.

Ferramentas para Python

O Pylint é o clássico do Python. Rigoroso por padrão, ele verifica desde nomes de variáveis até complexidade de funções. Muitos devs acham ele verboso demais e migram para o Flake8, que é mais leve e combina três checadores: PyFlakes, pycodestyle e McCabe.

O Ruff apareceu em 2022 e sacudiu o ecossistema. Escrito em Rust, ele reimplementa centenas de regras do Flake8 e outros linters Python rodando 10-100x mais rápido. Se você trabalha com projetos Python grandes, Ruff é a melhor opção disponível hoje.

Ferramentas para outras linguagens

Linguagem Linter Principal Alternativa Foco
Go golangci-lint go vet Agrupa 50+ linters
Rust clippy rustfmt Idiomas e performance
Java Checkstyle SpotBugs Estilo e bugs
PHP PHPStan Psalm Análise estática tipada
Ruby RuboCop StandardRB Estilo + segurança
CSS Stylelint Padrões e erros CSS
SQL SQLFluff Estilo e dialetos SQL
Shell ShellCheck Bugs comuns em bash

Cada linguagem tem seu ecossistema. Não existe projeto profissional sério que não use algum tipo de linting. É tão básico quanto usar controle de versão.

Não tente ativar todas as verificações de uma vez em projetos legados. Você vai gerar centenas de erros e desmoralizar o time. Use uma abordagem incremental: comece com regras de erro (bugs reais) e vá adicionando regras de estilo gradualmente.

Como configurar regras de lint no seu projeto

Como configurar regras de lint no seu projeto
Como configurar regras de lint no seu projeto

A configuração do ESLint mudou com a versão 9, que adotou o formato flat config. Crie um arquivo eslint.config.js na raiz do projeto.

Cada regra aceita três níveis: “off” (desligada), “warn” (aviso) e “error” (bloqueia). Algumas regras aceitam opções extras no formato array, como [“error”, “always”].

A seção files permite aplicar regras diferentes para arquivos específicos. No exemplo acima, arquivos de teste podem usar console.log livremente — faz sentido para debugging durante o desenvolvimento de testes.

Criando regras customizadas

Às vezes, as regras prontas não cobrem uma necessidade específica do seu projeto. Digamos que você quer proibir chamadas HTTP sem tratamento de erro. Você pode criar um plugin ESLint customizado.

Essa regra é especialmente útil quando seu projeto consome APIs externas. Se você integra com serviços de consulta de CPF ou CNPJ, um fetch sem try/catch pode derrubar toda a experiência do usuário por causa de um timeout não tratado. Regras de lint customizadas protegem contra esses descuidos.

Presets e configurações compartilhadas

Em primeiro lugar, ninguém precisa configurar 200 checagens do zero, visto que é muito mais prático utilizar presets prontos. Por exemplo, o eslint:recommended traz regras básicas que capturam bugs óbvios, enquanto o airbnb se destaca como o guia de estilo mais popular, opinado e rigoroso do mercado. Além disso, existe o standard, que não utiliza ponto e vírgula e é comum em projetos open source, bem como o padrão google, conhecido por ser bastante equilibrado.

Para otimizar o trabalho em equipe, a recomendação ideal é criar um pacote npm com as regras de lint e compartilhá-lo entre os projetos. Dessa forma, você garante a consistência em toda a organização. Na prática, um pacote como eslint-config-minha-empresa evita diretamente que cada repositório invente as suas próprias convenções.

Adicionalmente, vale destacar o padrão argsIgnorePattern: "^_". Basicamente, ele permite o uso de variáveis prefixadas com underscore sem gerar erros, sendo uma convenção muito útil para parâmetros obrigatórios que não são utilizados, como em callbacks onde apenas o segundo argumento importa.

Por consequência, se você desenvolve APIs profissionais, manter essas regras padronizadas entre todos os serviços reduz significativamente o atrito durante o code review. Como um ótimo exemplo prático, o Hub do Desenvolvedor oferece APIs de consulta de CPF, CNPJ e CEP que seguem padrões estritamente consistentes, justamente porque a qualidade do código passa por processos rigorosos como esse.

Por fim, como grande vantagem estratégica, times que publicam essas configurações na forma de pacotes compartilhados conseguem reduzir, em média, 40% do tempo de onboarding de novos desenvolvedores. Isso ocorre porque o próprio linter ensina as convenções do projeto de maneira totalmente automática, eliminando assim a necessidade de criar um documento exaustivo de 50 páginas que quase ninguém lê.

Regras de lint que todo projeto precisa

"

Regras de detecção de bugs

Estas são as checagens que realmente salvam seu código de bugs em produção. Não são questão de estilo, são questão de corretude:

  • no-undef — impede uso de variáveis não declaradas. Pega typos como cosnt em vez de const.
  • no-unreachable — detecta código depois de return, throw ou break que nunca será executado.
  • no-dupe-keys — impede chaves duplicadas em objetos, onde a segunda sobrescreve a primeira silenciosamente.
  • no-async-promise-executor — barra new Promise (async (resolve) => …), um padrão que esconde erros.
  • no-loss-of-precision — detecta números literais que perdem precisão em JavaScript, tipo 9007199254740993 que vira 9007199254740992.

Em Python com Ruff, as equivalentes são:

  • F841 — variável local atribuída mas nunca usada
  • E711 — comparação com None usando == em vez de is
  • B006 — argumento default mutável em função (aquele bug clássico da lista vazia)
  • S105 — senhas hardcoded no código

Regras de segurança

Regras de lint focadas em segurança são as mais subestimadas. Elas pegam vulnerabilidades antes que qualquer scanner de segurança entre em ação:

Regra Ferramenta O que detecta
no-eval ESLint Uso de eval() que permite injeção de código
detect-non-literal-regexp eslint-plugin-security RegExp com input do usuário (ReDoS)
S608 Ruff/Bandit SQL injection via string formatting
S301 Ruff/Bandit Uso de pickle (desserialização insegura)
react/no-danger eslint-plugin-react dangerouslySetInnerHTML (XSS)
no-secrets/no-secrets eslint-plugin-no-secrets Strings que parecem tokens/chaves de API

Em especial, a regra no-secrets merece bastante atenção. Isso porque ela utiliza a entropia de Shannon para detectar strings que se assemelham a chaves de API. Consequentemente, se você integra APIs, como consultas de CPF e CNPJ, essa regra atua justamente para garantir que credenciais confidenciais nunca vazem no código commitado.

Regras de qualidade e manutenção

Muito além de prevenir bugs e garantir a segurança, existem regras de lint essenciais que protegem a saúde estrutural do código ao longo do tempo. Para começar, a regra complexity limita a complexidade ciclomática das funções. Afinal, um ifdentro de outro if, enclausurado em um for, vira um “código espaguete” rapidamente; por isso, mantenha esse índice sempre abaixo de 10.

Logo em seguida, temos o max-depth, que atua para limitar o aninhamento excessivo de blocos. Em outras palavras, se você atingiu 5 níveis de indentação, o seu projeto precisa urgentemente de uma refatoração. Além disso, a regra max-lines-per-function nos lembra que funções longas são extremamente difíceis de testar e de entender, de modo que 50 linhas se consagra como um limite prático e saudável.

Paralelamente, a aplicação do no-magic-numbers evita que números soltos e sem explicação virem um verdadeiro mistério para a equipe em apenas três meses. Sendo assim, utilize sempre constantes nomeadas. Por fim, a adoção do prefer-template assegura o uso de template literals em vez da velha concatenação com +, simplesmente porque eles tornam a leitura significativamente mais clara e fluida.

Lint em code review automatizado

Code review
Code review

Atualmente, ferramentas como o Danger.js e o Reviewbot integram os resultados de lint diretamente nos pull requests. Com isso, em vez de um desenvolvedor sênior precisar apontar manualmente que “você esqueceu de tratar essa promise”, o próprio bot já comenta o erro de forma totalmente automática.

Nesse contexto, para times que constroem integrações com APIs, manter o lint automatizado durante o code review é absolutamente fundamental. Afinal, essa prática garante que cada chamada tenha o devido tratamento de erro, a tipagem correta e, principalmente, que nenhum segredo seja exposto no código. Por exemplo, APIs como as do Hub do Desenvolvedor exigem exatamente esse alto nível de cuidado.

Além disso, estudos de engenharia de software indicam que as equipes que adotam o linting automatizado no ambiente de CI reduzem a incidência de bugs em produção em cerca de 15% a 20%. Mais ainda, elas gastam significativamente menos tempo na revisão manual do código. Em suma, o investimento inicial de apenas duas horas configurando a ferramenta economiza, sem dúvida alguma, centenas de horas de retrabalho ao longo de todo o projeto.

Monitorando a saúde do lint ao longo do tempo

Em primeiro lugar, é essencial entender que não basta apenas configurar a ferramenta e esquecê-la. Pelo contrário, você deve utilizar plataformas como o SonarQube ou o Code Climate para acompanhar rigorosamente as métricas de qualidade ao longo do tempo. Afinal, esses sistemas mostram com clareza se a dívida técnica está aumentando ou diminuindo, além de indicarem quantas violações de lint ocorrem por sprint e quais são as regras que o time mais viola.

Nesse contexto, uma métrica extremamente útil é o “lint fix rate”, ou seja, a porcentagem de problemas corrigidos em relação aos novos erros introduzidos. Consequentemente, se esse número estiver abaixo de 100%, significa que a sua equipe está acumulando débito técnico. Por outro lado, se o índice se mantiver acima de 100%, fica evidente que a saúde do projeto está melhorando de forma progressiva e sustentável.

Erros comuns e boas práticas com regras de lint

Os 5 erros que times cometem com lint

Em primeiro lugar, é inegável que todo desenvolvedor já desativou uma regra de lint por falta de tempo. Embora isso seja aceitável esporadicamente, o excesso transforma a ferramenta em mera decoração. Portanto, para evitar esse cenário, exija sempre um comentário justificando a desativação. Além disso, ao implementar o linter em projetos legados, jamais ative as regras mais rigorosas de uma só vez, pois isso desanima a equipe. Em vez disso, comece apenas com o eslint:recommended e adicione validações gradualmente a cada sprint, garantindo, assim, uma evolução estruturada e sem traumas.

Ademais, é crucial saber diferenciar os níveis de alerta. Se, por um lado, classificar tudo como erro dessensibiliza o programador, por outro, tratar tudo como aviso faz com que as correções sejam ignoradas. Sendo assim, restrinja os erros para bugs reais (como no-undef) e use avisos para melhorias de qualidade (como prefer-const). Contudo, no ambiente de CI, trate esses avisos como bloqueios justamente para evitar o acúmulo de dívida técnica.

Outro ponto fundamental é não ignorar a validação nos arquivos de teste. Afinal de contas, testes mal escritos geram falsos positivos e, consequentemente, minam a confiança do time. Por isso, flexibilize algumas exigências específicas para esse contexto, mas, sob nenhuma hipótese, desative o lint por completo nessas pastas.

Por fim, a falta de alinhamento entre formatadores e o linter gera um verdadeiro ciclo infinito de conflitos, especialmenteentre o Prettier e o ESLint. Para resolver isso de forma definitiva, basta configurar o pacote eslint-config-prettier, visto queele desativa automaticamente todas as regras conflitantes. Dessa maneira, o impasse é superado de uma vez por todas, consolidando um fluxo de trabalho perfeitamente harmonioso.

Quando faz sentido desativar uma regra

Quando faz sentido desativar uma regra
Quando faz sentido desativar uma regra

Certamente, existem cenários perfeitamente legítimos para desativar regras de lint. Afinal, isso não é um erro imperdoável, mas sim puro pragmatismo diário. Em primeiro lugar, destaca-se o código gerado automaticamente, como arquivos de migração de banco e tipos criados por GraphQL ou OpenAPI. Nesses casos, a melhor prática é isolar esses diretórios diretamente no .eslintignore.

Além disso, durante uma prototipagem rápida, seja em um hackathon ou em uma prova de conceito, o rigor excessivo atrapalha a fluidez. Contudo, deve-se sempre reativar a ferramenta antes da ida para a produção. Em paralelo, podem surgir conflitos com os padrões da linguagem. Por exemplo, certas exigências do ESLint não fazem sentido no TypeScript, pois o próprio compilador já as valida, embora o typescript-eslint resolva grande parte dessa fricção.

Ademais, ao integrar bibliotecas de terceiros ou APIs que retornam dados em formatos atípicos, é totalmente aceitável desativar regras como o camelcase naquele arquivo específico. Em suma, desativar validações com uma intenção clara e bem documentada é algo completamente diferente de simplesmente ignorá-las por preguiça.

Para onde o linting está indo

Atualmente, ferramentas como o Biome e o Ruff provam, de fato, que a performance importa muito, visto que ninguém deseja esperar longos segundos para o linter rodar. Por consequência, a grande tendência do mercado é combinar linting, formatação e type-checking em uma única solução extremamente rápida.

Além disso, outro movimento inovador é a adoção de Inteligência Artificial para sugerir correções. Por exemplo, o GitHub Copilot já fornece fixes inline, enquanto soluções como o Amazon CodeGuru realizam revisões automatizadas avançadas. Nesse sentido, essas IAs aplicam regras que vão muito além do lint tradicional, detectando falhas complexas, tais como memory leaks, race conditions e padrões estruturais ineficientes.

Diante desse cenário, para quem trabalha com APIs, manter o linting rigorosamente atualizado é o que garante que o código de integração permaneça robusto e seguro. Sendo assim, se você busca APIs confiáveis para a consulta de CPF, CNPJ e CEP, o Hub do Desenvolvedor surge como a escolha ideal. Afinal, a plataforma oferece endpointsimpecavelmente documentados e SDKs nativos que, desde o início, já seguem as melhores práticas de lint.

Conclusão

Inegavelmente, as regras de lint formam a base absoluta da qualidade de código em qualquer projeto profissional. Portanto, seja para um desenvolvedor solo trabalhando em seu próprio SaaS ou para equipes robustas de 200 pessoas, o linting automatizado não apenas previne bugs e padroniza o estilo, como também economiza um tempo valioso de desenvolvimento diário.

Nesse sentido, o caminho de implementação é bastante simples. Primeiramente, escolha a ferramenta mais adequada para a sua linguagem e comece com regras conservadoras. Em seguida, integre essa solução diretamente no editor e no seu ambiente de CI, garantindo assim que a evolução da equipe ocorra de maneira gradual e orgânica. Como resultado direto dessa prática, em poucas semanas você sentirá uma diferença formidável na qualidade estrutural e na velocidade das revisões.

Por fim, se você realmente deseja levar a qualidade do seu código de integração a sério, explore as APIs do Hub do Desenvolvedor. Afinal, a plataforma oferece recursos avançados de consulta de CPF, CNPJ e CEP, contando sempre com uma documentação cristalina e SDKs totalmente prontos para uso imediato.

Compartilhe nas mídias:

Obtenha Acesso Imediato a todos WebServices!

Tenha acessos a todos os dados e API de WS.

Destaques: