コードの 2 つのセクションの循環的複雑度を知りたいのですが、
IF((A>B) AND (C>D))
{ a=a+b;c=c+d;}
私の知る限り、上記のコードの循環的複雑度は= 2 + 1 = 3です。
別のコード
IF((A>B) OR (C>D))
{a=a+b;c=c+d;}
上記のコードの複雑さは=4+1=5、
上記の複雑さが正しいかどうか?
コードの 2 つのセクションの循環的複雑度を知りたいのですが、
IF((A>B) AND (C>D))
{ a=a+b;c=c+d;}
私の知る限り、上記のコードの循環的複雑度は= 2 + 1 = 3です。
別のコード
IF((A>B) OR (C>D))
{a=a+b;c=c+d;}
上記のコードの複雑さは=4+1=5、
上記の複雑さが正しいかどうか?
両方の複雑さは同じで、3 に等しく、4 つの方法で数えられます。De Morganを使用してそれらが同じであることを証明することについてNeilに同意します。複雑さのカウントに重要なグラフから同じことがわかると思います。
両方のコード部分のグラフから始めましょう。
説明の言葉:
if and if
andif or if
であるため、2 つの if です。したがって、私の2番目のノードは別のノードです。ご覧のとおり、両方のコード片に数字の違いはありません。ノード、エッジ、リージョンはすべて同じです。違いは、どのノードがどのノードに接続するかであり、これは短絡のしくみに由来します。明らかに、それを持たない言語の場合、グラフは異なる必要があります。
複数あります。複雑さは等しい
エッジ = 5; ノード = 4; 出口 = 1;
どちらの場合も、複雑さ = 5-4+2*(1) = 3 です。この定義は強く接続されたグラフを必要としないため、追加されたエッジを削除します。
エッジ = 6; ノード = 4; 出口 = 1;
どちらの場合も、複雑さ = 6-4+1 = 3 です。この定義は、トポロジー的により意味があり、循環カウント (グラフ単位) の観点から考えるのがより簡単であるためです。クラス内のすべてのメソッドのように、多くのルーチン/関数の複雑さを数えることを考えると、より便利です。関数がループで呼び出される可能性があると考えるのは理にかなっています。しかし、私は脱線します。
地域: 3.
これは、領域 + ノード - エッジ = 2 というオイラー式から来ています。これを言い換えると: 領域 = エッジ - ノード + 2
したがって、領域の数は複雑さと同じです (1 つの出口点を想定)。これは、1 回の終了サブルーチンで、グラフからの複雑さのカウントを簡素化することを目的としていました。
マッケイブ自身は次のように述べています。
実際には、IF "c1 AND c2" THEN などの複合述語は、結合詞 AND がなければ IF c1 THEN IF c2 THEN が 2 つの述語を持つため、複雑さに 2 を与えるものとして扱われます。この理由とテストの目的で、複雑さを計算するときに述語ではなく条件をカウントする方が便利であることがわかっています。
両方のコード部分に 1 つの複合条件があるため、Decisions = 2;
複雑さ = 2+1 = 3。
サイクロマティックな複雑さはサイクルをカウントすることから始まり、実用的な目的で条件をカウントすることで終わったことは注目に値します。
最初に McCabe の論文自体を試してください: http://www.literateprogramming.com/mccabe.pdf
ウィキペディアにはこの論文に基づいた優れた記事がありますが、基本ブロックと接続コンポーネントに従わないと不十分であることがわかりました。
Chambers のページで簡潔でありながら優れた要約を見つけました: http://www.chambers.com.au/glossary/mc_cabe_cyclomatic_complexity.php
第8章の本「ソフトウェアエンジニアリングへの統合アプローチ」には、複雑さの計算を示す例があります(グラフの1つのエッジを食べたと思いますが、図8.7)。
http://books.google.pl/books?id=M-mhFtxaaskC&lpg=PA385&ots=jB8P0avJU7&d&hl=pl&pg=PR1#v=onepage
私はそれらが 3 という同じ循環的複雑度を持っていると思います。これは、ド・モルガンの法則を使用して示すことができます。
IF((A>B) OR (C>D)) {a=a+b;c=c+d;} ELSE {}
IF(!((A>B) OR (C>D))) {} ELSE {a=a+b;c=c+d;}
IF(!(A>B) AND !(C>D)) {} ELSE {a=a+b;c=c+d;}
それを見る別の方法は、グラフを取得して条件付きブロックと出口点を交換し (そしてそれらの間のエッジを反転させ)、ノードまたはエッジの数を変更せずに AND から OR に変換することです。