如何通过11种情况降低开关的圈复杂度

时间:2019-02-07 03:04:00

标签: php cyclomatic-complexity

我必须检查一个值是否在一个范围内(0..9、10..19 ..最大为100),并根据范围返回一个值。我函数的圈复杂度是12,我需要将其降低到至少9。 我真的很茫然。

我想使用一个关联数组(像字典或哈希表一样使用),但是我不认为它可以与范围一起使用,并且我不想有一个带有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

2 个答案:

答案 0 :(得分:1)

由于这些步骤通常每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)]);

答案 1 :(得分:0)

如果数字大于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;
}