Pergunta

Um termo que eu vejo de vez em quando é "Cyclomatic Complexidade". Aqui no SO eu vi algumas perguntas sobre "como calcular o CC de Língua X" ou "Como eu faço Y com a quantidade mínima de CC", mas eu não estou certo que eu realmente entender o que é.

Na NDepend site , vi uma explicação que basicamente diz "O número de decisões em um método. Cada caso, para, && etc. acrescenta +1 ao CC "score"). é que realmente é? Se sim, por que isso é ruim? Eu posso ver que um pode querer manter o número de caso -statements bastante baixo para manter o código fácil de entender, mas isto é realmente tudo para ele?

Ou há algum conceito mais profundo para ele?

Foi útil?

Solução

Eu não estou ciente de um conceito mais profundo. Penso que é geralmente considerada no contexto de um índice de manutenção. Os mais ramos existem dentro de um método particular, o mais difícil é manter um modelo mental de operação desse método (em geral).

Métodos com maior complexidade ciclomática também são mais difíceis de obter cobertura de código completo sobre em testes de unidade. (Obrigado Mark W !)

Isso traz todos os outros aspectos da manutenção, é claro. Probabilidade de erros / regressões / assim por diante. O conceito básico é bem simples, no entanto.

Outras dicas

medidas complexidade ciclomática o número de vezes que você deve executar um bloco de código com parâmetros diferentes, a fim de executar cada caminho através desse bloco. Uma contagem mais elevada é ruim, pois aumenta as chances de erros lógicos correria na sua estratégia de teste.

Cyclocmatic complexity = Number of decision points + 1

Os pontos de decisão pode ser suas declarações condicionais, como if, if ... else, switch, para loop, loop while etc.

O quadro que se segue descreve o tipo de aplicação.

  • Cyclomatic Complexidade reside 1 - 10 ? Para ser considerado normal applicatinon

  • Cyclomatic complexidade está 11 - 20 ? aplicação Moderado

  • Cyclomatic Complexidade reside 21-50 ? aplicação Risky

  • mentiras Cyclomatic Complexidade mais de 50 ? aplicação instável

Wikipedia pode ser seu amigo em um presente: Definição de cyclomatic complexidade

Basicamente, você tem que imaginar o seu programa como um gráfico de controle de fluxo e depois

A complexidade é (...) definida como:

M = E − N + 2P

onde

  • M = complexidade ciclomática,
  • E = o número de bordas do gráfico
  • N = o número de nós do grafo
  • P = o número de componentes ligados

CC é um conceito que tenta capturar o quão complexo o seu programa é e como é difícil para testá-lo em um único número inteiro.

Sim, isso é realmente dele. Quanto mais caminhos de execução o seu código pode tomar, quanto mais as coisas que devem ser testados, e maior probabilidade de erro.

Outro ponto interessante que eu ouvi:

Os lugares em seu código com os maiores recuos deve ter o maior CC. Estes são geralmente as áreas mais importantes para garantir a cobertura de testar, porque espera-se que eles vão ser mais difíceis de ler / manter. Como outras respostas notar, estes também são as regiões mais difíceis de código para garantir a cobertura.

Cyclomatic Complexidade realmente é apenas um chavão assustador. Na verdade, é uma medida da complexidade do código usado no desenvolvimento de software para apontar partes mais complexas de código (mais propensos a ser buggy, e, portanto, tem que ser muito cuidadosa e exaustivamente testado). Você pode calcular-lo usando a fórmula E-N + 2P, mas gostaria de sugerir que você esta calculadas automaticamente por um plugin. Tenho ouvido falar de uma regra de ouro que você deve se esforçar para manter o CC abaixo de 5 para manter a boa legibilidade e manutenção do seu código.

Tenho apenas recentemente experimentou com a Eclipse Metrics Plugin em meus projetos Java, e tem um muito bom e conciso arquivo de ajuda que irá integrar, claro, com sua ajuda regulares Eclipse e você pode ler mais algumas definições de várias medidas de complexidade e dicas e truques para melhorar o seu código.

É isso aí, a idéia é que um método que tem uma baixa CC tem menos garfos, looping etc que todos fazem um método mais complexo. Imagine que rever 500.000 linhas de código, com um analisador e vendo um par de métodos que têm oder de magnitude maior CC. Isso permite que você se concentrar em refatoração esses métodos para uma melhor compreensão (Também é comum que um alto CC tem uma alta taxa de erro)

Cada ponto de decisão em uma rotina (loop, switch, se, etc ...) essencialmente se resume a uma declaração se equivalente. Para cada if você tem 2 codepaths que podem ser tomadas. Assim, com o 1º ramo há 2 caminhos de código, com o segundo, há 4 caminhos possíveis, com a 3ª existem 8 e assim por diante. Há pelo menos 2 caminhos de código N ** em que N é o número de ramificações.

Isto torna mais difícil de entender o comportamento do código e testá-lo quando N crescer além de algum pequeno número.

As respostas fornecidas até agora não mencionam a correlação de qualidade de software a complexidade ciclomática. A pesquisa mostrou que ter uma métrica complexidade ciclomática inferior deve ajudar a desenvolver software que é de qualidade superior. Ele pode ajudar com atributos de legibilidade, facilidade de manutenção e portabilidade de qualidade de software. Em geral um devem tentar obter uma complexidade cyclomatic métrica de entre 5-10.

Uma das razões para a utilização de métricas como a complexidade ciclomática é que, em geral, um ser humano só pode manter o controle de cerca de 7 peças (mais ou menos 2) de informação simultaneamente em seu cérebro. Portanto, se o seu software é excessivamente complexo, com vários caminhos de decisão, é improvável que você será capaz de visualizar como o seu software irá se comportar (ou seja, ele vai ter um alto métrica complexidade ciclomática). Este seria provavelmente levar ao desenvolvimento de software montado errônea ou bug. Mais informações sobre este podem ser encontrados aqui e também em Wikipedia .

complexidade Cyclomatic é calculada através do gráfico de fluxo de controle. O Número de medida quantitativa de caminhos linearmente independentes através de código fonte de um programa é chamado como Cyclomatic Complexidade (if / if else / for / while)

Cyclomatric complexidade é basicamente uma métrica para descobrir áreas de código que precisa de mais attension para a manutenção. Seria basicamente uma entrada para o refactoring. Ele definitivamente dá uma indicação de melhoria das terras código em termos de evitar laço profundo aninhada, condições etc.

É mais ou menos isso. No entanto, cada sucursal de um "caso" ou declaração "switch" tende a contar como 1. Com efeito, isso significa CC ódios declarações de caso, e qualquer código que os obriga (processadores de comando, máquinas de estado, etc).

Considere a fluxo de controle gráfico de sua função, com uma vantagem adicional em execução a partir da saída para a entrada. A complexidade ciclomática é o número máximo de cortes que podemos fazer sem separar o gráfico em duas partes.

Por exemplo:

function F:
    if condition1:
       ...
    else:
       ...
    if condition2:
       ...
    else:
       ...

Flow Control Graph

Flow Control Graph

Você pode provavelmente intuitivamente ver porque o gráfico vinculado tem uma complexidade ciclomática de 3.

Cyclomatric complexidade é uma medida de quão complexo unidade de uma das medidas is.It software o número de caminhos diferentes de um programa possam decorrer com construções lógicas condicionais (Se, ao mesmo tempo, para, interruptor & casos etc ....). Se você quiser saber mais sobre como calcular isso aqui é um vídeo do youtube maravilhoso você pode assistir https : //www.youtube.com/watch? v = PlCGomvu-NM

É importante na concepção de casos de teste, porque revela os diferentes caminhos ou cenários um programa pode tomar. "Para ter boa capacidade de teste e manutenção, McCabe recomenda que nenhum módulo de programa deve exceder uma complexidade ciclomática de 10" (Marsic, 2012, p. 232).

Referência: Marsic., I. (2012, setembro). Engenharia de Software . Universidade Rutgers. Retirado de www.ece.rutgers.edu/~marsic/books/SE/book-SE_marsic.pdf

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top