Intervalos de complexidade ciclomática [fechados]


27

Quais são as categorias de complexidade ciclomática? Por exemplo:

1-5: fácil manutenção
6-10: difícil
11-15: muito difícil
20+: aproximando-se impossível

Já faz anos que assumo que 10 é o limite. E qualquer coisa além disso é ruim. Estou analisando uma solução e estou tentando determinar a qualidade do código. Certamente a complexidade ciclomática não é a única medida, mas pode ajudar. Existem métodos com uma complexidade ciclomática de mais de 200. Eu sei que isso é terrível, mas estou curioso para saber sobre os intervalos mais baixos, como no meu exemplo acima.

Eu encontrei isso :

Os valores de referência mencionados acima de Carnegie Mellon definem quatro faixas aproximadas para valores de complexidade ciclomática:

  • métodos entre 1 e 10 são considerados simples e fáceis de entender
  • valores entre 10 e 20 indicam código mais complexo, que ainda pode ser compreensível; no entanto, o teste se torna mais difícil devido ao maior número de ramificações possíveis que o código pode levar
  • valores de 20 e acima são típicos de código com um número muito grande de caminhos de execução em potencial e só podem ser totalmente compreendidos e testados com grande dificuldade e esforço
  • métodos que vão ainda mais alto, por exemplo,> 50, certamente são insustentáveis

Ao executar métricas de código para uma solução, os resultados são verdes para qualquer coisa abaixo de 25. Não concordo com isso, mas esperava obter outras informações.

Existe uma lista de intervalos geralmente aceita para complexidade ciclomática?


2
Você encontrou dados do Software Engineering Institute, uma organização reconhecida como líder em engenharia de software. Não entendo qual é a sua pergunta - você encontrou uma lista de intervalos para complexidade ciclomática. O que mais você está procurando?
Thomas Owens

1
Eu já vi vários intervalos; esse foi apenas um exemplo. E o MS mostra "verde" para menores de 25 anos. Fiquei me perguntando se havia uma lista de intervalos aceita. Talvez eu tenha encontrado então.
Bob Horn

1
Concordo com @ThomasOwens, mas estou feliz que você fez esta pergunta. Eu o votei como uma pergunta e uma resposta.
Evorlor 13/03/2015

1
Na 2ª edição do Code Complete, de Steve McConnell, ele recomenda que uma complexidade ciclomática de 0 a 5 seja normalmente boa, mas você deve estar ciente se a complexidade começar a ficar na faixa de 6 a 10. Ele explica ainda que qualquer coisa acima de uma complexidade de 10 deve considerar fortemente refatorar seu código.
GibboK

Respostas:


19

Suponho que depende das capacidades da sua equipe de programação e, em grande parte, da sua sensibilidade como gerente.

Alguns programadores são fortes defensores do TDD e não escrevem nenhum código sem antes escrever um teste de unidade. Outros programadores são perfeitamente capazes de criar programas perfeitamente bons e sem erros, sem escrever um único teste de unidade. O nível de complexidade ciclomática que cada grupo pode tolerar quase certamente variará substancialmente.

É uma métrica subjetiva; avalie a configuração em sua solução Code Metrics e ajuste-a para um ponto ideal com o qual você se sinta confortável e que lhe dê resultados sensatos.


3
Acordado, além disso, depende de qual é a causa da complexidade. Uma declaração de switch grande que chama outras funções, como parte de uma máquina de estado ou algo semelhante, pode ter uma complexidade muito alta, apesar de possivelmente ser praticamente trivial de entender.
Whatsisname

1
As declarações de grandes comutadores não são tipicamente uma indicação de falta de princípios de POO, como polimorfismo? Máquinas de estado podem ser implementadas de maneiras elegantes, com OOP ou padrões de design. Não?
Bob Horn

3
Para alguns problemas, a 'elegância' é útil, para outros, apenas torna as coisas mais confusas. Não há bala de prata.
Whatsisname

1
-1 Para "Outros programadores são perfeitamente capazes de criar programas perfeitamente bons e sem erros, sem escrever um único teste de unidade". Você não pode conhecê-lo sem erros se não o tiver testado.
Sebastien

1
@ Sevastien: A ausência de testes de unidade não significa que não foi testado. E sim, se você é bom o suficiente, é absolutamente possível escrever código sem erros, sem testes ou um teste de fumaça rudimentar. É certo que essas pessoas são uma raça rara.
Robert Harvey

10

Não há categorias predefinidas e nenhuma categorização seria possível por vários motivos:

  1. Algumas técnicas de refatoração apenas movem a complexidade de um ponto para outro (não do seu código para a estrutura ou uma biblioteca externa bem testada, mas de um local para outro da base de código). Ajuda a reduzir a complexidade ciclomática e a convencer seu chefe (ou qualquer pessoa que adora apresentações com gráficos cada vez maiores) de que você gasta seu tempo criando algo excelente, mas o código permanece tão ruim quanto antes.

  2. Pelo contrário, às vezes, quando você refatora um projeto aplicando alguns padrões de design e programação, a complexidade ciclomática pode piorar, enquanto o código refatorado deve ficar claro: os desenvolvedores conhecem os padrões de programação (pelo menos, eles devem conhecê-los), portanto, simplifica o código para eles, mas a complexidade ciclomática não leva isso em consideração.

  3. Algumas outras técnicas que não são de refatoração não afetam a complexidade ciclomática, enquanto diminuem severamente a complexidade de um código para desenvolvedores. Exemplos: adicionando comentários ou documentação relevantes. "Modernizando" o código usando açúcar sintático.

  4. Existem simplesmente casos em que a complexidade ciclomática é irrelevante. Gosto do exemplo dado por whatsisname em seu comentário : algumas switchdeclarações grandes podem ser extremamente claras e reescrevê-las de uma maneira mais OOPy não seria muito útil (e complicaria a compreensão do código pelos iniciantes). Ao mesmo tempo, essas declarações são um desastre, em termos de complexidade ciclomática.

  5. Como Robert Harvey já disse acima , depende da própria equipe.

Na prática, eu vi código fonte que tinha boa complexidade ciclomática, mas que era terrível. Ao mesmo tempo, vi código com alta complexidade ciclomática, mas não sentia muita dor ao entendê-lo.

Só que não existe e não poderia haver nenhuma ferramenta que indicasse perfeitamente o quão bom ou ruim é um determinado pedaço de código ou como é fácil mantê-lo . Como você não pode programar um aplicativo que diga que uma determinada pintura é uma obra-prima e que outra deve ser jogada fora, porque não tem valor artístico.

Existem métricas que são quebradas por design (como LOC ou o número de comentários por arquivo) e existem métricas que podem fornecer algumas dicas brutas (como o número de bugs ou a complexidade ciclomática). Em todos os casos, essas são apenas dicas e devem ser usadas com cautela.


2
+1 Eu concordo com tudo o que foi dito. A complexidade ciclomática ou LOC são apenas métricas que são fornecidas a você pela análise de código estático. Os analisadores estáticos são ótimas ferramentas, mas eles não têm bom senso. Essas métricas precisam ser processadas por um cérebro humano, de preferência um pertencente a um programador experiente. Somente então você poderá saber se um determinado software é desnecessariamente complexo.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.