Sunday, September 12, 2010

Métricas – Complexidade Ciclomática

Esta é provávelmente a métrica complexa mais usada em engenharia de software e continua a ser uma tema recorrente de discussão. Ainda assim continua a ser um assunto obscuro para muitos programadores, coordenadores e gestores. A complexidade ciclomática foi definida por Thomas McCabe (em finais de 1976) e, de uma forma resumida, mede a complexidade estrutural de um processo. Traduzindo para o mundo da arquitectura de software a CC mede a complexidade estrutural de um método, de uma classe ou de qualquer unidade logica que possa ser encontrada num sistema de software.

Complexidade Ciclomática – CC

A CC define-se como o somatório de todas as decisões acrescido de 1. CC = Número de decisões + 1. Entenda-se por decisão todas operações condicionais:

Operação Efeito no CC
if +1
else if +1
else 0
select case +1 para cada caso
select default 0
for/foreach +1
do while +1
do 0
while +1
catch +1

Se analisarmos com atenção o seguinte exemplo de código face a estas regras:

public boolean metodo(int param1, int param2) {
    if (param1 > 0 && param2 > 0 && param1 < param2 )  {
        return true;
    }
    return false;
}
 
Verificamos que a complexidade das operações lógicas não é contabilizada, e no entanto, são um fator fundamental na complexidade do método. Assim surge uma variação à CC denominada de  Complexidade Ciclomática Extendida – CC2 ou ECC.

Complexidade Ciclomática Extendida – CC2

A CC2 não é mais que a extensão da CC por adição dos operadores booleanos.
CC2 = CC + Número de operadores booleanos

Interpretação

Existem mais variantes à CC mas a CC2 é a métrica mais usada e é sobre ela que a restante análise incide. A análise da CC2 é tão útil para o programador como para o coordenador ou gestor. É assumido que qualquer programador deve sempre procura melhorar: codificar melhor, de forma mais eficiente, de forma mais estruturada e procurando sempre produzir código de qualidade. O uso da CC2 é precisamente aferir a qualidade do código produzido. Um valor de CC2 reduzido é um indicador de código limpo, estruturado e testável. Por acréscimo, deverá ainda ser código solúvel, i.e., código cuja lógica será facilmente assimilada por um programador sem contexto. Esta caracteristica, embora frequentemente desprezada, tem um efeito directo sobre o projecto em curso, isto porque, as equipas são cada vez mais voláteis e a curva de aprendizagem de um novo elemento tem sempre bastante impacto na restante equipa e no projecto no seu todo. O código correspondente a um CC2 baixo é estrututura porque as competência de cada método estão bem definidas:
  • métodos pequenos que implementam pequenas peças do negócio
  • métodos pequenos/médios que orquestram os anteriores e implementam o negócio de forma mais macro
Uma vez que o CC2 é o somatório das operações condicionais e das operações booleanas é também um indicador do número mínimo de testes unitários necessários para testar toda a lógica do método e obter uma cobertura de 100%.
Ora um CC2 baixo significa que o método é completamente testável com poucos testes unitários, i.e., o esforço de criação de testes unitários pode ser calculado e quantificado. Devemos notar aqui que “o tempo dispendido para produzir os testes unitários” continua a ser a justificação mais frequente para a não criação dos mesmos. Agora que já percebemos a importância de analisarmos o CC2, convém apresentar os intervalos mais frequentes usados para avaliar o seu estado:

CC Tipo Risco
1-4 Simples Baixo
5-10 Estável e bem estruturado Baixo
11-20 Complexo Moderado
21-50 Muito complexo Alto
>50 Altamente complexo e não testável Muito Alto

Uma vez que o CC está intimamente relacionado com o custo de manutenção, é usual ser usada a seguinte tabela de “probabilidade de efeitos colaterais” quando é realizada uma correção:

CC Probabilidade de efeitos colaterais
1-10 5%
20-30 20%
>50 40%
aprox. 100 60%

Com o aumento da complexidade aumenta também a probabilidade de serem produzidos novos erros. Naturalmente que nem todos os métodos podem ter a CC a baixo do valor que foi determinado como razoavel, mas, nesses casos é fundamental que seja descrito o porquê de esse limite ter sido excedido.

Enjoy!

No comments: