En JavaScript, le retour d'une instruction switch est-il considéré comme une meilleure pratique que l'utilisation de break?

198

Option 1 - commutation à l'aide du retour:

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

        default: return "";
    }    
}

Option 2 - commutation à l'aide de la pause:

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

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

        case 2: 
            retVal = "Two";
            break;

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

    return retVal;
}

Je sais que les deux fonctionnent, mais est-ce une des meilleures pratiques? J'ai tendance à aimer l'option 1 - changer en utilisant le meilleur retour, car c'est plus propre et plus simple.


Voici un jsFiddle de mon exemple spécifique utilisant la technique mentionnée dans les commentaires 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;
}

Pour appeler la fonction, je le ferais de la manière suivante:

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

Le problème ici est qu'il renvoie toujours indéfini. Je suppose que c'est parce qu'il transmet la valeur réelle de l'objet littéral et non de la propriété. Que dois-je faire pour résoudre ce problème en utilisant la technique décrite dans les commentaires de @ ic3b3rg ?

Code Maverick
la source
4
+1 Bonne question. Je me suis posé cette question moi-même, et bien que je sache que cela fonctionne pour revenir, je ne sais pas si c'est la meilleure pratique. Curieux de voir ce que pense la communauté.
Eli

Réponses:

266

Une pause vous permettra de poursuivre le traitement dans la fonction. Le simple fait de revenir du commutateur est correct si c'est tout ce que vous voulez faire dans la fonction.

ic3b3rg
la source
6
Donc, étant donné l'exemple de ma question, la réponse est oui. Mais, si vous avez une fonction où vous devez continuer, évidemment une pause serait ce que vous utiliseriez.
Code Maverick
9
La réponse de @Mark Costello m'a fait remercier un peu plus pour votre question. Je pense que vous cherchez une directive générale sur les «meilleures pratiques», mais dans l'exemple spécifique que vous avez donné, la meilleure pratique est return {1:"One",2:"Two,3:"Three"}[opt];. Si vous avez besoin de la valeur par défaut, ce seraitvar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg
@ ic3b3rg - J'ai édité ma question avec mon exemple spécifique en essayant d'utiliser votre technique return (opt in o) ? o[opt] : "";, mais elle renvoie toujours la valeur par défaut dans mon cas spécifique.
Code Maverick
Il y avait une faute de frappe dans mon code (il manque le 2ème "dans "Two") mais ça marche pour moi ... voici un test simple:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg
Je n'utilisais pas votre exemple, juste la technique. Regardez ma question et cliquez sur le lien vers mon jsFiddle pour voir de quoi je parle.
Code Maverick
9

Cela dépend, si votre fonction se compose uniquement de l'instruction switch, alors je pense que ça va. Cependant, si vous souhaitez effectuer d'autres opérations dans cette fonction, ce n'est probablement pas une excellente idée. Vous devrez peut-être également tenir compte de vos besoins dès maintenant par rapport à l'avenir. Si vous souhaitez changer votre fonction de l'option un à l'option deux, plus de refactoring sera nécessaire.

Cependant, étant donné que dans les instructions if / else, il est recommandé de procéder comme suit:

var foo = "bar";

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

Sur cette base, on pourrait avancer que la première option est une meilleure pratique.

En bref, il n'y a pas de réponse claire, donc tant que votre code adhère à une norme cohérente, lisible et maintenable - c'est-à-dire ne mélangez pas les options une et deux dans votre application, c'est la meilleure pratique que vous devriez être Suivant.

Mark Costello
la source
2
La meilleure pratique dans cet exemple estreturn foo == "bar";
ic3b3rg
10
Je m'excuse si je vous agace mais dans ce cas je simplifierais return foo == "bar" ? 0 : 100;quand même : ou même return [100,0][foo == "bar"];.
ic3b3rg
4
@ ic3b3rg - ne devrait - il être: return [100,0][+(foo == "bar")]; ?
File d'attente du
3
@Queue Vous avez raison, le booléen devrait être converti en entier, mais je le ferais de cette façon:return [100,0][foo == "bar" & 1];
ic3b3rg
7
@ ic3b3rg && Queue - Comment aimeriez-vous conserver le code de quelqu'un d'autre en utilisant de telles astuces? (Faites confiance au précompilateur pour optimiser des choses comme ça)
T4NK3R