Em JavaScript, o retorno de uma instrução switch é considerado uma prática melhor do que usar break?

198

Opção 1 - alternar usando retorno:

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

        default: return "";
    }    
}

Opção 2 - alternar usando 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;
}

Sei que os dois funcionam, mas é mais uma das melhores práticas? Costumo gostar da opção 1 - alternar usando o retorno melhor, pois é mais limpo e mais simples.


Aqui está um jsFiddle do meu exemplo específico, usando a técnica mencionada nos comentários de @ 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;
}

Para chamar a função, eu o faria das seguintes maneiras:

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

O problema aqui é que ele sempre retorna indefinido. Eu estou supondo que é porque está passando o valor real do objeto literal e não a propriedade. O que eu faria para corrigir isso usando a técnica descrita nos comentários de @ ic3b3rg ?

Code Maverick
fonte
4
+1 boa pergunta. Eu mesmo me perguntei isso e, embora saiba que funciona apenas para retornar, não sei se é uma prática recomendada. Curioso para ver o que a comunidade pensa.
Eli

Respostas:

266

Uma pausa permitirá que você continue processando na função. Retornar da opção é bom se é tudo o que você deseja fazer na função.

ic3b3rg
fonte
6
Então, dado o exemplo na minha pergunta, a resposta é sim. Mas, se você tem uma função na qual precisa continuar, obviamente uma pausa seria o que você usaria.
Code Maverick
9
A resposta de @Mark Costello me fez agradecer um pouco mais sobre sua pergunta. Acho que você está procurando uma orientação geral sobre "melhores práticas", mas no exemplo específico que você deu, a melhor prática é return {1:"One",2:"Two,3:"Three"}[opt];. Se você precisa do padrão, então seriavar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg
@ ic3b3rg - editei minha pergunta com meu exemplo específico, tentando utilizar sua técnica de return (opt in o) ? o[opt] : "";, mas ela sempre retorna o padrão no meu caso específico.
Code Maverick
Houve um erro de digitação no meu código (faltando o 2º "em "Two"), mas ele trabalha para mim ... aqui está um teste simples:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg
Eu não estava usando o seu exemplo, apenas a técnica. Olhe para a minha pergunta e clique no link do meu jsFiddle para ver do que estou falando.
Code Maverick
9

Depende, se sua função consiste apenas na instrução switch, então acho que está tudo bem. No entanto, se você deseja executar outras operações nessa função, provavelmente não é uma ótima idéia. Você também pode ter que considerar seus requisitos agora e no futuro. Se você deseja alterar sua função da opção um para a opção dois, será necessária mais refatoração.

No entanto, considerando que nas declarações if / else, é uma prática recomendada fazer o seguinte:

var foo = "bar";

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

Com base nisso, pode-se argumentar que a opção 1 é a melhor prática.

Em resumo, não há uma resposta clara, desde que seu código adote um padrão consistente, legível e de manutenção - ou seja, não misture e combine as opções um e dois em todo o aplicativo, essa é a melhor prática a ser adotada. Segue.

Mark Costello
fonte
2
A melhor prática nesse exemplo éreturn foo == "bar";
ic3b3rg
10
Peço desculpas se estou incomodando você, mas, nesse caso, eu ainda simplificaria: return foo == "bar" ? 0 : 100;ou até return [100,0][foo == "bar"];.
Ic3b3rg 24/05
4
@ ic3b3rg - Não deveria ser return [100,0][+(foo == "bar")]; :?
Fila
3
@Queue você está correto em que o boolean deve ser convertido para inteiro, mas eu fazê-lo desta maneira:return [100,0][foo == "bar" & 1];
ic3b3rg
7
@ ic3b3rg && Queue - Como você deseja manter o código de outra pessoa usando esses truques? (Confiança o pré-compilador para o material de velocidade de optimizar parecido)
T4NK3R