DevSecOps

3 abr, 2013

Qualidade no desenvolvimento de software com Visual Studio 2012 – Parte 01

Publicidade

Quando aprendemos uma linguagem de programação, seja ela qual for, nossa primeira preocupação é sobre a sintaxe das estruturas do código, comandos e palavras reservadas, e uma série de coisas mais elementares para fazer desde um “Hello World” até sistemas com pouca complexidade.

Depois, começamos a aprender técnicas mais avançadas de desenvolvimento, e até mesmo itens que ainda não haviam feito parte do nosso vocabulário passam a vigorar, como Desempenho e Segurança. Então vamos aos tornando mais especialistas e, com o passar dos anos, podemos nos considerar desenvolvedores mais experientes.

Mas uma coisa não é ensinada nas faculdades, nem nos cursos de programação: Qualidade.

Qualidade no Desenvolvimento de Software não é um assunto que pode ser relevado a segundo plano: a qualidade deveria ser uma prática ensinada juntamente com a linguagem de programação em seus primórdios, incitando o programador a continuamente revisar e reavaliar sua abordagem para evitar problemas e defeitos que, futuramente, podem gerar catástrofes financeiras e materiais, visto que sistemas vitais para diversos setores da atividade humana dependem do controle de softwares de missão crítica.

Felizmente, existem ferramentas no mercado que auxiliam muito o trabalho do desenvolvedor que se preocupa com a qualidade do seu trabalho. Vou abordar aqui a que considero a melhor ferramenta disponível no mercado para realizar análise e levantar métricas de código: Microsoft Visual Studio 2012.

Conhecendo as ferramentas de Métricas de Código

Quando eu entendi as funcionalidades do Visual Studio 2012 para a realização de análise de código, a primeira coisa que me impressionou foi a facilidade para levantar as métricas do código de uma solução. Para realizar esta análise, basta clicar com o botão direito na Solução ou em algum Projeto da solução e escolher a opção Calculate Code Metrics, conforme mostra a figura 1.

01
Figura 1 – Opção do menu de contexto para Métricas de Código
Figura 2 - Janela com o resultado da análise das métricas de código
Figura 2 – Janela com o resultado da análise das métricas de código

Ao realizar esta ação, a janela Code Metrics Results irá trazer os resultados da análise de métricas do código da solução ou do projeto selecionado, conforme a figura 2.

Vemos que esta janela nos traz seis colunas. A primeira é chamada Hierarchy e traz a estrutura do projeto por classes em um Drop-Down, ou seja, ao abrirmos cada item é exibido seu namespace e as classes que fazem parte desta estrutura. As outras colunas são Maintainability Index, Cyclomatic Complexity, Depth of Inheritance, Class Coupling e Lines of Code. Vamos entender cada um destes indicadores e seus valores.

Maintainability Index (Índice de Manutenibilidade)

O Índice de Manutenibilidade é um valor entre 0 e 100 que representa a facilidade relativa na manutenção do código. Valores próximos a 100 indicam uma manutenção de código mais simples, enquanto valores próximos a zero indicam o terror computacional. Para classificar melhor, temos a seguinte escala:

  •   Entre 20 e 100, manutenção simples
  •   Entre 10 e 19, manutenção moderada
  •   Entre 0 e 9, manutenção difícil e complicada

Os símbolos exibidos na lista acima são a representação gráfica desta classificação, e são exibidos na coluna Maintainability Index para facilitar a análise.

Cyclomatic Complexity (Complexidade Ciclomática)

A Complexidade Ciclomática é um valor absoluto que mostra a quantidade de desvios na ordem de execução dos métodos de uma ou mais classes. Entenda por “desvio” uma estrutura de decisão ou de repetição (if- else, while, do ou switch/selec t) no código; essas estruturas fazem com que a execução do programa sofra um desvio na execução normal e seja redirecionado a outro ponto do código. Ou seja: quanto maior a complexidade ciclomática, mais condições de teste terão que ser desenvolvidas para cobrir todas as partes do código. Então, a complexidade ciclomática é diretamente proporcional à quantidade de casos de teste: quanto maior, mais casos de teste terão que ser escritos e mais testes deverão ser realizados para garantir a qualidade do produto.

