Pergunta

Eu fui brincar com a medição da complexidade ciclomática de uma base de código grande.

A complexidade ciclomática é o número de caminhos linearmente independentes através de código fonte de um programa e existem muitas ferramentas gratuitas para seu idioma de escolha.

Os resultados são interessantes, mas não surpreendente. Ou seja, as peças que eu conheço para ser o mais peludo eram de fato o mais complexo (com uma classificação de> 50). Mas o que eu estou encontrando útil é que um número concreto "maldade" é atribuído a cada método como algo que pode apontar para quando decidir por onde começar a refatoração.

Você usa complexidade ciclomática? O que é a parte mais complexa de código que você encontrou?

Foi útil?

Solução

Nós refatorar sem piedade, e usar a complexidade ciclomática como uma das métricas que recebe código em nosso 'lista negra'. 1-6 não o fizermos bandeira de complexidade (embora possa se questionou por outras razões), 7-9 é questionável, e qualquer método superior a 10 é considerado ruim, a menos que se prove o contrário.

O pior que já vimos foi de 87 a partir de uma monstruosa if-else-se da cadeia em algum código legado que teve de assumir.

Outras dicas

Na verdade, a complexidade ciclomática pode ser colocada em uso além de apenas método limites de nível. Para começar, um grande método com elevada complexidade pode ser dividido em vários métodos pequenos com menor complexidade. Mas se ele realmente melhorou a base de código? Concedido, você pode ficar um pouco melhor legibilidade por todos esses nomes método. Mas a lógica condicional total não mudou. E a lógica condicional total pode muitas vezes ser reduzida por substituindo condicionais com polimorfismo .

Precisamos de uma métrica que não ficar verde por mera decomposição método. Eu chamo isso CC100 .

CC100 = 100 * (total complexidade cyclomatic de código base) / (Total de linhas de código)

É útil para mim da mesma forma que big-O é útil: Eu sei o que é, e pode usá-lo para obter um sentimento de intestino para saber se um método é bom ou ruim, mas eu não preciso de computação -lo para cada função que eu escrevi.

Eu acho métricas simples, como LOC, são pelo menos tão bom na maioria dos casos. Se uma função não caber em uma tela, ele quase não importa como é simples. Se uma função tem 20 parâmetros e faz 40 variáveis ??locais, não importa se a sua complexidade ciclomática é 1.

Nós recentemente começou a usá-lo. Usamos NDepend fazer alguma análise estática de código, e mede a complexidade ciclomática. Concordo, é uma forma decente para identificar métodos para refatoração.

Infelizmente, temos visto # 's acima de 200 para alguns métodos criados por nossos desenvolvedores offshore.

Até que haja uma ferramenta que pode trabalhar bem com modelos C ++ e técnicas de meta-programação, não é de grande ajuda na minha situação. De qualquer forma, basta lembrar que

"nem todas as coisas que a contagem pode ser medido, e não todas as coisas que podem ser contagem medido" Einstein

Então lembre-se de passar qualquer informação deste tipo através de filtragem humano também.

Você saberá complexidade quando você vê-lo. A principal coisa este tipo de ferramenta é útil para se sinalizar as partes do código que estavam escapando sua atenção.

Eu freqüentemente medir a complexidade ciclomática do meu código. Eu descobri isso me ajuda a identificar áreas de código que estão fazendo muito. Ter um ponto de ferramenta para fora os hot-spots no meu código é muito menos demorado do que ter que ler através de milhares de linhas de código tentando descobrir quais os métodos não estão seguindo o SRP.

No entanto, eu descobri que quando eu faço uma análise de complexidade ciclomática no código de outras pessoas geralmente leva a sentimentos de frustração, angústia e raiva geral quando eu encontrar o código com a complexidade ciclomática nos 100 de. O que obriga as pessoas a métodos de gravação que têm vários milhares de linhas de código em si?!

É ótimo para ajudar a identificar candidatos para refatoração, mas é importante para manter o seu julgamento ao redor. Eu apoiar faixas de kenj0418 para podar guias.

Há um Java métrica chamada CRAP4J que empiricamente combina complexidade ciclomática e cobertura de teste JUnit para chegar a um único métrica. Ele vem fazendo pesquisas para tentar melhorar sua fórmula empírica. Eu não tenho certeza quão disseminado é.

Eu não usei isso em um tempo, mas em um projeto anterior que realmente ajudou a identificar potenciais pontos de conflito no código alguma outra pessoa (não seria minha, é claro!)

Ao encontrar da área para check-out, i rapidamente encontrou problemas numerious (também lotes de GOTOS você acreditaria!) Com lógica e algum código WTF realmente estranho.

Cyclomatic complexidade é grande para mostrar áreas que provavelmente estão fazendo muito e, portanto, quebrando o único prinicpal responsibilty. Estes idealmente deve ser dividido em funções mulitple

Eu tenho medo que para a linguagem do projeto para o qual eu mais gostaria métricas como este, LPC , não há, de fato, muitas ferramentas gratuitas para produzi-lo disponível. Então, não, não tão útil para mim.

+1 para valores da lista hit das kenj0418.

O pior que eu vi foi um 275. Há dois outros mais de 200 que fomos capazes de refatorar para baixo para CCs muito menores; eles ainda eram altas, mas ficou-los empurrado ainda mais para trás na linha. Nós não tínhamos muita sorte com a besta 275 - foi (provavelmente ainda é) uma teia de se- e switch-declarações que era apenas uma maneira muito complexa. É apenas o valor real é como um passo-through quando decidem reconstruir o sistema.

As exceções a alta CC que eu estava confortável com eram fábricas; IMO, que é suposto ter um alto CC mas apenas se eles estão fazendo só a criação simples objeto e retornando.

Depois de compreensão o que significa, eu já começaram a usá-lo em uma base "julgamento". Até agora eu tê-lo encontrado para ser útil, porque geralmente alta CC anda de mãos dadas com a seta Anti-Pattern , o que torna o código mais difícil de ler e compreender. Eu não tenho um número fixo ainda, mas NDepend está alertando para tudo acima de 5, o que parece um bom começar a investigar métodos.

Sim, podemos usá-lo e eu achei que seria útil também. Nós temos uma grande base de código legado para domar e encontramos alaraming alta complexidade ciclomática. (387 em um método!). CC aponta diretamente para áreas que valem a pena refatorar. Usamos CCCC em código C ++.

Cyclomatic Complexidade é apenas um composant do que poderia ser chamado fabricado Complexidade. A volta enquanto, eu escrevi um artigo para resumir várias dimensões da complexidade do código: Combate fabricado Complexidade

Tooling é necessário para ser eficiente em lidar com a complexidade do código. A ferramenta NDepend para o código .NET vai deixar você analisar muitas dimensões da complexidade do código, incluindo métricas de código como: Cyclomatic Complexidade, Profundidade de assentamento, falta de coesão de Métodos, Cobertura de testes ...

incluindo a análise de dependências e incluindo uma linguagem ( Código Query Language ) dedicado a perguntar , o que é complexo no meu código, e regra de escrita?

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