Graças a uma pergunta na Code Review , entrei em um pequeno desacordo (que é essencialmente uma oportunidade de aprender algo) sobre o que exatamente é a Complexidade Ciclomática para o código abaixo.
public static void main(String[] args) {
try {
thro();
thro();
thro();
thro();
thro();
thro();
thro();
}
catch (NullPointerException e) {
}
}
private static Random random = new Random();
public static void thro() throws NullPointerException {
if (random.nextBoolean())
throw new NullPointerException();
System.out.println("No crash this time");
}
Ao escrever esse código no Eclipse e usar o plug - in de métricas do Eclipse , ele diz que a Complexidade Ciclomática McCabe para o método principal é 2 e para o thro
método que diz 2.
No entanto, alguém me diz que a complexidade de chamar thro
várias vezes é number of calls * method complexity
e, portanto, afirma que a complexidade do método principal é 7 * 2 = 14.
Estamos medindo coisas diferentes? Nós dois podemos estar corretos? Ou qual é a complexidade ciclomática real aqui?
metrics
cyclomatic-complexity
Simon Forsberg
fonte
fonte
Respostas:
Quando entendi isso corretamente, a complexidade ciclomática de
main
é 8 - esse é o número de caminhos linearmente independentes através do código. Você recebe uma exceção em uma das sete linhas, ou nenhuma, mas nunca mais que uma. Cada um desses possíveis "pontos de exceção" corresponde exatamente a um caminho diferente através do código.Acho que quando McCabe inventou essa métrica, ele não tinha linguagens de programação com o tratamento de exceções em mente.
fonte
main
método?Sendo 'o outro cara', responderei aqui e seja preciso sobre o que digo (o que não era particularmente preciso em outros formulários).
Usando o exemplo de código acima, calculo a complexidade ciclomática como 8 e tenho comentários no código para mostrar como calculo isso. Para descrever os caminhos, considerarei um loop bem-sucedido através de todas as
thro()
chamadas como o caminho do código 'principal' (ou 'CP = 1'):Portanto, conto 8 caminhos de código neste método principal, o que, para mim, é uma Complexidade Ciclomática de 8.
Em termos de Java, cada mecanismo para sair de uma função conta com sua complexidade; portanto, um método que possui um estado de sucesso e lança, por exemplo, possivelmente até três exceções, possui quatro caminhos de saída documentados.
A complexidade de um método que chama essa função é:
Penso que outras coisas a considerar é que, na minha opinião, a
catch
cláusula não contribui para a complexidade do método,catch
é simplesmente o alvo de umthrows
ramo e, portanto, um bloco de captura que é o alvo de váriasthrow
contagens 1 vez para cada umthrow
, e não apenas uma vez para tudo.fonte
catch (Throwable t) {...
então eu acho que não importa quantas exceções ele declara lançar.