Por que eu devo ler este artigo:Este artigo é útil para todos os desenvolvedores que primam pela melhoria de qualidade do código-fonte. Para isso, demonstrará a evolução de um código-fonte de má qualidade para um de melhor qualidade por meio de um método prático, que fará uso de conceitos e ferramentas para atingir este objetivo. Neste contexto, serão considerados problemas relacionados a estilo, más-práticas e bugs. Também será demonstrado o uso de ferramentas em dois níveis: na verificação da qualidade (por meio de plugins na IDE IntelliJ IDEA – com menção ao Eclipse) e na validação da qualidade (por meio da exibição de métricas de qualidade obtidas pela ferramenta SonarQube).

Hoje, entende-se que quanto mais cedo um problema é encontrado no software, mais barata é a sua correção (um problema encontrado em desenvolvimento será muito mais barato de corrigir do que se o mesmo for encontrado em produção). Da mesma forma, código-fonte bem escrito reduz drasticamente o tempo (e o custo) de manutenção, e o uso de boas práticas de orientação a objetos permite que o código seja flexível e suporte mudanças de forma mais tranquila, segura e natural.

Todos estes conceitos relacionados à qualidade são importantes para a vida das aplicações, mas a realidade de prazos cada vez mais curtos acaba fazendo com que, muitas vezes, a preocupação com a qualidade seja deixada de lado, de forma que detalhes importantes são ignorados, levando a aplicações mal construídas. O resultado é sempre o mesmo: alto custo de evoluções, demora em manutenções, alta taxa de bugs e insatisfação dos clientes.

Devido a isso, a qualidade ganha cada vez mais relevância, já existindo atualmente diversas práticas que podem ser utilizadas de forma a agregá-la ao desenvolvimento de software. E quando tais práticas são usadas corretamente não resultam necessariamente em impactos em prazo. Um bom exemplo é o par refatoração/testes automatizados, e paralela a este, existe a análise estática de código – tema deste artigo. A análise estática incorporada à IDE, assim como a prática de testes unitários, tornaram-se práticas tão naturais (pela sua praticidade e simplicidade) que passam a não ser mais dissociadas da própria escrita de código-fonte. Contudo, isto vale quando os conceitos estão bem entendidos, pois de outra forma, tais práticas podem surtir o efeito contrário, onerando a tarefa de desenvolvimento.

Além de explicitar o conceito de análise estática de código e apresentar ferramentas (de uso integrado às IDEs, para atuar de forma localizada nos arquivos, e de uso externo, mais geral, para cobrir todo o código-fonte do projeto de uma vez), este artigo irá demonstrar um método para aplicação da análise estática por meio de um estudo de caso hipotético, onde o código é verificado durante a construção e posteriormente validado por uma ferramenta específica (SonarQube), através de regras.

Análise estática de código

A análise estática de código é uma das práticas que verifica a qualidade do código-fonte. Esta verificação é realizada antes mesmo que haja execução do software (um conceito oposto ao dos testes unitários, que validam o software com base no resultado de sua execução – vide BOX 1).

BOX 1. Verificação x Validação (ou caixa branca x caixa preta)

Uma verificação considera “fazer certo alguma coisa”, ou seja, garantir que os passos para atingir um dado objetivo foram realizados corretamente; já a validação trata de “fazer a coisa certa”, ou seja, garantir que o objetivo seja atingido, independente da forma como os passos foram realizados. Verificação é eficiência; validação é eficácia. Também se entende que os testes de caixa branca (que consideram o código escrito) são aspectos de verificação, e os testes de caixa preta (que testam o output do software com base num dado input) são aspectos de validação. Considera-se, portanto, que a análise estática de código está relacionada à verificação, pois analisa como o código-fonte foi construído internamente.

A verificação é realizada com base num conjunto de regras pré-estabelecidas. O objetivo da análise é evidenciar problemas, para que possam ser corrigidos com o máximo de foco, resultando em maior eficiência no processo de melhoria de qualidade.

Além disso, assumir que a análise estática de código realiza verificação sem que o código-fonte seja executado não significa dizer que apenas arquivos texto (com extensão .java, .jsp, .js) são verificados. Cada ferramenta, dependendo de sua implementação, pode realizar a verificação em código-fonte ou bytecode. Embora algumas ferramentas sejam capazes de realizar a verificação estática em arquivos JSP e JavaScript, por exemplo, a análise aqui proposta foca-se especificamente em código-fonte Java (bem como EM bytecodes).

A análise estática pode ter sua verificação agrupada em três aspectos principais, a saber:

  • Verificação por estilo: Considera elementos como identação, espaços e tabs, convenção de nomes, número de parâmetros, alinhamento na vertical, formato e presença de comentários, dentre outros. São todos os aspectos que contribuem para tornar o código mais padronizado, organizado e legível. A ferramenta mais utilizada para verificação por estilo é o Checkstyle;
  • Verificação por boas práticas: Aplica uma gama de regras para verificar se práticas corretas estão sendo realizadas, como evitar duplicação de código, garantir o correto uso de encoding, implementação do método clone(), tamanho de métodos e classes, tamanho de parâmetros, uso do padrão Singleton, criação desnecessária de variáveis locais e muitas outras. O conjunto de regras é extenso e visa garantir que o código apresente as melhores práticas possíveis. A ferramenta de verificação mais utilizada para aplicar boas práticas é o PMD;
  • Verificação por bugs: Trata de encontrar erros no sistema. Isto é importante para antecipar a identificação de problemas no software (até antes mesmo de sua execução pelo cliente). A ferramenta mais utilizada para identificação de bugs é o Firebug.

A verificação das ferramentas PMD e Checkstyle é realizada sobre código-fonte não compilado (arquivo com extensão .java), mas a verificação com Firebug analisa bytecodes (arquivos compilados do Java, com extensão .class). Desta forma, para análises envolvendo Firebug, uma compilação prévia é necessária. Isso é tratado pelo seu respectivo plugin, de forma que se faz transparente ao desenvolvedor.

O que não é análise estática – testes e validação por contrato

Uma vez que é comum utilizar tanto a análise estática quanto a escrita de testes automatizados em termos de garantia e melhoria de qualidade em código-fonte, é importante frisar a diferença entre elas.

Testes automatizados são uma prática que trata da validação do código-fonte de produção através de sua execução. Isto funciona pela chamada do código de produção pelo código de teste, que faz o papel de cliente do código de produção. Os testes necessitam, portanto, execut ...

Quer ler esse conteúdo completo? Tenha acesso completo