2013-05-24 3 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

else 브런치는 'result'의 초기 값으로 해결됩니다. –

1

아마도 BST (Binary Search Tree)을 찾고있을 것입니다.

출처 : Wikipedia; 큰 O 표기법 시간 복잡도 : 당신은 시작에 한 번 BST를 생성하고 간단하게 재사용 할 경우

 | 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) 

이것은 당신이 검색을 빠르게 할 수 있습니다. 데이터 확산과 관련하여 더 많은 정보를 제공하려면 다른 기술을 사용하여 향상시킬 수 있습니다.