gpt4 book ai didi

cyclomatic-complexity - 开关案例陈述的圈复杂度

转载 作者:行者123 更新时间:2023-12-04 04:04:47 27 4
gpt4 key购买 nike

我对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,我认为是错字)

它说我们只需要将案例0和案例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

我对么..?
真的,真的,真的很困惑...

最佳答案

我使用的代码度量工具将每种情况都算作一个单独的分支,即使这是一个失败的情况。

但这是一个任意选择。默认情况下,代码度量工具倾向于犯错。最终评估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]);
}

关于cyclomatic-complexity - 开关案例陈述的圈复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com