Ponto V!

Home Arquitetura Programação O princípio KISS e a Complexidade Ciclomática
Renan Augusto Guerra Greinert
O princípio KISS e a Complexidade CiclomáticaImprimir
Escrito por Renan Augusto Guerra Greinert

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 se tem loops, switch/cases, etc.

Não vou entrar em detalhes aqui de como se calcular esta complexidade. Existem muitas ferramentas (livres inclusive) que fazem este cálculo. A minha favorita é a 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 e cia conseguem 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 é? :)


Comentários (8)
  • Joao Alcantara  - Dúvida
    avatar

    Tem como vc mostrar como se compila e usa esse cccc?

    Obrigado.

  • Renan Augusto Guerra Greinert  - CCCC
    avatar

    Fala rapaz,
    Você consegue compilar ele se tiver o visual studio. Aí é só rodar os scripts que vem nele.
    Se quiser poupar esforço baixe a versão já compilada aqui:

    http://www.softpedia.com/progDownload/CCCC-C-and-C-Code-Counter-Dow nload-139777.html

    Para executar, é só abrir ele. Vai abrir um terminal verde, estilo dos. Aí é só ir pra pasta dos arquivos que você quer analisar e dar um

    cccc *

    ou

    cccc arq.cpp

    ele vai gerar uma pasta com arquivos HTML. Eles contém a informação da complexidade ciclomática, número de linhas de código por função, acoplamento das classes, etc.

    Qualquer dúvida tamo ae!

  • Renan Augusto Guerra Greinert
    avatar

    Não sei pq, mas o post do link tá indo com um espaço errado ali.
    Remova o espaço que tem em "Dow nload" na URL.

  • Joao Alcantara
    avatar

    Obrigado

    Eu queria mesmo aprender a compilar mas ele vem só até o VS 2003, eu só tenho o 2010, nao funciona.

    Mas instalei o compilado, vou testar aqui nos códigos e tentar compreender.

    Até

  • Bruno Crivelari Sanches
    avatar

    Se ele tiver o projeto para o 2003, basta abrir no 2010 que ele vai converter e na maioria das vezes compila sem problemas.

    T+

  • Ytriosalimito  - Complexidade Ciclomática
    avatar

    Bem interesante nunca tinha nisso e que existia um software especifico para fazer esse calculo, ótimo artigo parabéns [;
    de agora em diante vou ficar ligado na complexidade ciclomática \o; :D

  • Marcos Vasconcelos
    avatar

    Procurando sobre o assunto para Java encontrei isso aqui:
    http://eclipse-metrics.sourceforge.net/

    Vou rodar nos meus códigos e ver como está.

  • Franklin Soares  - Congratulations
    avatar

    Great post! Very helpful!

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter