【问题标题】:Cyclomatic complexity of McCabe vs Yourself DrawingMcCabe vs Yourself 绘图的圈复杂度
【发布时间】:2014-06-25 11:32:53
【问题描述】:

我被教导要像这样计算圈复杂度site does 但是最近我发现这个东西说 Cyclomatic Complexity = ( 1 + ifs + loops + cases )。他们是一样的吗?我读到的东西适合每种情况吗?正如我想知道它是否会错过某些东西或在计算时不考虑某些东西?据我了解,这看起来不错,但与绘制所有内容相比感觉有点简单。

如果我有一个循环,例如

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

我会说那里有 1 个循环 (comp = 1 loop+1) 还是说有 3 个 (1 loop +1 test+1 test+1) 由于 while a==b 和 c> d 测试零件。 和刚才说的相比如何

while(a>b) {
}

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

作为

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

它只有一个循环。

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

如果我绘制路径,我是否只有一个路径在执行代码>循环>结束代码。或者我有两条路径是:

1) 代码>循环>结束代码

2) code>endcode 想象一下循环是我上面写的 FOR 循环 例子。

对所有问题表示歉意,这似乎是我特别困惑的循环。

【问题讨论】:

    标签: cyclomatic-complexity


    【解决方案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。这个文件 还表明有些工具计算逻辑运算符,有些则不计算。

    【讨论】:

    • 我冒昧地修复了链接(因为我假设你已经打算这样做了)。加 1,感谢您的出色贡献!
    • oovaide.sourceforge.net/articles/Complexity.html 在示例 4 中,CFG 图和计算似乎不正确。从开始到结束的直接边似乎是不必要的,因为已经记录了第一个条件的 if 和 else 路径。
    • 抱歉这么晚了,但非常感谢,真的帮我解决了问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多