Valores de referência para Complexidade Ciclomática

  • 1-10 = Risco baixo
  • 11-20 = Risco moderado
  • 21-50 = Risco Alto
  • Maior que 50 = Programa extremamente complexo e altamente instável

Complexidade Ciclomática e Linhas de Código

Não há um consenso a respeito do número ideal de desvios versus linhas de código, mas podemos fazer aproximações bem satisfatórias. Quando lidamos com complexidade ciclomática, podemos concluir que a tendência é que a mesma aumente conforme cresça a quantidade de linhas de código do projeto. Então, um projeto com milhares de linhas de código e alta complexidade ciclomática é, certamente, um alto risco para a qualidade do produto final. Se estamos falando de um projeto com poucas linhas de código e alta complexidade ciclomática, estamos falando de um projeto que beira o caos, e que merece ser revisto para garantir a qualidade do produto. Já um projeto com muitas linhas de código e baixa complexidade ciclomática é um projeto com menor chance de problemas com a qualidade, e um projeto com poucas linhas de código e baixa complexidade ciclomática certamente não será causa de grandes problemas para a qualidade.

Depth of Inheritance (Profundidade de Herança)

A Profundidade de Herança mede a quantidade de classes usadas em uma árvore de heranças para a construção de uma classe. Quanto maior a sequência de herança de uma classe, maior sua profundidade de herança.

Por exemplo: digamos que temos uma classe que herda outra, e que essa outra herda uma outra, e assim sucessivamente.

Captura de tela inteira 03042013 095856.bmp

  • Quanto maior a profundidade da herança, mais as instâncias da classe utilizam recursos do sistema.
  • Quanto menor a profundidade da herança, menos é utilizado o reuso de código, aumentando a possibilidade de falhas.

Portanto, deve haver equilíbrio entre a utilização de herança com a consequente reutilização de código e a busca frenética pela economia de recursos sistêmicos pela abolição da herança. Esta última abordagem pode comprometer a inteligibilidade e a manutenção da aplicação, enquanto que a primeira pode criar objetos massivos na memória sem necessidade. Parcimônia é a palavra!

Class Coupling (Acoplamento de Classes)

O Acoplamento de Classes mede a quantidade de chamadas que são feitas à sua classe por outras classes no seu código. Por exemplo: se eu crio uma classe chamada Pessoa e crio outra classe que cria uma instância de Pessoa, nossa análise de código irá retornar um Class Coupling = 1 para a classe pessoa, pois foi realizada uma chamada para esta classe através de outra classe, indicando que houve uma “amarração” (coupling) entre as duas classes.

Novamente, números altos indicam muito reuso de código, o que melhora a qualidade do software. Porém, em caso de manutenção na classe, há uma maior preocupação com o efeito de quaisquer alterações em classes altamente acopladas.

O número de acoplamentos tido como aceitável é por volta de 9. Um número menor indica que pouco código está sendo reutilizado; um número maior pode indicar maior complexidade em casos de manutenção e alterações.

Lines of Code (Linhas de Código)

Este é provavelmente o mais óbvio de todos os indicadores do Visual Studio 2012. As Linhas de Código mostram a quantidade de linhas efetivamente funcionais dentro do código. Este número geralmente é utilizado para se medir o esforço de desenvolvimento de um software, bem como em cálculos e referências para outras métricas (como Defeitos X Linhas de Código, Índice de Manutenibilidade, etc).

***

Na parte 2 deste artigo, iremos visualizar as ferramentas para análise de código integradas ao Build no Visual Studio 2012, incluindo regras de padronização de nomenclatura de elementos do código e desenho da solução.

Até breve!