2013-05-24 1 views
-1

Следующий код java дает довольно высокую Cyclomatic Complexity. Я хотел бы найти способ правильно его уменьшить. Как мне это лучше всего сделать?Сокращающая цикломатическая сложность с интервалом

Чтобы быть ясным, код получает соответствующий результат от значения, исходя из того, находится ли значение между двумя пределами. Само значение может быть любым целым числом от -10000 до +200000. Проблема заключается в основном с операторами «Меньше или равными», которые препятствуют простому использованию библиотеки. Диапазон между двумя пределами может быть разным, и мы говорим о диапазонах в 10000, примерный интервал будет [< 0 ... 10000 .... 25000 ... 32500 ...]. Диапазоны - это довольно произвольные числа, определенные бизнесом.

Вы можете предположить, что значения LIMIT являются константами, определенными в начале класса. То же самое касается заданных значений результата. Возможно изменение их от константы к чему-то другому.

Любые идеи?

private int function getBasedOnInterval(int value){ 
    int result; 
    if(value <= 0){ 
    result = RESULT1; 
    }else if(value <= LIMIT1){ 
    result = RESULT2; 
    }else if(value <= LIMIT2){ 
    result = RESULT3; 
    }else if(value <= LIMIT3){ 
    result = RESULT4; 
    }else if(value <= LIMIT4){ 
    result = RESULT5; 
    }else if(value <= LIMIT5){ 
    result = RESULT6; 
    }else if(value <= LIMIT6){ 
    result = RESULT7; 
    }else if(value <= LIMIT7){ 
    result = RESULT8; 
    }else if(value <= LIMIT8){ 
    result = RESULT9; 
    }else if(value <= LIMIT9){ 
    result = RESULT10; 
    }else if(value <= LIMIT10){ 
    result = RESULT11; 
    }else if(value <= LIMIT11){ 
    result = RESULT12; 
    }else if(value <= LIMIT12){ 
    result = RESULT13; 
    }else if(value <= LIMIT13){ 
    result = RESULT14; 
    }else{ 
    result = RESULT15; 
    } 
    return result; 
} 
+1

Не могли бы вы привести некоторые значения? LIMITxx через определенные промежутки времени? они случайны? – Craig

ответ

2

Одним из первых шагов для рефакторинга может быть использование всех ограничений в массиве или списке, а затем их повторение и проверить каждый предел:

private int function getBasedOnInterval(int value) { 
    int result = RESULT15; 

    // consider LIMITS as an array containing 0, LIMIT1...LIMIT13 
    // consider RESULTS as an array containing RESULT1...RESULT14 
    for(int index = 0; index < LIMITS.length; index++) { 
     if(value <= LIMITS[index]) { 
      result = RESULTS[index]; 
      breaks; 
     } 
    } 

    return result; 
} 
+0

Так просто, можно было задаться вопросом, почему я не думал об этом. В самом деле проблема заключалась в основном в ветке else, которая не имеет предела. Открытие с ним фактически решает проблему. – Patrigan

+0

Остальная ветка разрешена начальным значением 'result' –

1

Возможно, вы ищете BST (Binary Search Tree).

Из Википедии; Временная сложность в большой нотации O:

 | Average | Worst case 
---------------------------------- 
Space | O(n)  | O(n) 
Search | O(log n) | O(n) 
Insert | O(log n) | O(n) 
Delete | O(log n) | O(n) 

Это позволит ускорить поиск, если вы создаете BST один раз в начале и просто использовать его. Если бы вы предоставили нам дополнительную информацию о распространении данных, его можно было бы улучшить с помощью других методов.