【问题标题】:Cyclomatic Complexity of switch case statementswitch case语句的圈复杂度
【发布时间】:2015-05-14 14:43:12
【问题描述】:

我对 switch 语句的 CC 感到困惑

如果我有以下代码:

if (n >= 0) {
    switch(n) {
        case 0:
        case 1: 
            printf("zero or one\n");
            break;
        case 2: 
            printf("two\n");
            break;
        case 3:
        case 4: 
            printf("three or four\n");
            break;
        }
    }
else {
    printf ("negative\n");
}

什么是 CC?

我发现a post说是5,有这个图

(边是17,不是16,我认为是错字)

它说我们只需要将case 0和case 1算作一个

但我认为图表应该是:

边数:17,
节点数:13,
17 - 13 + 2P = 6

我把每个案例都算作 1 个

我的 OOSE 教授说是 6,但方式不同

他说:

init     => 1  
if       => 1  
switch   => 1  
case 0 1 => 1  
case 2   => 1  
case 3 4 => 1

所以应该是 6

正确答案是什么?
我真的很困惑,谢谢。


已编辑
现在我认为它是 7。是的,7
因为如果 n 大于 5,则什么都不做,退出 switch 语句。

然后我们得到这个图表:

现在 E = 18
18 - 13 + 2 = 7

我说的对吗?
真的,真的,真的很困惑……

【问题讨论】:

    标签: cyclomatic-complexity


    【解决方案1】:

    我使用过的代码度量工具将每个案例都算作一个单独的分支,即使它是一个失败案例。

    但这是一个随意的选择。默认情况下,代码度量工具倾向于谨慎行事。最终评估 switch 语句的方式是一个内部实现细节,它会根据输入类型和案例数量(至少在 C# 中)而有所不同。

    减少由 switch 语句引起的圈复杂度的首选方法是将案例/输出转换为字典。在您的示例中,它将类似于下面的代码示例。请注意,这仅是为了可读性/可维护性。如果您的 switch 语句足够长,.Net 编译器会自动为您将其转换为字典,因此不会提高性能。

    var outputs = new Dictionary<int, string>()
                {
                    { 0, "zero or one\n" },
                    { 1, "zero or one\n" },
                    { 2, "two\n" },
                    { 3, "three or four\n" },
                    { 4, "three or four\n" }
                };
    
    if (n >= 0)
    {
        printf(outputs[n]);
    }
    

    【讨论】:

    • 感谢您的回答。我正在学习圈复杂度,只是想知道如何计算它。
    【解决方案2】:

    好的,我找到了答案。

    来自McCabe.com,第 26 和 27 页

    答案是 5,因为 McCabe 的原始版本 CC 将失败案例计为 1。

    【讨论】:

      【解决方案3】:

      正确答案是 7。 switch 语句中的每个 case 都计为 1,因此 5 x 1 = 5。 if 计为 1。 else 计为 1。 所以, 1 + (5 x 1) + 1 = 7。

      如果您将此算作方法的主体,则 cc 将为 8,因为该方法算作直通路径。

      请将您接受的答案更改为正确答案,因为 5 是错误答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多