Calculadora de complexidade ciclomática
A API de complexidade ciclomática calcula a métrica de McCabe a partir da estrutura de um grafo de fluxo de controle: você fornece o número de arestas, o número de nós e o número de componentes conexas, e ela retorna a complexidade ciclomática M = E − N + 2P, o número mínimo de caminhos linearmente independentes pelo código e um limite inferior dos casos de teste necessários para a cobertura completa de ramificações. Sem código-fonte para enviar, sem analisador para configurar: apenas três contagens do grafo que você já tem e um número determinístico de volta, calculado da mesma forma no seu navegador e na nossa edge.
Executar grátis
O que a complexidade ciclomática mede
A complexidade ciclomática, introduzida por Thomas McCabe em 1976, conta o número de caminhos linearmente independentes no grafo de fluxo de controle de um programa. Cada ponto de decisão — um if, um laço while, um ramo case, uma expressão condicional — adiciona um caminho, por isso a métrica acompanha o quanto um trecho de código é difícil de testar e de entender. Um valor 1 significa código linear, sem nenhum desvio. Um valor 10 é o limiar amplamente citado acima do qual um módulo começa a pedir divisão. O número é uma propriedade do grafo, não da linguagem: uma vez desenhado o grafo de fluxo de controle de uma função, sua complexidade está fixada, e esta calculadora de complexidade ciclomática a avalia diretamente a partir das três contagens do grafo. Como a entrada é apenas arestas, nós e componentes, ela funciona para pseudocódigo, fluxogramas e grafos exportados de qualquer ferramenta de análise estática, sem necessidade de compartilhar o próprio código-fonte.
A fórmula M = E − N + 2P
A métrica é calculada como M = E − N + 2P, em que E é o número de arestas do grafo de fluxo de controle, N o número de nós e P o número de componentes conexas. Para um único programa ou função, o grafo é uma única componente conexa, portanto P = 1 e a fórmula se reduz a M = E − N + 2. Quando você analisa várias funções desconectadas ao mesmo tempo — digamos, os grafos de chamada de três módulos separados desenhados em um mesmo diagrama — P conta cada parte desconectada e o termo +2P mantém o resultado consistente com a soma das complexidades das partes. O endpoint também retorna decision_points, definido como M − 1, que equivale ao número de predicados de um programa estruturado cujo grafo foi medido. As três entradas precisam ser inteiros positivos; a chamada rejeita frações, zero, contagens negativas e valores não numéricos, pois tais contagens não podem descrever um grafo de fluxo de controle real, e aceitá-las em silêncio esconderia um erro de medição a montante.
Como usar o número na prática
A complexidade indica o número mínimo de casos de teste necessários para exercitar cada caminho independente, por isso as equipes a usam como piso de cobertura no planejamento de testes: uma função com M = 7 não pode ser totalmente testada em ramificações com três testes, por mais engenhosos que sejam. Ela também alimenta a política de revisão de código — muitas empresas sinalizam qualquer função cuja complexidade ultrapasse um limite acordado — e o acompanhamento da dívida técnica, em que a soma ou o máximo sobre uma base de código é observado versão após versão. Esta API é a etapa aritmética desse fluxo de trabalho: conte as arestas, os nós e as componentes no seu analisador ou diagrama, envie-os e receba o mesmo valor sempre, pois o cálculo é totalmente determinístico, sem arredondamento e sem heurísticas. Ela roda na nossa edge global por US$ 0,002 por requisição, e o mesmo código roda grátis no seu navegador nesta página, de modo que você pode verificar um valor à mão e pagar apenas quando automatizar a verificação em um pipeline.
Casos de uso
Definir um piso de cobertura de testes
Transforme as contagens do grafo do seu analisador estático no número mínimo de casos de teste para cobrir cada caminho independente de uma função.
Aplicar um orçamento de complexidade em CI
Faça o build falhar quando a complexidade ciclomática de um módulo cruzar o limiar acordado pela equipe, calculada a partir de arestas, nós e componentes.
Conferir respostas de trabalhos e provas
Verifique o resultado de um exercício de engenharia de software que pede o número de McCabe a partir de um fluxograma, com a fórmula mostrada na resposta.
Perguntas frequentes
Quanto custa?
US$ 0,002 por requisição. Também é grátis executar no seu navegador nesta página — o mesmo código calcula as duas coisas.
Qual fórmula é usada?
A fórmula original de McCabe, M = E − N + 2P, em que E são as arestas, N os nós e P as componentes conexas. Para um único programa P = 1, ou seja, E − N + 2.
Por que minhas entradas são rejeitadas?
Arestas, nós e componentes precisam ser inteiros positivos. Zero, negativos, frações e valores não numéricos não descrevem um grafo de fluxo de controle real e são rejeitados como entrada inválida.
O que é o campo decision_points?
É M − 1: o número de nós predicado (de decisão) de um programa estruturado cujo grafo tem esta complexidade. É uma conveniência para equipes que contam ifs e laços em vez de arestas.
Preciso enviar código-fonte?
Não. A entrada são três contagens do grafo de fluxo de controle, portanto o código proprietário nunca sai do seu analisador — viajam apenas os totais de arestas, nós e componentes.
O resultado é determinístico?
Sim. É aritmética inteira exata, sem arredondamento, aleatoriedade ou chamadas externas: as mesmas três contagens sempre retornam a mesma complexidade.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/math/cyclomatic-complexity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"edges":9,"nodes":8,"components":1}'const res = await fetch("https://api.kit.forhosting.com/math/cyclomatic-complexity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"edges": 9,
"nodes": 8,
"components": 1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/cyclomatic-complexity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"edges": 9,
"nodes": 8,
"components": 1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/cyclomatic-complexity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"edges":9,"nodes":8,"components":1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"edges":9,"nodes":8,"components":1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/cyclomatic-complexity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"edges": 9,
"nodes": 8,
"components": 1
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.cyclomatic_complexity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |