O que é complexidade ciclomática? Medição da qualidade do código

Shutterstock / fran_kie

A complexidade ciclomática é uma métrica de código que você pode ver em muitos IDEs, como o Visual Studio. Embora não seja uma ciência exata, ela fornece uma ideia geral da complexidade de funções, classes e namespaces, o que pode ser útil ao procurar código para refatorar.

índice

  1. O que é complexidade ciclomática?
  2. A complexidade ciclomática é útil?
  3. Procurando um código incorreto

O que é complexidade ciclomática?

A complexidade ciclomática basicamente mede até onde seu código se ramifica. Sempre que há uma instrução if ou outro bloco de controle, como um loop, a complexidade ciclomática aumenta, à medida que o gráfico se torna cada vez mais como uma árvore.

Se você pensar em seu código como uma série de ações (funções, chamadas de métodos, atribuições de variáveis) vinculadas por meio de fluxo de controle, você obterá um gráfico abstrato que pode ser usado para entender melhor a complexidade. Para fluxos de controle comuns, como instruções if e loops for , os gráficos são assim:

A fórmula é simples; pegue o número de arestas no gráfico (as setas que conectam tudo) e subtraia o número de nós no gráfico (as próprias ações).

 Complexidade = Arestas -- Nós + 2

Por exemplo, esse código tem uma complexidade ciclomática de um, já que não há ramificações, e ele simplesmente chama WriteLine repetidamente. Como é um código perfeitamente linear, o número de nós cancelará o número de arestas, dando uma complexidade ciclomática de um.

 public void TestFunction() { Console. WriteLine("Teste"); Console. WriteLine("Teste"); Console. WriteLine("Teste"); Console. WriteLine("Teste"); Console. WriteLine("Teste"); }

Para código mais complicado com ramificações, a complexidade será maior. Esse código, que contém um arquivo de instrução switch , tem uma complexidade de 6, porque há muitos caminhos diferentes que o código pode seguir. Cada case na instrução switch adiciona complexidade, pois pode levar a diferentes saídas com diferentes entradas.

 public void TestFunction ( string arg ) { switch ( arg ) { case "um" : Console . WriteLine("Teste"); parar ; case "dois" : Console . WriteLine("Teste"); parar ; case "três" : Console . WriteLine("Teste"); parar ; case "quatro" : Console . WriteLine("Teste"); parar ; case "cinco" : Console . WriteLine("Teste"); parar ; } Consola. WriteLine("Teste"); }

A complexidade ciclomática só é calculada dentro do escopo da função. Se uma função chama outra função que possui alta complexidade ciclomática, ela é contada apenas como um único nó e não adiciona nada ao chamador, mesmo que tecnicamente adicione complexidade ao programa em um sentido geral.

A complexidade ciclomática é útil?

A complexidade ciclomática não é uma métrica perfeita. É uma métrica muito simples e examina as nuances do próprio código. Claro, você ainda pode ter um código terrível com baixa complexidade ou código decente com alta complexidade. Mas no geral, ainda é útil o suficiente para ter uma ideia geral de quão complexo é um programa.

Na maioria das vezes, a complexidade de 6 a 8 provavelmente é boa, desde que o próprio código seja bem formatado. Qualquer coisa entre 8-15 é questionável e qualquer coisa acima de 15 provavelmente não é boa. Qualquer coisa acima de 25 é quase certamente um problema, a menos que se prove o contrário.

Embora ter alta complexidade ciclomática em uma determinada função não seja o fim do mundo, pode ser indicativo de um problema maior. Funções muito complexas são mais difíceis de manter e propensas a mais erros, pois há mais coisas que podem dar errado. E funções mais complexas levam diretamente a testes de unidade mais complexos, o que pode dificultar a manutenção do código a longo prazo devido à dificuldade de teste.

O Visual Studio e outros IDEs calcularão as complexidades agregadas de classes e namespaces inteiros, o que pode ser útil para rastrear classes mais complexas. Você pode classificar por maior complexidade e obter mais informações sobre recursos individuais.

A revisão de código geralmente pode explicar a complexidade ciclomática, ao mesmo tempo em que sinaliza recursos problemáticos que podem exigir revisão manual. Isso pode torná-lo uma ferramenta muito útil para manter uma base de código limpa e organizada.

Procurando um código incorreto

Muitos IDEs, como o Visual Studio, terão ferramentas internas para calcular a complexidade ciclomática e outras métricas de código para toda a base de código.

Para fazer isso no Visual Studio, clique em Analisar > Calcular Métricas de Código > Por Solução.

O painel "Code Metrics" aparecerá mostrando uma análise detalhada da solução. Você pode classificar por complexidade em ordem decrescente para ver os namespaces mais problemáticos.

Aumentando a complexidade, o Visual Studio também apresenta um "Índice de manutenção" que atribui a um método uma pontuação de 0 a 100 mais facilmente sustentável, bem como "Acoplamento de classe", que lista o número de classes às quais ele está conectado. função. ou classe.

Aqui, o Visual Studio destacou um método my de 400 linhas que obteve impressionantes 72 na escala de complexidade e 14/100 no índice de manutenção (apresentado como um triângulo de aviso amarelo) e faz referência a 65 classes diferentes.

Poderia ser enviado diretamente para os cinco estágios de dor no resultado. "Mas esta é uma corrotina muito longa que tem muito trabalho a fazer!" Digo a mim mesmo, tentando negar que o código que escrevi é matematicamente ruim, a ponto de o Visual Studio lançar um aviso. Uma complexidade de 72 definitivamente deve ser limpa.

Nesse caso, a solução foi simples: a corrotina tem muitas tarefas a fazer, então eu divido essas tarefas em corrotinas menores e substituo o método main por chamadas de subrotina. O código geral não mudou, nem a complexidade geral da classe em si, mas agora a função principal não é uma monstruosidade de 400 linhas.

  • Os melhores teclados ergonômicos em 2021
  • 8 refrigerantes mais saudáveis ​​que refrigerantes

descubra mais conteúdo

Google Pixel Watch também tem detecção de queda, mas não até o próximo ano

As melhores xícaras de café aquecidas de 2022

Como automatizar seu iPhone com base na hora, atividade ou localização

"Isso deve ter sido antes do meu tempo"

Por que a NASA enviou Snoopy para a Lua? – Revisão Geek

O que é uma carga fantasma?

Deixe uma resposta Cancelar resposta

A Complexidade Ciclomática é uma métrica de software em engenharia de software que fornece uma medida quantitativa da complexidade lógica de um programa. É uma das métricas de software mais amplamente aceitas, pois foi projetada para ser independente da linguagem.

Como a complexidade ciclomática é calculada?

Como é calculada a complexidade ciclomática ?

  1. Subtraia as arestas menos os nós e adicione 2:
  2. Adicione 1 ao número de nós predicados (aqueles de onde saem duas setas)
  3. Contando o número de regiões (espaços “fechados entre nós e arestas”, o espaço “fora” de todos os nós e arestas também é levado em consideração.

O que é complexidade cognitiva?

A Complexidade Cognitiva é uma medida de quão difícil é entender intuitivamente um bloco de código. Ao contrário da Cyclomatic Complexity , que determina o quão difícil é testar o código. Para ficar um pouco mais claro, veremos um exemplo: Ambos os códigos têm uma complexidade ciclomática de 4.

O que é um nó predicado?

Nós predicados : quando um ou mais operadores lógicos aparecem em uma condição (AND, OR, XOR, …) um diferente é criado para cada uma das condições simples. Cada gerado dessa forma é chamado de nó predicado .

Ir arriba