2017-04-03 2 views
0

저는이 상황을 몇 번 겪었습니다. 여기서는 이와 비슷한 논리 구조를 사용할 것입니다.중첩 된 If 문에서 중복 논리가 발생했습니다.

switch(someInteger) 
{ 
    case 1: 
     if(conditionA) { 
      if(conditionB) { 
       func1(); 
      } else { 
       func2(); 
      } 
     } else { 
      func3(); 
     } 
     break; 

    case 2: 
     if(conditionA) { 
      if(conditionB) { 
       func4(); 
      } else { 
       func5(); 
      } 
     } else { 
      func6(); 
     } 
     break; 
    case 2: 
     //ditto 
    case 3: 
     //ditto 
    case someObnoxiouslyHighNumber: 
     //ditto 
} 

각각의 구조는 동일하지만 유일한 차이점은 호출되는 기능입니다. 하지만 지금은 논리를 복제하고 있습니다. 단지 더러웠다. 이런 상황을 처리하는 더 우아한 방법이있는 것처럼 느껴지 긴하지만, 나는 아직 우연히 만났습니다.

리팩터링하는 방법에 대한 아이디어가 있으십니까?

편집 : 예제의 구조를 조금 변경하여 문제를 더욱 강조했습니다.

답변

0

잘 모르겠어요,하지만 난 이런 식으로 시도하는 유혹 할 것 :

구조는 여전히 동일하지만, 확실히 청소기의
if  someInteger == 1 and conditionA and conditionB then func1 
else if someInteger == 1 and conditionA and !conditionB then func2 
else if someInteger == 1 and !conditionA    then func3 
else if someInteger == 2 and conditionA and conditionB then func4 
else if someInteger == 2 and conditionA and !conditionB then func5 
else if someInteger == 2 and !conditionA    then func6 
else error "Uncharted territory" 
+0

. 문제는 만약 내가이 logic을 적용하기를 원했던 someInteger의 12 가지 다른 값을 가지고 있었다면, 나는 내 손에 진짜 엉망이 될 것입니다. –

+0

다른 값을 많이 추가하면'else if' 문을 더 길게 만듭니다. 그러나 구조는 동일하게 유지되며 목록을 쉽게 스캔하여 특정 조건을 찾을 수 있습니다. 그래서 나는 그것을 "진짜 혼란"이라고 생각하지 않을 것입니다. 그것은 필요한만큼 비늘만큼 명확하고 반복 가능한 구조를 제공합니다. – MattClarke