256 votes

Est-ce que le fait de sortir d'une instruction switch est considéré comme une meilleure pratique que l'utilisation de break ?

Option 1 - commutation avec retour :

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

        default: return "";
    }    
}

Option 2 - changer en utilisant 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 l'une d'elles constitue-t-elle une meilleure pratique ? J'ai tendance à préférer l'option 1 - basculer en utilisant le retour, car elle 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 procéderais 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 retourne toujours undefined. Je suppose que c'est parce qu'il passe la valeur réelle de l'objet littéral et non la propriété. Que dois-je faire pour résoudre ce problème en utilisant la technique décrite dans le document @ic3b3rg's des commentaires ?

326voto

ic3b3rg Points 3755

Une pause vous permettra de poursuivre le traitement dans la fonction. Il suffit de sortir du switch si c'est tout ce que vous voulez faire dans la fonction.

8 votes

Donc, dans l'exemple de ma question, la réponse est oui. Mais, si vous avez une fonction où vous devez continuer, il est évident que vous utiliserez une pause.

12 votes

La réponse de @Mark Costello m'a fait réfléchir un peu plus à votre question. Je pense que vous recherchez un guide général de "meilleures pratiques", mais dans l'exemple spécifique que vous avez donné, la meilleure pratique est la suivante return {1:"One",2:"Two,3:"Three"}[opt]; . Si vous avez besoin de la valeur par défaut, ce sera var o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";

0 votes

@ic3b3rg - J'ai modifié ma question en y ajoutant mon exemple spécifique, en essayant d'utiliser votre technique d'analyse de l'environnement. return (opt in o) ? o[opt] : ""; mais il renvoie toujours la valeur par défaut dans mon cas particulier.

21voto

MiXT4PE Points 400

Ni l'un ni l'autre, car les deux sont très verbeux pour une tâche très simple. Tu peux juste le faire :

const result = ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[opt] ?? 'Default'    // opt can be 1, 2, 3 or anything (default)

Bien entendu, cela fonctionne également avec les chaînes de caractères, un mélange des deux ou sans cas par défaut :

const result = ({
  'first': 'One',
  'second': 'Two',
  3: 'Three'
})[opt]                // opt can be 'first', 'second' or 3

Explication :

Il fonctionne en créant un objet dont les options/cas sont les clés et les résultats les valeurs. En mettant l'option entre parenthèses, vous accédez à la valeur de la clé qui correspond à l'expression via la notation entre parenthèses.

Ce retour undefined si l'expression entre parenthèses n'est pas une clé valide. Nous pouvons détecter ce cas indéfini en utilisant la fonction opérateur de coalescence nul ?? et renvoie une valeur par défaut.

Ejemplo:

console.log('Using a valid case:', ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[1] ?? 'Default')

console.log('Using an invalid case/defaulting:', ({
  1: 'One',
  2: 'Two',
  3: 'Three'
})[7] ?? 'Default')

.as-console-wrapper {max-height: 100% !important;top: 0;}

1 votes

Comment s'appelle cette méthode ?

2 votes

@SouravSingh Je ne pense pas qu'il ait un nom. Je l'ai juste inventé quand je n'étais pas satisfait des solutions proposées ici. Je pense que je l'appellerais quelque chose comme "changement d'objet".

0 votes

@SouravSingh Je pense que cette technique s'appelle l'utilisation de la recherche "object literals", voir : 30secondsofcode.org/articles/s/javascript-switch-object

9voto

Mark Costello Points 1662

Cela dépend, si votre fonction consiste uniquement en l'instruction switch, alors je pense que c'est bon. Cependant, si vous voulez effectuer d'autres opérations dans cette fonction, ce n'est probablement pas une bonne idée. Vous devez également tenir compte de vos besoins actuels et futurs. Si vous voulez faire passer votre fonction de l'option 1 à l'option 2, il faudra procéder à un remaniement plus poussé.

Cependant, étant donné que dans les instructions if/else, la meilleure pratique consiste à faire ce qui suit :

var foo = "bar";

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

Sur cette base, on peut affirmer que la première option est la meilleure pratique.

En bref, il n'y a pas de réponse claire. Tant que votre code respecte une norme cohérente, lisible et maintenable - c'est-à-dire que vous ne mélangez pas les options 1 et 2 dans votre application - c'est la meilleure pratique à suivre.

2 votes

La meilleure pratique dans cet exemple est return foo == "bar";

11 votes

Je m'excuse si je vous ennuie mais dans ce cas, je simplifierais quand même : return foo == "bar" ? 0 : 100; ou même return [100,0][foo == "bar"]; .

5 votes

@ic3b3rg - Ce ne devrait pas être : return [100,0][+(foo == "bar")]; ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X