2017-02-14 1 views
1

if 조건에서 순환 복잡성을 줄이는 방법은 무엇입니까? 경우 상태

조건이 서로 독립적
if(condition1 || condition2 || condition3 || condition4 || condition5) 
... 

이 코드의 복잡성이 높은 경향은 다음과 같이 복잡성을 줄이기 위해이 논리 리팩토링하는 방법은 무엇입니까?

여기서 조건은 유효성 검사를 수행하고 부울 값을 반환하는 메서드를 나타낼 수 있습니다.

위의 코드 조각의 선명도

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      System.out.println("hello"); 
     } 
     else{ 
      System.out.println("hello world"); 
     } 
    } 

복잡성에 대한 코드를 추가하면

+0

당신은 더 많은 코드를 표시해야합니다 : 당신은 하나의 경로가 있습니다. – davidxxx

+0

왜 순환 복잡성에 관심이 있습니까? 순환 적 복잡성을 줄일 수 있다면 가독성을 줄이겠습니까? –

+0

제가 알다시피, 순환 복잡성은 코드를 통해 선형 적으로 독립적 인 경로의 수입니다. 이것을 줄이기위한 쉬운 방법은 매번 모든 조건을 평가할 것이므로'|| '대신'|'를 사용하는 것입니다. 그래도 개선을보기가 힘듭니다. –

답변

0

7 각 조건을 채워 부울 플래그를 얻고 if 문에 그 플래그를 사용 할 수 있습니다. 그것은 제 의견으로는 가독성을 향상시킬 것입니다. 이 코드는 더 보편적 만들 것이 특별한 경우

+1

그러나 그것은 복잡성 문제를 해결하지 못했을까요? –

0

:이 방법 내부 로직이 정말이 경우

public void doSomething(boolean... val) { 
    for (boolean v : val) { 
     if (v) { 
      System.out.println("hello"); 
      return; 
     } 
    } 

    System.out.println("hello world"); 
} 

이, 당신은 방법에있는 인수의 수에 대해 수행하지 않는 수 있습니다 (즉, 어떤 인수가 true이라면 ACTION # 1을하고 그렇지 않으면 ACTION # 2를하십시오.) 편집 한 후

0

:

"위의 코드 조각의 복잡성 7"

나는 문제는 복잡성을 측정하기 위해 사용하는 도구라고 생각합니다.

당신이

if(val || val2 || val3|| val4|| val5|| val6) 

boolean condition = val || val2 || val3|| val4|| val5|| val6;   
    if(condition) 

복잡성이 지금 무엇으로 대체 할 경우?


개발시 순환 복잡도는 일반적으로 코드 흐름의 잠재적 경로를 참조합니다. 중첩 된 조건부 블록과 관련된 경우가 많습니다.

중첩 된 레벨이 일종의 화살표를 그리는 것처럼 중요한 순환 복잡성을 갖는 코드에 대해 화살표 코드로 이야기합니다.

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      System.out.println("hello"); 
     } 
     else{ 
      System.out.println("hello world"); 
     } 
    } 
  • 첫 번째 경로 : if(val || val2 || val3|| val4|| val5|| val6)
  • 두 번째 경로 : else{
  • 세 번째 경로 : 코드 만 세 가지 경로를 가지고있는 샘플 코드에서

    는 문제가되지 않습니다 else과 방법 끝 사이

코드가 적을수록 경로를 쉽게 읽을 수 있고, 테스트하고 유지 관리 할 수 ​​있습니다.

너무 단순한 경우 else 문을 사용하지 않으면 복잡성을 줄일 수 있습니다. 어떤 잠재적 인 경로를 삭제합니다

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      System.out.println("hello"); 
      return; 
     } 

     System.out.println("hello world");   
    } 

그러나 명확하게 당신의 예는 복잡성과 관련된 심각한 문제를 나타낼 너무 간단합니다.
다음은 순환 적 복잡성을 줄이기 위해 코드를 리팩터링하는 것과 관련하여 복잡한 질문이있는 샘플 코드의 수정 된 버전입니다.

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      if (condition){ 
        if (val8 && val9){ 
        ... 
        } 
        else { 
         if (condition2 && condition3){ 
         System.out.println("hello"); 
         } 
        } 
      } 

     } 
     else{ 
      System.out.println("hello world"); 
     } 
    } 

은 일반적으로 당신이 가능한 경로의 수를 줄일 수있는 복잡성을을 줄일 수 있습니다. 당신은 그것을 얻을 수 있습니다 : 조건이 그것을 할 수 있으며 대기하지 않을 때

  • 이 방법을 종료하는 하나의 문이 될 수있는 동안 분리 else
  • 그룹화 조건 문을 필요하지 피함으로써

    • 단일 이탈 지점에 대한 이 코드는 더 복잡성을이 없기 때문에

  • +0

    작은 메모 : if 블록에는 else가없는 스 니펫에서 'return;'이 필요하며 동일한 출력을 유지합니다. – Linuslabo

    +0

    @Linuslabo 실제로 매우 중요합니다. 고맙습니다. – davidxxx

    관련 문제