循環的複雑度
ソースコードの一部の循環的複雑度は、ソースコード内の線形独立な経路の数である。実際、分岐点(if文やfor文など)のないソースコードの場合、その複雑度は 1 であり、そのコードには1つの経路しかない。コードに1つのif文が含まれていれば、コードには2つの経路があることになる。つまり、一方はif文での条件が真となる場合の経路で、もう一方はそれが偽となる場合の経路である。
循環的複雑度は、ソースコードの各行をノードとし、実行の流れをノード間の有向エッジで表したグラフを描くことで計算できる。プログラミング言語によっては、非常に簡潔でコンパクトな表現を用いることができるため、ソースコードの1行がグラフでは複数のノードで表されることもある(例えば、C言語、C++、C#、Javaなどにあるif文を式にしてしまう三項演算子 "?:" )。
一般に、あるモジュールを完全にテストしようとした場合、全ての実行経路を通す必要がある。これの意味するところは、循環的複雑度の大きいモジュールの方が経路数が多く、従ってテストケースも多く必要になるということである。また、複雑度の大きいモジュールは、ソースコードの意味を理解するのに多くの経路を追わなければならず、読解がより困難になる。
また、複雑度の大きいモジュールは凝集度が低いと予想される。この相関を想定する理由は、分岐点(判断ポイント)が多いモジュールは、単一の機能以上のものを詰め込もうとしている可能性が高いためである。しかし、凝集度とは関係なく、モジュールの種類によっては必然的に複雑度が大きくなることもある。例えば、ユーザインタフェース・モジュールに入力データの妥当性確認とエラー復旧のコードが含まれている場合などである。