McCabe与自己绘画的周期复杂性

时间:2014-06-25 11:32:54

标签: cyclomatic-complexity

因此我被教导要解决像site does这样的圈复杂问题。 但最近我发现这个东西说Cyclomatic Complexity =(1 + ifs + loops + cases)。它们是一样的吗?对于每个案例,我读到的东西都是完美的吗?我想知道它是否会错过某些东西或者在计算时没有考虑到某些因素?根据我的理解,这似乎很好,但与绘制所有内容相比,感觉有点简单。

此外,如果我有一个循环,如

while (a==b && c>d) {
}
我会说那里有1个循环(comp = 1循环+ 1)或者我会说有3个(1循环+1测试+ 1个测试+ 1),因为while a == b和c> d测试部件。 如何与

进行比较
while(a>b) {
}

因为我认为只有1个循环所以(comp = 1循环+1) 我还假设它在复杂性方面与FOR循环完全相同。

as

for(int i =0; i<12; i++){
}

它只有一个循环。

最后,如果我有类似代码的东西,while循环没有if语句或任何东西,那么结束代码。

如果我绘制路径,我只有一条路径代码&gt;循环&gt;结束代码。或者我有两条路径:

  

1)代码&gt;循环&gt;结束代码

     

2)代码&gt; endcode想象一下,循环是我上面写的FOR循环   示例

对所有问题道歉,它似乎特别是循环,我非常困惑。

1 个答案:

答案 0 :(得分:1)

据我所知,流路分析与使用关键字不同, 但很接近。我甚至找到了原始论文 http://www.literateprogramming.com/mccabe.pdf非常混乱。

单词路径以两种方式使用。一个是图中的边缘,而且是 另一种是作为一组边缘,也称为独立电路。我会用的 术语边缘(单边)和路径(独立电路)。

附录包含使用关键字的技术。的流程图 示例SEARCH函数看起来有 12条边 - 11个节点+ 2 = 3条路径,但文字说 有四个。代码显示四个,与文本匹配,但在那里 如果只计算修改某些内容的语句,则只有三条路径。

我认为原始论文中没有定义的一个重点是 一组语句是修改某些内容,还是稍后使用 修改一些东西这与您的问题特别相关 复合条件。

关于复合条件(Meyers)的问题在这里讨论http://www.researchgate.net/publication/3407068_A_Critique_of_Cyclomatic_Complexity_as_a_Software_Metric 一节名为“理论考虑”。复合条件甚至更多 因为它们具有短路评估,所以在C或C ++等语言中很棘手且很重要 http://en.wikipedia.org/wiki/Short-circuit_evaluation

可以有条件:

while(a==b && dofunction() {
}

dofunction()仅在a不等于b时才会执行。

关于for循环的最后一个问题,我假设有一些东西 像:

statements (initial)
for(int i =0; i<12; i++)
    {
    statements (body)
    }
statements (end)

抱歉,如果我能绘制图表会很好,但我没有足够的分数 我会放置节点,如:

node(A)
    |
    | statements (initial)
    |
node(B)   (for loop)
    |                 |
    | no statements   |  statements (body)
    |                 |
node(C)   (meet point at end of for loop)
    |
    | statements (end)
    |
node(D)

A-B有一个优势 B-C有两条边 - 一条用于采取条件,一条用于跳过。 C-D有一个边缘

代码中只有两条路径。复杂性计算如下: 4个节点 - 4个边缘+ 2 = 2的圈复杂度。

这里有一个描述这个的文件,更多的例子是 系统地分析。 http://oovaide.sourceforge.net/articles/Complexity.html。这个文件 还表明有些工具会计算逻辑运算符,有些则不会。