web-dev-qa-db-ja.com

循環的複雑度を正確に計算する方法は?

私の質問は、プログラミングコードから制御フローグラフへの変換についてです。

たとえば、次のコードがあるとします。

public class Contractor
{
    // other member fields... 
    private bool isVerified;
    private int noOfA;
    private int noOfB;

    // other member methods... 
    public int GetNumberOfDependents()
    {
        this.noOfB = this.noOfA;

        if (this.isVerified)
        {
            this.noOfB++;
        }

        if (this.noOfB > 4)
        {
            this.noOfB = 4;
        }

        return this.noOfB;
    }
}

私は以下のフロー図を描きました:

enter image description here

また、IFコマンドの条件式のノードは描画しなかったので注意してください。これは、「コマンド」ではないと思います。

CCに関するウィキペディアのページ によると、ノードの定義は次のとおりです。

グラフのノードは、プログラムのコマンドの分割できないグループに対応します

そして式は:

M = E − N + 2P

そのため、CC値は4になりました。

ただし、この link の説明によると、CC値は3です。

ここに矛盾があります。

さらに、Programmers.SEの質問「サイクロマティック複雑性について」に対する David Tonhoferの回答 によれば、式は次のようになります。

v(G)= e-v + p

その答えは誰にも認められていません、私の質問は:私の図は正しいですか?

6
VincentZHANG

フロー図は次のように簡略化できます。

[this.noOfB = this.noOfA;]
   |           \
   |            \
   |           [noOfB++]
   |            /
   |           /
[-----------------]
   |           \
   |            \
   |           [noOfB = 4]
   |            /
   |           /
[-----------------]

これにより、5つのノード、6つのエッジ、および1つの連結成分が得られます=> M = 6-5 + 2 * 1 = 3。

2
Jules