JavaScript에서 break 문을 사용하는 것보다 switch 문을 반환하는 것이 더 나은 방법으로 간주됩니까?


198

옵션 1-리턴을 사용하여 전환 :

function myFunction(opt) 
{
    switch (opt) 
    {
        case 1: return "One";
        case 2: return "Two";
        case 3: return "Three";

        default: return "";
    }    
}

옵션 2-중단을 사용하여 전환 :

function myFunction(opt) 
{
    var retVal = "";

    switch (opt) 
    {
        case 1: 
            retVal = "One";
            break;

        case 2: 
            retVal = "Two";
            break;

        case 3: 
            retVal = "Three";
            break;
    }

    return retVal;
}

나는 두 가지가 모두 작동한다는 것을 알고 있지만 가장 좋은 방법 중 하나입니까? 나는 옵션 1을 선호하는 경향이 있습니다-더 깨끗하고 간단하기 때문에 return return을 사용하십시오.


다음은 @ ic3b3rg의 의견에 언급 된 기술을 사용하는 특정 예제의 jsFiddle입니다 .

var SFAIC = {};

SFAIC.common = 
{
    masterPages: 
    {
        cs: "CS_",
        cp: "CP_"
    },

    contentPages: 
    {
        cs: "CSContent_",
        cp: "CPContent_"    
    }
};

function getElementPrefix(page) 
{
    return (page in SFAIC.common.masterPages)
        ? SFAIC.common.masterPages[page]
        : (page in SFAIC.common.contentPages)
            ? SFAIC.common.contentPages[page]
            : undefined;
}

함수를 호출하려면 다음과 같은 방법으로 수행하십시오.

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);

여기서 문제는 항상 정의되지 않은 값을 반환한다는 것입니다. 속성이 아닌 객체 리터럴의 실제 값을 전달하기 때문이라고 생각합니다. @ ic3b3rg의 의견에 설명 된 기술을 사용 하여이 문제를 해결하려면 어떻게해야 합니까?


4
+1 좋은 질문입니다. 나는 이것을 스스로 궁금해했고, 그것이 돌아 오는 것이 효과가 있다는 것을 알고는 있지만 그것이 최선의 방법인지는 모른다. 커뮤니티가 어떻게 생각하는지 궁금합니다.
— Eli

답변:


266

중단하면 함수에서 계속 처리 할 수 ​​있습니다. 그것이 기능에서하고 싶은 모든 것이라면 스위치에서 나가는 것이 좋습니다.


6
내 질문에 예를 들어 대답은 '예'입니다. 그러나 계속 진행해야 할 기능이 있다면 분명히 브레이크가 사용됩니다.
— Code Maverick

9
@Mark Costello의 답변으로 귀하의 질문에 대해 조금 더 감사드립니다. 일반적인 '모범 사례'가이드 라인을 찾고 있다고 생각하지만 구체적인 예를 들면 다음과 같습니다 return {1:"One",2:"Two,3:"Three"}[opt];. 기본값이 필요한 경우var o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
— ic3b3rg

@ ic3b3rg-의 기술을 활용하려는 특정 예제로 내 질문을 편집 return (opt in o) ? o[opt] : "";했지만 항상 특정 경우 기본값을 반환합니다.
— Code Maverick

내 코드에 오타가 있었지만 ( 2 번째 "를 "Two"var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
— 놓치다)

나는 당신의 예제를 사용하지 않고 단지 기술을 사용했습니다. 내 질문을보고 내 jsFiddle에 대한 링크를 클릭하여 내가 말하는 내용을 확인하십시오.
— Code Maverick

9

그것은 당신의 함수가 switch 문으로 만 구성되어 있다면 그것이 좋다고 생각합니다. 그러나 해당 기능 내에서 다른 작업을 수행하려는 경우 좋은 생각이 아닙니다. 또한 현재와 미래의 요구 사항을 고려해야 할 수도 있습니다. 기능을 옵션 1에서 옵션 2로 변경하려면 더 많은 리팩토링이 필요합니다.

그러나 if / else 문 내에서 다음을 수행하는 것이 가장 좋습니다.

var foo = "bar";

if(foo == "bar") {
    return 0;
}
else {
    return 100;
}

이를 바탕으로 옵션 1을 사용하는 것이 더 좋습니다.

요컨대, 코드가 일관되고 읽기 쉽고 유지 관리 가능한 표준을 준수하는 한, 즉 응용 프로그램 전체에서 옵션 1과 2를 혼합하여 일치시키지 않는 것이 가장 좋습니다. 수행원.


2
이 예에서 가장 좋은 방법은return foo == "bar";
— ic3b3rg

10
: 나는 성가신 해요 경우가 있지만, 그 경우에 나는 아직도 단순화 것 사과 return foo == "bar" ? 0 : 100;또는 return [100,0][foo == "bar"];.
— ic3b3rg

4
@ ic3b3rg-그렇지 않아야합니다 : return [100,0][+(foo == "bar")]; ?
— 큐

3
@Queue 부울을 정수로 변환해야한다는 것이 맞지만, 다음과 같이하면됩니다 :return [100,0][foo == "bar" & 1];
— ic3b3rg

7
@ ic3b3rg && Queue-그러한 속임수를 사용하여 다른 사람의 코드를 어떻게 유지 하시겠습니까? (프리 컴파일러를 사용하여 속도를 최적화하십시오)
— T4NK3R
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.