2013-07-09 6 views
0

가독성과 유지 보수성을 높이기 위해 아래 코드를 리팩터링하거나 다시 작성할 수 있습니까? 두 개의 주 가지가 있고 각 가지에 3 가지 옵션과 3 가지 하위 옵션이있는 동일한 if-else 체인이 있습니다. 전체 나는 9 개의 다른 기능을 실행할 수있는 9 leafs 있습니다.Javascript/NodeJs optimization if-else

function selectFunctionToRun(){ 
    if (isFirstOption()) { 
     if(isAlpha()){ 
      if(isXRay()){ 
       do1(); 
      }else if (isYankee()){ 
       do2(); 
      }else if (isZebra()){ 
       do3(); 
      } 
     }else if (isBeta()){ 
      if(isXRay()){ 
       do4(); 
      }else if (isYankee()){ 
       do5(); 
      }else if (isZebra()){ 
       do6(); 
      } 
     }else if (isCharlie()){ 
      if(isXRay()){ 
       do7(); 
      }else if (isYankee()){ 
       do8(); 
      }else if (isZebra()){ 
       do9(); 
      } 
     } 
    } 
    else if(isSecondOption(){ 
     if(isAlpha()){ 
      if(isXRay()){ 
       do11(); 
      }else if (isYankee()){ 
       do12(); 
      }else if (isZebra()){ 
       do13(); 
      } 
     }else if (isBeta()){ 
      if(isXRay()){ 
       do14(); 
      }else if (isYankee()){ 
       do15(); 
      }else if (isZebra()){ 
       do16(); 
      } 
     }else if (isCharlie()){ 
      if(isXRay()){ 
       do17(); 
      }else if (isYankee()){ 
       do18(); 
      }else if (isZebra()){ 
       do19(); 
      } 
     } 
    } 
} 

미리 감사드립니다.

+0

'isFirstOption()','isSecondOption()'의 값이 동적이라고 가정하고 있습니다. 맞습니까? – jrthib

+0

그 18 가지 기능은 실제로 서로 다른 것입니까? – Bergi

+0

답장을 보내 주셔서 감사합니다. 이 질문에 대한 대답은 예와 예입니다. 내 진짜 프로젝트에는 4 가지 옵션과 36 가지 기능이 있습니다. 예를 들어 두 가지 옵션 만 썼습니다. – NodeJsBeginner

답변

4

글쎄, 이것은 더 간결하지만, 당신에게 그만한 가치가 있는지 확신 할 수 없습니다. 옵션이 하나도 없으면 각 경우에 약간의 복잡성이 추가되었습니다. 그 중 하나가 보장되면 전체 "중단"논리를 피할 수 있습니다.

var functionMap = { 
    firstOption: { 
     alpha: { xRay: do1, yankee: do2, zebra: do3 }, 
     beta: { xRay: do4, yankee: do5, zebra: do6 }, 
     charlie: { xRay: do7, yankee: do8, zebra: do9 } 
    }, 
    secondOption: { 
     alpha: { xRay: do11, yankee: do12, zebra: do13 }, 
     beta: { xRay: do14, yankee: do15, zebra: do16 }, 
     charlie: { xRay: do17, yankee: do18, zebra: do19 } 
    } 

}; 

function selectFunctionToRun() { 
    var option = (isFirstOption()) ? "firstOption" : (isSecondOption()) ? "secondOption" : "abort"; 
    var abc = (isAlpha()) ? "alpha" : (isBeta()) ? "beta" : (isCharlie()) ? "charlie" : "abort"; 
    var xyz = (isXRay()) ? "xRay" : (isYankee()) ? "yankee" : (isZebra()) ? "zebra" : "abort"; 
    if (option != "abort" && abc != "abort" && xyz != "abort") { 
     functionMap[option][abc][xyz].call(); 
    } 
} 
+0

'isX' 함수는'option','abc'와'xyz' 값을 직접 반환하도록 단순화 될 수 있습니다. 그래서 +1 :-) – Bergi

+0

@Bergi Thanks. 네, 적어도이 예제에서는 단일 데이터 멤버의 값을보고 싶은 것처럼 들리지만 NodeJsBeginner에 추가 된 복잡성에 대한 이유가 있어야한다고 생각했습니다. –

+0

감사! 이 솔루션은 명확하고 간결합니다. – NodeJsBeginner

1

당신은 아마도 구조 조정을 할 수 귀하의 경우/다른 더 이런 일에/ELSEIF 구조 :

var cases = { 
    1: do1, 
    2: do2, 
    3: do3 
}; 

if (cases[something]) { 
    cases[something](); 
} 

소스 : How to avoid switch case syndrome

+0

답장을 보내 주셔서 감사합니다. 죄송 합니다만, 분명하지 않습니다. – NodeJsBeginner

+0

Scott이 위에 게시 한 것과 비슷합니다. 그의 대답은 훨씬 자세하다. 스캇 소품. – jrthib

1

대안 + 스콧의 솔루션

var functionMap = { 
    _1AX: do1, _1AY: do2, _1AZ: do3, 
    _1BX: do4, _1BY: do5, _1BZ: do6, 
    _1CX: do7, _1CY: do8, _1CZ: do9, 

    _2AX: do11, _2AY: do12, _2AZ: do13, 
    _2BX: do14, _2BY: do15, _2BZ: do16, 
    _2CX: do17, _2CY: do18, _2CZ: do19 
    } 

function selectFunctionToRun() { 
    var index = (isFirstOption() ? '_1' : isSecondOption() ? '_2' : '') + 
       (isAlpha() ? 'A' : isBeta() ? 'B' : isCharlie() ? 'C' : '') + 
       (isXRay() ? 'X' : isYankee() ? 'Y' : isZebra() ? 'Z' : ''; 

    (functionMap [index] || function error() { ... }) (index); 

처리기의 이름을 f로하면 functionMap을 제거 할 수 있습니다. 재산 이름에 따라 재산.