O que significa a 'complexidade ciclomática' do meu código?

37

Eu sou novo na análise estática de código. Meu aplicativo tem uma complexidade Cyclomatic de 17.754. O aplicativo em si é apenas 37.672 linhas de código. É válido dizer que a complexidade é alta com base nas linhas de código? O que exatamente a complexidade ciclomática está dizendo para mim?

    
por AngryBird 17.08.2011 / 20:37
fonte

4 respostas

40

What exactly is the Cyclomatic complexity saying to me?

Complexidade ciclomática não é uma medida de linhas de código, mas o número de caminhos independentes através de um módulo. Sua complexidade ciclomática de 17,754 significa que seu aplicativo tem 17,754 caminhos únicos através dele. Isso tem algumas implicações, geralmente em termos de como é difícil entender e testar seu aplicativo. Por exemplo, a complexidade ciclomática é o número de casos de teste necessários para atingir 100% de cobertura de filiais, assumindo testes bem escritos.

Um bom ponto de partida pode ser o artigo da Wikipédia sobre complexidade ciclomática . Ele tem alguns snippits de pseudocódigo e alguns gráficos que mostram o que é a complexidade ciclomática. Se você quiser saber mais, você também pode ler o artigo de McCabe, onde ele definiu a complexidade ciclomática .

My application has a Cyclomatic complexity of 17,754 lines of code. The application itself is only 37,672 lines of code. Is it valid to say that the complexity is high based of the lines of code?

Nada disso. Um aplicativo com poucas linhas de código e um alto número de condicionais aninhados em loops poderia ter uma complexidade ciclomática extremamente alta. Por outro lado, uma aplicação com poucas condições pode ter uma baixa complexidade ciclomática. Isso é um grande simplificador, mas eu acho que isso faz a ideia passar.

Sem saber mais sobre o que seu aplicativo faz, pode ser normal ter uma complexidade ciclomática mais alta. Eu sugeriria medir a complexidade ciclomática em um nível de classe ou método, no entanto, em vez de apenas um nível de aplicativo. Isso é um pouco mais gerenciável, conceitualmente, eu acho - é mais fácil visualizar ou conceituar os caminhos através de um método do que os caminhos através de um grande aplicativo.

    
por 17.08.2011 / 20:50
fonte
33

Complexidade ciclomática é uma maneira de determinar se seu código precisa ser refatorado. O código é analisado e um número de complexidade é determinado. Complexidade é determinada por ramificação (se instruções, etc.) Complexidade também pode levar em conta aninhamento de loops, etc. e outros fatores, dependendo do algoritmo usado.

O número é útil no nível do método. Em níveis mais altos, é apenas um número.

Um número de 17.754 indica complexidade no nível do projeto (código total), o que não tem muito significado.

O detalhamento em nível de classe e método determinará áreas do código que precisam ser refatoradas em métodos menores ou redesenhados para eliminar a complexidade.

Considere uma instrução CASE com 50 casos em um método. Talvez cada estado tenha uma lógica de negócios diferente. Isso gerará uma complexidade ciclomática de 50. Existem 50 pontos de decisão. A instrução CASE pode precisar ser reprojetada usando um padrão de fábrica para se livrar da lógica de ramificação. Às vezes, você pode refatorar (dividir o método em partes menores) e, em alguns casos, apenas um novo design reduzirá a complexidade.

Em geral, para complexidade no nível do método:

  • < 10 Fácil de manter
  • 11-20 Difícil de manter
  • 21+ Candidatos para refatoração / reformulação

Considere também que complexidades mais altas tornam o código mais difícil para o teste unitário.

A maior complexidade que vi em um único método foi 560. Foram cerca de 2000 linhas de instruções if em um método. Basicamente insustentável, não testável, cheio de bugs potenciais. Imagine todos os casos de teste de unidade necessários para essa lógica de ramificação! Não é bom.

Tente manter todos os métodos abaixo de 20 e perceba que há um custo para refatorar qualquer método para torná-lo menos complexo.

    
por 17.08.2011 / 21:27
fonte
1

É o número de caminhos distintos em seu aplicativo. Confira este artigo da IBM sobre CC .

Parece alto, mas no seu caso é a adição do CC de todos os seus métodos de todas as suas classes e métodos. Meus exemplos são muito esticados, pois eu não sei como seu código é estruturado, mas você pode também ter um método monstruoso com 37672 linhas de código ou métodos 3767 com cerca de 10 linhas de código. O que quero dizer é que, no nível do aplicativo, esse indicador não significa muito, mas no nível do método ele pode ajudá-lo a otimizar / reescrever seu código em métodos menores para que eles fiquem menos propensos a erros.

O que eu pessoalmente li muitas vezes é que métodos com um CC maior que 10 têm maiores riscos de defeitos.

Eu uso o Sonar para testar a qualidade do código dos meus aplicativos e, por padrão, acho que isso gera um aviso se você tiver métodos com +10 CC Ainda assim, isso pode significar nada. Um exemplo concreto: se você usar o Eclipse para gerar um método equals com base nas propriedades do seu bean, o CC irá rapidamente ultrapassar o telhado ...

    
por 17.08.2011 / 20:53
fonte
-1

Ele depende de qual ferramenta você usou. Algumas das ferramentas de código aberto por aí tomam classe como um módulo ou outro nível de estrutura como um módulo. Portanto, quanto maior o projeto, maior a Complexidade Ciclomática que ele tende a obter. No entanto, para meu entendimento pessoal, ele deve estar em uma base de função. Desde o maior um projeto recebe, as funções que atende a ter.

Eu recomendo que você use a ferramenta chamada Lizard e você pode encontrar o código do recurso e baixar o arquivo zip no github. Ele também tem uma versão online, se não houver muita informação confidencial em seu código.

O CCN significativo com o qual você deve se preocupar está em uma base de função diferente de qualquer outra. Além disso, manter a CCN de cada função 15 seria o intervalo ideal.

    
por 28.07.2016 / 19:20
fonte