Как снизить цикломатическую сложность коммутатора с 11 корпусами - PullRequest
0 голосов
/ 07 февраля 2019

Я должен проверить, находится ли значение в диапазоне (от 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;
}

Может кто-нибудь помочь?Есть ли более простой способ сделать это?ТИА

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете просто использовать целочисленное деление, если число больше 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 голосов
/ 07 февраля 2019

Поскольку шаги выполняются регулярно каждые 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)]);
...