CodeMetrics – Extraindo métricas de código C#

CodeMetrics – Extraindo métricas de código C# 1


Fala galera, beleza?!

Nesse artigo vou apresentar um projeto que desenvolvi, o CodeMetrics, ele é responsável por extrair métricas de código C# e apresentar um relatório em html com esses valores. Existe um serviço chamado CodeClimate, que tem algumas ideias que tentei aplicar no CodeMetrics.
Se você gosta mais de ver vídeos, no final do artigo tem o vídeo completo que substitui o artigo em forma escrita!

CodeMetrics

Como a maioria dos meus projetos OpenSource, ele está no GitHub e você pode acessar ele nessa url https://github.com/AlbertoMonteiro/CodeMetricsExtractor. A motivação para construção dessa ferramenta, foi quando conhecido o CodeClimate que é um serviço que avalia a saúde do seu projeto em relação ao código, e eu não encontrei nenhum serviço do tipo disponível para C#. No momento, eu não disponibilizo o executável do CodeMetrics, se você quiser usa-lo terá que baixar em sua máquina e compilar.

Obtendo CodeMetrics

git clone https://github.com/AlbertoMonteiro/CodeMetricsExtractor.git
cd CodeMetricsExtractor
git submodule init
git submodule update

Nó código acima, primeiramente faço o clone do projeto, nesse caso estou cloando via https, mas se você prefere via ssh, não tem problema. Logo após clonar, entro no diretório no qual o projeto foi clonado, e como eu uso um outro projeto chamado ArchiMetrics como submodulo, então é preciso iniciar o submodulo e depois baixar os fontes dele.
Como o projeto depende do ArchiMetrics que usa o Roslyn para extrair as metricas, ganhamos uma dependência das ferramentas de build do Visual Studio 2015, caso você não instale essa dependência é bem provavel que você veja esse erro quando estiver rodando o CodeMetrics:

Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

Então baixe e instale o Microsoft Build Tools 2015 RC.

Executando CodeMetrics

Antes de executar, é preciso que você entre na pasta que se encontra a solution do ArchiMetrics, para restaurar os pacotes nuget dele, do contrario, você vai experiementar erros de build quando abrir e compilar a solution do CodeMetrics. Feito isso agora podemos iniciar a extração das métricas, para fazer isso dentro do Visual Studio, vamos alterar uma configuração nas propriedades do projeto MetricsExtractor. Na tela de propriedades, selecione a categoria Debug e no campo Command line arguments coloque o valor:

-solution "CAMINHO DA SOLUTION QUE VOCÊ QUER EXTRAIR AS MÉTRICAS"

No meu caso, ficou assim

-solution "C:\Users\Alberto Monteiro\Documents\Visual Studio 2013\Projects\NhaNhaNha\NhaNhaNha.sln"

Agora pode executar e esperar que o browser abra e exiba o relatório das métricas. Além do parâmetro solution, também é possível passar o parametro ignoredProjects que recebe o nome dos projetos separado por ponto e virgula, segue um exemplo Projeto1;Projeto2.Core;Projeto3.

Métricas

Saúde do projeto

Saúde
Essa é a primeira parte do relatório, onde você pode ver as métricas

Manutenibilidade

Valor de 0 a 100, que é um compilado geral das outras métricas.

Métodos com alta Complexidade Ciclomática(CC)

{Quantidade de métodos com alta CC} / {Total de métodos no seu projetos} => {Valor percentual}
Nessa métrica, são considerados os métodos que tem a CC maior que 10.

Métodos grandes

{Quantidade de métodos grandes} / {Total de métodos no seu projetos} => {Valor percentual}
Nessa métrica, são considerados os métodos que tem mais que 30 linhas, desconsiderando os comentários.

Herança

Valor médio de quantos níveis de herança seu projeto tem.

Linhas de código

Total de linhas de código desconsiderando comentários.

Saúde das classes

Saúde das classes
Nessa parte, as classes são divididas em A a F, onde cada letra representa um intervalo do valor da métrica manutenibilidade

Rank Max Min
A 100 84
B 083 68
C 067 52
D 051 36
E 036 20
F 019 01

Métodos ruins

Métodos ruins
E a última parte, é a listagem do métodos que são grandes ou tem CC maior que 10.

O que ainda não tem

Varias coisas ainda faltam, mas as principais que vem a minha mente, são as seguintes:

  • Pode ignorar namespaces
  • Poder ignorar classes
  • Permitir alterar os valores
    • Total de linhas para considerar método grande
    • Total de CC para considerar método complexo
  • Gerar um arquivo com os valores das métricas, hoje somente o arquivo HTML é gerado

Vídeo


sobre Alberto Monteiro

Desenvolvedor no Grupo Fortes, cuja principal área de conhecimento são em tecnologias Microsoft, como Windows Forms / Services, WPF, ASP.NET(MVC/WEB API), Windows Phone, EF. Gosta de sopa de letrinhas(SOLID, DDD, TDD, BDD, IoC, SoC, UoW), possui aplicações de Windows Phone publicadas no marketplace, já contribuiu no jQuery UI. Atualmente trabalha com ASP.NET MVC / Web API, Windows Azure, Amazon AWS, jQuery/UI, Knockout, EF, Ninject, AutoMapper, Restfulie, SignalR, KendoUI.