McCabe与Yourself Drawing的圈复杂度



所以我被教导要像这个网站一样计算圈复杂度但是最近我发现了这个东西,它说圈复杂度= (1 + if +循环+案例)。它们是一样的吗?我读的东西对每个案例都是完美的吗?因为我想知道它是否会错过一些东西,或者在计算时没有考虑到一些东西?从我的理解来看,它似乎很好,但与绘制所有内容相比,它感觉有点简单。

如果我有一个循环,比如

while (a==b && c>d) {
}

我会说那里有一个循环(comp = 1循环+1)还是我会说有3个(1循环+1测试+1测试+1),因为while a==b和c>d测试部分。这和

有什么区别呢?
while(a>b) {
}

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

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

它只有一个循环。

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

如果我画了路径,我只有一条路径做code>loop>endcode。或者我有两个路径:

1)代码循环>> endcode

假设这个循环就是我上面写的FOR循环例子。

为所有的问题道歉,我似乎特别对循环感到困惑。

据我所知,流径分析与使用关键字不一样,但是很接近。我甚至在http://www.literateprogramming.com/mccabe.pdf非常混乱。

单词paths有两种用法。一个是作为图中的一条边,还有另一种是作为一组边,也称为独立电路。我将使用术语边(单边)和路径(独立电路)。

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

我认为原始论文中没有定义的重要一点是一组语句是否修改了一些东西,或者以后用来修改一些东西。这与你的问题特别相关复合条件。

关于复合条件句(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() {
}

只有当a不等于b时,dofunction()才会执行。

关于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。这个文档还显示了一些工具计算逻辑运算符,而一些不。