terça-feira, 9 de agosto de 2011

O princípio KISS e a Complexidade Ciclomática


Keep It Simple, Stupid!

Em outras palavras, se você quer um código de qualidade e com poucos bugs, mantenha-o simples. Isso é meio óbvio, mas a disciplina de qualidade de software (e por que não dizer toda a Engenharia de Software?) é, basicamente, a explicação do óbvio. O problema é que é um óbvio que poucos seguem.
Existem muitas formas de deixar o seu código complexo demais para ser entendido. Seja com funções com muitas linhas, poucos comentários, classes com muito acoplamento, variáveis com nomes que não fazem sentido, etc.
Neste post iremos tratar sobre uma métrica muito utilizada por grandes empresas, porém que muitas pessoas desconhecem: a complexidade ciclomática (ou Complexidade de McCabe).

Basicamente, a complexidade ciclomática é calculada para uma função de acordo com a quantidade de caminhos diferentes possíveis dentro dela.

Por exemplo, a seguinte função:

void func( int x )
{
    if ( x > 0 )
    {
        printf(“x eh maior que zero” );
    }
    printf(“tchau!”);
}

Possui complexidade ciclomática 2, pois só há dois comportamentos possíveis dela: se x for maior que zero e se x for igual ou menor. Parece simples, mas começa a complicar quando você loops, switch/cases, etc.
Não vou entrar em detalhes aqui de como se calcular esta complexidade. Existem muitas ferramentas (frees inclusive) que fazem este cálculo. A minha favorita é a CCCC (http://sourceforge.net/projects/cccc/), que funciona tanto para códigos escritos em C quanto em C++.
Ok, e no que isso vai mudar a minha vida?”
A SEI (Software Engineering Institute) apresenta a seguinte tabela, relacionando a complexidade ciclomática com o risco da função:


Complexidade Ciclomática
Risco
1 a 10
Função simples, fácil de testar, de baixo risco.
11 a 20
Complexidade e risco moderados.
21 a 50
Função complexa, de alto risco.
> 50
Risco muito alto, impossível de testar.


Existe também uma outra tabela que mostra a probabilidade de se inserir um bug no código ao se modificar uma função, de acordo com a sua complexidade:

Complexidade da Função
Chance de inserir bug ao modificá-la
1 a 10
5,00%
20 a 30
20,00%
> 50
> 40%


Portanto, da próxima vez que escrever um código, procure manter suas funções com um risco no máximo moderado.

Quer um exemplo? Segue a análise de complexidade ciclomática realizada em cima do kernel do linux, versão 2.6.23:

Número de Funções: 161 mil
Média da complexidade ciclomática: 5
Total de funções com complexidade menor ou igual a 10: 144 mil
Total de funções com complexidade entre 11 e 20: 12 mil
Total de funções com complexidade entre 21 e 50: 4800
Total de funções com complexidade maior que 50: 722.

Sim, nem o Linus Torvalds consegue fugir das funções de risco muito alto. Porém note que apenas 3% das funções do código possui complexidade maior que 10. Assim fica fácil saber onde é mais provável de encontrar os bugs neste código, não é? :)


Nenhum comentário:

Postar um comentário