Czy w JavaScript JavaScript powrót z instrukcji switch jest lepszą praktyką niż używanie break?

198

Opcja 1 - zmiana za pomocą return:

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

        default: return "";
    }    
}

Opcja 2 - przełączanie za pomocą break:

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

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

        case 2: 
            retVal = "Two";
            break;

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

    return retVal;
}

Wiem, że oba działają, ale czy jest to jedna z najlepszych praktyk? Zwykle podoba mi się Opcja 1 - przełączanie za pomocą return najlepiej, ponieważ jest czystsze i prostsze.


Oto jsFiddle mojego konkretnego przykładu wykorzystującego technikę wymienioną w komentarzach @ ic3b3rg :

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;
}

Aby wywołać funkcję, zrobiłbym to w następujący sposób:

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

Problem w tym, że zawsze zwraca wartość niezdefiniowaną. Zgaduję, że dzieje się tak, ponieważ przekazuje rzeczywistą wartość literału obiektu, a nie właściwości. Co mam zrobić, aby to naprawić za pomocą techniki opisanej w komentarzach @ ic3b3rg ?

Code Maverick
źródło
4
+1 Dobre pytanie. Zastanawiałem się nad tym sam i choć wiem, że po prostu powraca, nie wiem, czy to najlepsza praktyka. Ciekawe, co myśli społeczność.
Eli

Odpowiedzi:

266

Przerwa pozwoli ci kontynuować przetwarzanie w funkcji. Samo wyjście z przełącznika jest w porządku, jeśli to wszystko, co chcesz zrobić w funkcji.

ic3b3rg
źródło
6
Biorąc pod uwagę przykład w moim pytaniu, odpowiedź brzmi: tak. Ale jeśli masz funkcję, w której musisz iść dalej, oczywiście skorzystasz z przerwy.
Code Maverick
9
Odpowiedź Mark Costello sprawiła, że ​​jeszcze bardziej dziękuję za twoje pytanie. Myślę, że szukasz ogólnych wytycznych dotyczących „najlepszych praktyk”, ale w konkretnym podanym przez Ciebie przykładzie najlepszą praktyką jest return {1:"One",2:"Two,3:"Three"}[opt];. Jeśli potrzebujesz domyślnej wartości, będzie tovar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg
@ ic3b3rg - Zredagowałem moje pytanie w moim konkretnym przykładzie, próbując wykorzystać twoją technikę return (opt in o) ? o[opt] : "";, ale zawsze zwraca wartość domyślną w moim konkretnym przypadku.
Code Maverick
Nastąpiła pomyłka w moim kodu (brakuje 2nd "w "Two"), ale to działa na mnie ... Oto prosty test:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg
Nie użyłem twojego przykładu, tylko technikę. Spójrz na moje pytanie i kliknij link do mojego jsFiddle, aby zobaczyć, o czym mówię.
Code Maverick
9

To zależy, jeśli twoja funkcja składa się tylko z instrukcji switch, to myślę, że jest w porządku. Jeśli jednak chcesz wykonać inne operacje w ramach tej funkcji, prawdopodobnie nie jest to świetny pomysł. Być może będziesz musiał rozważyć swoje wymagania teraz, a nie w przyszłości. Jeśli chcesz zmienić swoją funkcję z opcji pierwszej na drugą, konieczne będzie dodatkowe refaktoryzowanie.

Biorąc jednak pod uwagę, że w ramach instrukcji if / else najlepszą praktyką jest wykonanie następujących czynności:

var foo = "bar";

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

Na tej podstawie można wysunąć argument, że pierwszą opcją jest lepsza praktyka.

Krótko mówiąc, nie ma jednoznacznej odpowiedzi, więc dopóki twój kod jest zgodny ze spójnym, czytelnym i łatwym do utrzymania standardem - to znaczy nie mieszaj i nie dopasowuj opcji jeden i dwa w całej aplikacji, to najlepsza praktyka, którą powinieneś być następujący.

Mark Costello
źródło
2
Najlepszą praktyką w tym przykładzie jestreturn foo == "bar";
ic3b3rg
10
Przepraszam, jeśli cię denerwuję, ale w takim razie nadal uprościłem: return foo == "bar" ? 0 : 100;a nawet return [100,0][foo == "bar"];.
ic3b3rg
4
@ ic3b3rg - Nie powinno to być: return [100,0][+(foo == "bar")]; ?
Kolejka
3
@Queue Masz rację, bo wartość logiczna powinna zostać przekonwertowana na liczbę całkowitą, ale zrobiłbym to w ten sposób:return [100,0][foo == "bar" & 1];
ic3b3rg
7
@ ic3b3rg && Queue - Jak chcesz zachować czyjś kod za pomocą takich sztuczek? (Ufaj prekompilatorowi w optymalizacji takich rzeczy)
T4NK3R,