循環的複雑度計算機
循環的複雑度 API は、制御フローグラフの構造から McCabe のメトリクスを計算します。辺の数、ノードの数、連結成分の数を入力すると、循環的複雑度 M = E − N + 2P、つまりコードを通る線形独立なパスの最小数と、分岐カバレッジを完全にするために必要なテストケース数の下限を返します。ソースコードのアップロードもパーサーの設定も不要です。すでにお持ちのグラフの 3 つのカウントを送るだけで、ブラウザでもエッジでも同じ方法で計算された、決定論的な数値が返ってきます。
無料で実行
循環的複雑度が測定するもの
循環的複雑度は 1976 年に Thomas McCabe が導入した指標で、プログラムの制御フローグラフを通る線形独立なパスの数を数えます。if、while ループ、case 分岐、条件式などの決定点がひとつあるごとにパスがひとつ増えるため、この指標はコードのテストと理解の難しさを反映します。値が 1 の場合は分岐のない直線的なコードを意味します。10 という値は、モジュールの分割が必要になる目安として広く引用されているしきい値です。この数値は言語ではなくグラフの性質です。関数の制御フローグラフを描けば複雑度は確定し、この循環的複雑度計算機はグラフの 3 つのカウントから直接評価します。入力は辺・ノード・連結成分だけなので、擬似コード、フローチャート、任意の静的解析ツールから書き出したグラフに使え、ソースコードそのものを共有する必要はありません。
計算式 M = E − N + 2P
この指標は M = E − N + 2P で計算されます。E は制御フローグラフの辺の数、N はノードの数、P は連結成分の数です。単一のプログラムや関数ではグラフは 1 つの連結成分なので P = 1 となり、式は M = E − N + 2 に簡略化されます。複数の切断された関数を一度に解析する場合、たとえば 3 つの独立したモジュールの呼び出しグラフを 1 つの図に描いた場合、P は切断された部分ごとに数えられ、+2P の項により結果は各部分の複雑度の合計と一致します。エンドポイントは decision_points(M − 1 と定義)も返します。これは、測定したグラフを持つ構造化プログラムの述語の数に相当します。3 つの入力はすべて正の整数である必要があります。分数、ゼロ、負の数、非数値は実在する制御フローグラフを表せないため呼び出しは拒否され、黙って受け入れると上流の測定ミスを隠すことになります。
この数値の実践的な使い方
複雑度は、独立したすべてのパスを実行するために必要なテストケースの最小数を示すため、チームはテスト計画のカバレッジ下限として利用します。M = 7 の関数は、どんなに巧みに選んでも 3 件のテストでは分岐を完全にはテストできません。また、コードレビューの方針(複雑度が合意した上限を超えた関数にフラグを立てる運用は多くの組織で行われています)や、コードベース全体の合計・最大値をリリースごとに追跡する技術的負債の監視にも使われます。この API はそのワークフローの算術部分です。解析ツールや図から辺・ノード・連結成分を数えて送信すれば、丸めもヒューリスティクスもない完全な決定論的計算で、常に同じ値が返ります。グローバルエッジで 1 リクエスト $0.002 で実行され、同じコードがこのページのブラウザでは無料で動きます。手計算で確認し、パイプラインに自動化する場合だけお支払いいただけます。
活用例
テストカバレッジの下限を設定
静的解析ツールのグラフカウントを、関数の独立パスをすべてカバーするのに必要なテストケースの最小数に変換します。
CI で複雑度の予算を適用
辺・ノード・連結成分から計算したモジュールの循環的複雑度がチームの合意したしきい値を超えたら、ビルドを失敗させます。
課題や試験の答え合わせ
フローチャートから McCabe の数を求めるソフトウェア工学の演習の答えを、式とともに確認できます。
よくある質問
料金はいくらですか?
1 リクエスト $0.002 です。このページのブラウザでも無料で実行できます。同じコードが両方を計算します。
どの式が使われますか?
McCabe の元の式 M = E − N + 2P です。E は辺、N はノード、P は連結成分の数です。単一プログラムでは P = 1 なので E − N + 2 になります。
入力が拒否されるのはなぜですか?
辺・ノード・連結成分はそれぞれ正の整数である必要があります。ゼロ、負の数、分数、非数値は実在する制御フローグラフを表せないため、無効な入力として拒否されます。
decision_points フィールドとは何ですか?
M − 1 のことで、この複雑度を持つグラフに対応する構造化プログラムの述語(決定)ノードの数です。辺ではなく if やループを数えるチーム向けの便宜上の値です。
ソースコードを送る必要がありますか?
いいえ。入力は制御フローグラフの 3 つのカウントだけなので、独自のコードが解析ツールの外に出ることはありません。送信されるのは辺・ノード・連結成分の合計のみです。
結果は決定論的ですか?
はい。丸め、乱数、外部呼び出しのない正確な整数演算です。同じ 3 つのカウントには常に同じ複雑度が返ります。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
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)リクエスト例
{
"edges": 9,
"nodes": 8,
"components": 1
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.cyclomatic_complexity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |