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:
Post a Comment