11例如何降低switch的圈复杂度
How to lower cyclomatic complexity of switch with 11 cases
我必须检查一个值是否在一个范围内(0..9、10..19.. 到 100)并且 return 一个值取决于范围。我的函数的圈复杂度是 12,我需要将它降低到至少 9。
我真的很茫然。
我想使用关联数组(像字典或散列一样使用 table),但我认为它不适用于范围并且我不想显式声明数组有 100 个条目!
$value = 23;
switch(true) {
case in_array($value, range(0,9)):
return -10;
break;
case in_array($value, range(10,19)):
return -7;
break;
case in_array($value, range(20,29)):
return -5;
break;
case in_array($value, range(30,39)):
return 3;
break;
case in_array($value, range(40,49)):
return 4;
break;
case in_array($value, range(50,59)):
return 5;
break;
case in_array($value, range(60,69)):
return 6;
break;
case in_array($value, range(70,79)):
return 7;
break;
case in_array($value, range(80,89)):
return 8;
break;
case in_array($value, range(90,99)):
return 9;
break;
case in_array($value, range(100,100)):
return 10;
break;
default:
return 0;
break;
}
有人可以帮忙吗?有更简单的方法吗?
TIA
由于每一步都是 10,您可以执行整数除以 10 并在数组中查找相应的值:
function theFunc(int $i)
{
return ($i<0 || $i>100) ? 0 : [-10, -7, -5, 3, 4, 5, 6, 7, 8, 9, 10][(int)($i/10)];
}
for($i = -1 ; $i <= 101 ; $i++)
var_dump([$i, theFunc($i)]);
如果数字大于 30,您可以只使用整数除法。如果您返回,也不需要 break;
,因为它已经停止代码执行。
switch(true) {
case in_array($value, range(0,9)):
return -10;
case in_array($value, range(10,19)):
return -7;
case in_array($value, range(20,29)):
return -5;
case in_array($value, range(30,100)):
return intdiv($value, 10);
default:
return 0;
}
我必须检查一个值是否在一个范围内(0..9、10..19.. 到 100)并且 return 一个值取决于范围。我的函数的圈复杂度是 12,我需要将它降低到至少 9。 我真的很茫然。
我想使用关联数组(像字典或散列一样使用 table),但我认为它不适用于范围并且我不想显式声明数组有 100 个条目!
$value = 23;
switch(true) {
case in_array($value, range(0,9)):
return -10;
break;
case in_array($value, range(10,19)):
return -7;
break;
case in_array($value, range(20,29)):
return -5;
break;
case in_array($value, range(30,39)):
return 3;
break;
case in_array($value, range(40,49)):
return 4;
break;
case in_array($value, range(50,59)):
return 5;
break;
case in_array($value, range(60,69)):
return 6;
break;
case in_array($value, range(70,79)):
return 7;
break;
case in_array($value, range(80,89)):
return 8;
break;
case in_array($value, range(90,99)):
return 9;
break;
case in_array($value, range(100,100)):
return 10;
break;
default:
return 0;
break;
}
有人可以帮忙吗?有更简单的方法吗? TIA
由于每一步都是 10,您可以执行整数除以 10 并在数组中查找相应的值:
function theFunc(int $i)
{
return ($i<0 || $i>100) ? 0 : [-10, -7, -5, 3, 4, 5, 6, 7, 8, 9, 10][(int)($i/10)];
}
for($i = -1 ; $i <= 101 ; $i++)
var_dump([$i, theFunc($i)]);
如果数字大于 30,您可以只使用整数除法。如果您返回,也不需要 break;
,因为它已经停止代码执行。
switch(true) {
case in_array($value, range(0,9)):
return -10;
case in_array($value, range(10,19)):
return -7;
case in_array($value, range(20,29)):
return -5;
case in_array($value, range(30,100)):
return intdiv($value, 10);
default:
return 0;
}