Encontrando smells no seu código

Nem sempre pensamos na qualidade do nosso código enquanto estamos escrevendo-o. E, vez ou outra, deixamos passar uma classe que tem com mais linhas do que deveria, métodos com muitos parâmetros, ou mesmo até mais acoplada ou menos coesa do que gostaríamos.

Mas como fazer pra detectar esses problemas? Afinal, é impossível olhar classe a classe ou método a método. É para isso que temos ferramentas, como PMD, Checkstyle, FindBugs, e etc. Elas nos ajudam a encontrar classes que são problemáticas.

Como elas fazem isso? Elas saem lendo o seu código, e capturando tudo que acham estranho. E depois nos dão um relatório! Para dar um gostinho disso, vamos experimentar o PMD. É fácil, basta baixá-lo (na versão certa do seu sistema operacional), e executá-lo!

No Linux e Mac, o PMD vem com um run.sh dentro da pasta /bin. E aí, basta configurarmos. Tudo que precisamos passar pra ele é:

  • -d e apontar o diretório do projeto que queremos analisar. No meu caso, vou analisar o MetricMiner, o projeto que uso em meu doutorado.
  • -f e o formato que o PMD deve escrever a saída. Ele possui vários formatos, como CSV, HTML, texto, e etc.
  • -R e a lista de regras a serem avaliadas. O PMD possui uma lista de regras enorme para Java (e muitas outras linguagens).

Vamos começar então com apenas uma regra:

./run.sh pmd 
  -d ~/workspace/metricminer2/src/ 
  -f html 
  -R rulesets/java/basic.xml 
  > muito.html

E voilà! Olha a saída aqui. Com o conjunto de regras java-basic, o PMD reclamou sobre “Avoid using a branching statement as the last in a loop” em 2 classes. Ou seja, ele criticou que em dois loops, a última linha deles era um break. E, segundo o manual, isso pode ser causar bugs ou mesmo dificultar a legibilidade do código.

Legal, né!? Podemos aumentar ainda mais o conjunto de regras que ele vai executar. Por exemplo, basic e design. Veja aqui que agora o número de problemas levantados é muito maior. E você pode clicar em cada um deles para entender um pouco mais!

./run.sh pmd 
  -d ~/workspace/metricminer2/src/ 
  -f html 
  -R rulesets/java/basic.xml,rulesets/java/design.xml 
  > muito.html

Agora, mais importante do que usar a ferramenta, é saber interpretar os dados. Veja que muitos dos problemas acontecem na classe Java8BaseListener, que é uma classe gerada automaticamente pelo Antlr (um framework usado pelo MetricMiner). Ou seja, é uma classe que não é mantida manualmente, então não deveria aparecer no relatório.

Então, agora que você conhece a ferramenta, mais do que sair usando, customize-a. Escolha a dedo as regras para executar, e crie o seu conjunto de regras. E por quê não também plugar o PMD na sua ferramenta de build favorita? Tudo é possível!

Agora, a próxima pergunta: com todos esses smells, quais eu refatoro, e quais eu não refatoro? Pois isso é assunto para o próximo post. Nesse meio tempo, você pode ler mais sobre boas práticas de programação em meu livro de OO e SOLID para ninjas ou mesmo no curso online do Alura.

7 Comentários

  1. Wesley Martins 23/11/2015 at 16:53 #

    Interessante o artigo!

    Mas aqui na empresa por exemplo, utilizamos o Sonar.
    Que já está maduro, e bem configurado.

    Agora uma dúvida, o que essas ferramentas teriam a acrescentar a utilização do Sonar?

    Atenciosamente,
    Wesley Martins.

  2. Maurício Aniche 23/11/2015 at 16:56 #

    Oi Wesley,

    Nada! Elas são iguais!

    No entanto, se usar o Sonar, recomendo que vc configure bem a ferramenta, para que ela não te aponte 10 milhões de problemas de uma só vez… pq senão vc nunca vai tomar coragem de corrigi-los! 🙂

    Um abraço!

  3. Anayd 28/12/2015 at 06:17 #

    Heeee, eu vou usar o programa, mais vou detectar muitos erros kkkk.
    Obrigado, bom poste

  4. Kaju Rama 02/03/2016 at 14:23 #

    Muito bom, não conhecia essas ferramentas! Passarei a usar! Bom artigo!

  5. Helcio da Silva 12/01/2017 at 02:02 #

    Ótimo post Aniche.
    No curso do Alura sobre Maven é apresentado o plugin Maven PMD. Gostaria de saber se ele é a mesma ferramenta?

  6. Paulo Silveira 15/01/2017 at 22:24 #

    é sim!

  7. Leonardo Vilarinh0 16/03/2017 at 17:28 #

    Muito bom o post, e seu conhecimento no assunto!

    Está me ajudando muito. Um ano atrás, no meu primeiro contato com o CodeCity eu pensei: “porra, preciso saber como fazer isso”, mas com o tempo e sem muito estudo pensei que era algo extremamente complicado e difícil. Mas lendo seu livro de SOLID e TDD eu vi você citar algumas vezes as métricas, e pesquisei um pouco mais, acabei assistindo diversas palestras sua sobre o assunto, o que deixou isso tudo bem mais claro para mim, e aplicar no meu mundo (PHP e VueJS) é extremamente fácil.

    Me fez retomar o assunto que tinha achado impossível a um ano atrás, e que pra mim é algo primordial em um código. Será o assunto do meu TCC com certeza!

Deixe uma resposta