忍者ブログ
情報処理技術者試験の合格を目指す全受験者のための、1問1問「徹底解説」ブログです。単なる過去問の暗記ではなく、なぜその答えになるのかを本質的に理解できるよう解説します。書籍などでは学べない最新用語やトレンドを踏まえてご紹介します。

【アルゴリズム】ソースコードの「ごちゃごちゃ度」を数値化!「循環的複雑度」|情報処理問題1000本ノック

プログラムの読みやすさやバグの潜みにくさを科学的に測る。分岐の数からコードの複雑さを割り出す重要指標「循環的複雑度」を攻略しましょう。

1. 【 問題 】:プログラムの構造複雑度とテスト設計

【 問題 】 ソフトウェアのソースコード解析やテスト設計において、プログラムの制御フロー(条件分岐やループなど)に基づき、コードの論理的な複雑さを数理的に示す指標はどれでしょうか?
この値はプログラム内の「独立した実行経路の数」を表しており、ホワイトボックステストにおいてすべてのルートを網羅するために最低限必要な「テストケースの数」を決定する目安としても利用されます。

① 循環的複雑度 (Cyclomatic Complexity / サイクロマティック複雑度)
② 時間計算量 (Time Complexity)
③ 結合度 (Coupling)
④ 認知複雑度 (Cognitive Complexity)

2. 正解:

正解: ① 循環的複雑度 (Cyclomatic Complexity)

3. 解説:「分岐の数」を数えて、コードの危険度を見抜く

プログラミングにおいて、`if` 文や `switch` 文、`while` などのループが何重にも重なったコードは、バグが生まれやすくレビューも困難になります。この「ごちゃごちゃ度」を誰が見ても客観的にわかる数字にしたのが循環的複雑度です。

【循環的複雑度の計算方法と基準値】

簡単な計算の目安:プログラムのフローチャート(制御フローグラフ)を書かなくても、実は簡単な数式で求められます。
$$ 循環的複雑度 = 条件分岐の数 + 1 $$
例えば、関数の中に `if` 文が3つあれば、複雑度は $$ 3 + 1 = 4 $$ になります。 ← ココが問題の正解!

運用のガイドライン:一般的に、1個の関数(メソッド)におけるこの複雑度の数値が「10以下」なら非常にシンプルで安全、「20を超えると」バグが混入しやすく危険、「50以上」は絶対に分割すべき(スパゲティコード)と評価されます。
[ 選択肢のシャッフル解説(複雑さやプログラム品質に関する指標) ]
★ ② 時間計算量:アルゴリズムの性能を表す指標で、データ量が大きくなったときに、処理にかかる時間がどれくらい増えるかを「$O(n)$」などのビッグオー記法で表すものです。
★ ③ 結合度:モジュール(プログラムの部品)同士が、どれくらい強くお互いに依存し合っているかを表す度合いです。値が低い(疎結合である)ほど良いコードとされます。
★ ④ 認知複雑度:循環的複雑度の弱点(`switch`文などで単純に数値が跳ね上がる点)を補うために作られた新しい指標です。「人間がコードを読んだときに、どれくらい脳に負担がかかるか(ネストの深さなどを重視)」を測定します。

1. 理解のコツ: 「ドライブのルート(分かれ道)」に例えてみましょう。
・一本道のドライブコースなら、迷う要素はゼロです(複雑度=1)。
・しかし、途中に「右に行くと海岸、左に行くと山」という交差点(`if`文)が3箇所あったら、ルートの組み合わせが生まれます。この『分かれ道の多さをカウントして、すべてのルートを走り切るために最低何回のドライブ(テストケース)が必要か』を弾き出すのが循環的複雑度です。分かれ道が多い道ほど、事故(バグ)が起きやすいのは当然ですよね。
2. 試験対策の視点: 「条件分岐やループに基づく複雑さ」「独立した実行経路の数」「テストケース数の決定に用いる」という記述があれば「循環的複雑度(サイクロマティック複雑度)」が一択です。基本情報の科目B(アルゴリズム問題)や、応用情報、高度試験(組込みやソフトウェア開発)の午前試験において、静的コード解析やホワイトボックステスト(パス網羅テスト)の設計手法のド真ん中として頻出する重要理論です。


4. まとめ

「プログラム内の条件分岐の数から論理的なルートの数を算出し、コードの品質や必要なテスト数を科学的に導き出すための指標」。これが循環的複雑度です。この指標を自動的にチェックするツールを開発プロセスに組み込むことで、現代のIT現場はスパゲティコードの誕生を未然に防いでいるのです。


PR