FixInsight - Ferramenta para análise de código Delphi
Autor: Rafael Stange | Publicado: 2015-04-28T10:21:00-03:00

Lambda, lambda, lambda Delpheiros!!!



Quando falamos em análise de código qual a ferramenta que vem a sua cabeça?

Existem várias ferramentas disponíveis &nbsp;no mercado para análise de código fonte e para todos os tipos de linguagem, porém, temos uma falta delas para Delphi.





Vamos avaliar de forma simples e funcional uma ferramenta muito interessante para análise de código Delphi: FixInsight. Esta ferramenta é desenvolvida e mantida por &nbsp;RomanYankovsky, MVP Embarcadero(Obrigado, Roman, &nbsp;por ceder uma licença para uso), e pode ser encontrado na comunidade do G+&nbsp;ou no seu perfil&nbsp;RomanYankovsky G+.

O que é&nbsp;FixInsight?
FixInsight&nbsp;é uma ferramenta para validação de sintaxeé capturar de forma clara e simplista warnings que podem vir a ser problemas nos seus métodos além de analisar convenção de tipo conforme o usuário tenha configurado além de ter alguns itens configurados conforme o padrão "Delphi" de desenvolvimento.

Após a instalação,&nbsp;que pode ser feita aqui,&nbsp;a ferramenta pode ser acessada utilizando o menu Project &gt;&gt; Run FixInsight.


Tela de configuração.







Podemos ver nessa janela duas divisões distintas:&nbsp;



Conventions: Hoje temos um grande problema quando trabalhamos com diversos desenvolvedores pois cada um está adaptado a um tipo de escrita o que pode ser problemático para futuras manutenções e entendimento da equipe.
No meu ponto de vista, esse grupo de configuração é essencial e vem para diminuir essa disparidade entre os diversos perfis que encontramos em um mesmo código fonte.

Na minha opinião:

Ponto positivo: Podemos avaliar quase tudo o que está fora do padrão de desenvolvimento da empresa(métodos longos, muitas variáveis ou parâmetros, class fields, interfaces, Poiners , nome de classes e sentença with aninhada) impedindo até mesmo que o código seja submetido em um ambiente de versionamento caso esteja fora das regras estipuladas.&nbsp;

Ponto negativo: Gostaria de ver outros itens nessa lista além de poder configurar todos ou a maioria dos seus itens. Um exemplo é iniciar um class field com a letra "F". Se a minha empresa como padrão por exemplo "FD", já não será possível mapear de forma completa o código fonte. Alguns itens ainda podem vir a ser melhorados em uma versão futura, e novos serem incorporados.


Warnings: Nesse tópico encontraremos erros ou possíveis erros em nosso código fonte. Eu me surpreendi quando vi a ferramenta rodar em cima de uma aplicação de legado. Existem coisas que a gente está habituado a fazer que atrapalham no desempenho e manutenção do software. A missão dessa divisão é encontrá-los, e isso ela faz muito bem.

Exemplo de uso:

Criei um projeto vazio e acrescentei alguns procedimentos conforme código abaixo:


unit Unit3;

&nbsp; interface

uses
&nbsp; Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
&nbsp; Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type

&nbsp; TForm1 = class(TForm)
&nbsp; &nbsp; procedure FormCreate(Sender: TObject);
&nbsp; private
&nbsp; &nbsp; { Private declarations }
&nbsp; public
&nbsp; procedure Teste(p1, p2, p3, p4, p5, p6, p7: string);
&nbsp; function Get: string;
&nbsp; &nbsp; { Public declarations }
&nbsp; end;

var
&nbsp; Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
&nbsp; F: TForm;
begin
&nbsp; F := TForm.Create(Self);
&nbsp; F.Caption := 'Test';
&nbsp; F.Tile;
&nbsp; F.Scaled := True;
&nbsp; F.ShowModal;
&nbsp; FreeAndNil(F);
end;

function TForm1.Get: string;
var
&nbsp; p1, p2, p3, p4, p5: string;
begin
&nbsp; Result := p1 + p2 + p3 + p4 + p5;
end;

procedure TForm1.Teste(p1, p2, p3, p4, p5, p6, p7: string);
begin
// teste
end;

end.



Acesse o menu Project &gt;&gt; Run FixInsight. Clique no botão "Run".

O botão "Run" possui duas opções:
Analyze the entire project - Verifica as mensagens em todo o projeto.
Analyze current Unit only - Verifica as mensagens somente na unit ativa no momento.

Nota: Todos os resultados encontrados pela ferramenta são criados na lista de mensagens do Delphi, criando uma nova aba chamada FixInsight.

Resultado após rodar a ferramenta:




Entendendo o output:

C101 - A ferramenta estava configurada para ter no máximo 4 linhas de código e como estava com 6 linhas, a mensagem foi exibida.
C102 - Poderia ter no máximo 4 parâmetros em uma procedure e function.
C103 - Poderia ter no máximo 4 variáveis em uma procedure e function.
W519 - Método em branco. Mesmo tendo um comentário na procedure ele reconheceu como método em branco porque não tinha nenhuma linha compilável dentro da função.

Clique duplo em um dos itens e a IDE direciona para a linha referenciada na mensagem.

Linha de comando:

A ferramenta conta ainda com uma opção de linha de comando para processo de build ou integração contínua. Basta configurar alguns parâmetros para gerar um arquivo com todas as mensagens conforme a execução da ferramenta pela IDE. A diferença é que a saída vai ser em um arquivo.

Parâmetros para uso em linha de comando(CMD):
  --project=XXX.dpr (projeto a ser analisado)
  --defines=XXX;YYY;ZZZ (definições de compilação, Delphi)
  --output=XXX (resultado de saída em formato de arquivo)
  --settings=XXX.ficfg (sobrescreve as configurações do projeto)
  --xml (formatar o arquivo de saída como um arquivo .xml)



O parâmetro project é obrigatório, os demais são opcionais.
O parâmetro Defines, utiliza os mesmos parâmetros que o compilador do Delphi suporta, vide Docwiki.
Para usar a ferramenta por linha de comando basta utilzar a seguinte sintaxe:
 --project=c:\source\example.dpr



Ou ainda acessar o menu Iniciar &gt;&gt; FixInsight &gt;&gt;&nbsp;FixInsight Command Line. Informar os parâmetros e executar.







Considerações:
Em um modo geral, muito útil, fácil de usar e intuitiva.

Senti falta de alguns recursos. Gostaria de poder configurar mais opções da sessão Conventions como por exemplo a opção C107 Class field name should start with "F" que não pode ser alterada. Como a sessão é destinada a conversão de tipos, gostaria de colocar aqui a minha identidade para uso com o meu padrão de desenvolvimento.

Na sessão warnings gostaria de ver coisas como duplicidade de código ou itens de performance como duplicidade de Type Cast e uso do operador "as".

Não temos aqui todos os recursos do&nbsp;AQ Audits por exemplo, mas temos outras opções interessantes encontradas somente aqui.

Recomendado!!!

Bom pessoal, era isso por agora. Espero em um futuro próximo fazer um novo reviw com as novidades da ferramenta. Abraços e até a próxima.