web-dev-qa-db-ja.com

なぜ循環的複雑度で、条件内の演算子に1を追加するのですか?

基本的に、CCは決定数+1として計算できることを知っています。さらに、条件内のすべての論理演算子により、CCが1増加します。しかし、なぜでしょうか。

コードif(A || B || C) else...を使用すると、制御フローグラフは、2つの結果(2つのブランチ)を持つノードになります。したがって、ブランチカバレッジとは、グラフのエッジであるブランチをカバーすることであると常に考えていました。これは、コンバウンド条件がTRUEとFALSEに評価されることを意味します。パスに関しては、パスはTRUEまたはFALSEのいずれかのみである可能性があります。それでは、コードの他のブランチが実行されていないのに、なぜCCが演算子で増加するのでしょうか。

3
user144171

プログラミング言語がブランチをブール式に抽象化するからといって、それらが存在しないという意味ではありません。実際に実行されるものを見ると、次のようになります。

 +-----------+                           
 |is A true? +------------------+       
 +----+------+                  |       
      |                         |       
 +----v------+                  |       
 |is B true? +------------------+       
 +----+------+                  |       
      |                         |       
 +----v------+                  |       
 |is C true? +------------------+       
 +----+------+                  |       
      |                         |       
+-----v-------------+   +-------v------+
| Do something else |   | Do something |
+-------------------+   +--------------+

短絡評価がなくても、特定のパスを選択する方法は複数あり、それらすべてをテストおよび保守する必要があるため、複雑さが増す場合があります。

4
Karl Bielefeldt

使用する例では、4つの実行パスがあり、実行する必要のあるテストは4つあります。それらは次のように列挙できます。ここで、xは「ドントケア」を示します。

  • 1xx:Aは真です、BとCは気にしないでください-その後パス
  • 01x:Aは偽、Bは真、Cは気にしない-その後パス
  • 001:AとBは偽、Cは真-そしてパス
  • 000:A、B、およびCはすべてfalse-elseパス

(生成されたアセンブリ言語を検討すると、わかりやすくなる場合があります。)

循環的複雑度は、実行する必要のあるテストの可能な数を処理することを目的としています。

2
John R. Strohm