循環的複雑度とは?
循環的複雑度(サイクロマティック複雑度、Cyclomatic Complexity)とは、ソフトウェア品質を測定するソフトウェアコードメトリクスのひとつで、プログラムの複雑度を測定するものです。Thomas J. McCabeによって1976年に考案されました。 線形的に独立な経路の数を数値化するもので、例えば、ソースコード内に条件が1つのif文のような決定論理が1つある場合、if文が真の場合とif文が偽の場合があり、線形的に独立したパスは2つとなります。
循環的複雑度の重要性
循環的複雑度が高くなると、プログラムは複雑になります。バグの混入リスクや発見されたバグの修正にかかる時間が増え、修正で新たなバグが購入する可能性も増えるため、再利用が困難になります。
循環的複雑度を計測し、低く保つことで、プログラムの可読性、保守性、移植性は高まります。また、テストに必要なテストパターンの数も減るため、カバレッジも上げることができます。
循環的複雑度の目安
循環的複雑度 |
複雑さの状態 |
バグ混入確率 |
10以下 |
非常に良い構造 |
25% |
30以上 |
構造的なリスクあり |
40% |
50以上 |
テスト不可能 |
70% |
75以上 |
いかなる変更も誤修正を生む |
98% |
循環的複雑度を下げるために
循環的複雑度を低減する一つの手段として、リファクタリングによる簡略化があげられます。
リファクタリングとはプログラムの振る舞いを変更せず、コードの内部構造を改善することです。例えば、大規模関数内に複数回現れる処理をコンポーネント化し、関数を整理します。
リファクタリングにより、コードの可読性の向上やテストのしやすさにも繋がります。
循環的複雑度を高くしている関数を見つけてリファクタリングすることにより、コードの品質向上が見込まれます。
ソフトウェアテストを支援する静的解析ツールPolyspace
静的解析ツールPolyspace®は、プロジェクトレベル、ファイルレベルおよび関数レベルで、以下のようなソフトウェアメトリクスの測定をサポートします。
- 循環的複雑度
- 関数結合
- コメント密度
- コール レベル
- パス数
- CWE マッピング
また、以下のソフトウェアメトリクス測定関連タスクで、高品質なコードの完成を支援します。
- ソフトウェアの各バージョンやビルドに対するソフトウェアメトリクスの生成
- Webダッシュボードによるソフトウェアメトリクスの管理
- 閾値設定によるソフトウェア品質目標の定義と、改善率測定による達成までの進行状況の追跡
さらに、Polyspaceは循環的複雑度やその他のソフトウェアメトリクスの測定の他、下記の解析機能を提供し、ソースコード解析を強力にサポートします。
- 目視での発見が困難な、ランタイムエラー、並列処理問題、セキュリティ脆弱性およびその他の欠陥の検出
- MISRA®、JSF++等のコーディング規約への準拠により、コーディングスタイルの一貫性を保ち、コードの可読性や保全性を向上
- 制御フロー及びデータフローの詳細情報や、関数コール図表や、データディクショナリーによる変数の書き込み・読み取りの追跡により、ソフトウェア実行時の振舞いを理解可能
詳しくは、Polyspace の製品ページをご覧ください。
ソースコード解析関連資料
ソフトウェア リファレンス
参考: 静的解析, ランタイムエラー, コードレビュー, 検証とテスト, 要求仕様のトレーサビリティ, 形式検証/形式手法