web-dev-qa-db-fra.com

Si les déclarations contre les cas de commutation? dans un jeu JavaScript et si vous souhaitez utiliser une fonction

Je développe un jeu en JavaScript où vous commencez avec une entrée utilisateur, stockée dans la variable "contrôleur". Les options pour l'utilisateur consistent à commencer à démarrer le jeu ou à en savoir plus sur le jeu. J'allais utiliser le code suivant

if(controller === "start"){
    // Game code sitting here
}
else if(controller === "about"){
    // All about the Game
}
else{
    // Tells the user again to type start to start or about to learn about the game
}

quand j'ai réalisé que je devrais peut-être utiliser des boîtiers de commutation à la place ...

Donc, ma question est de savoir quand utiliser les cas de commutation au lieu des instructions if et que je devrais utiliser dans ce cas. Je voudrais également savoir si vous pensez que je devrais stocker mon code de jeu dans une fonction et l'appeler si le contrôleur est égal à "start" ou simplement le placer dans le cas de l'instruction/switch if comme il est atm?

8
Ben Watkins

Quand utiliser les instructions switch au lieu des instructions if?

Utilisez switch au lieu de if lorsque:

  1. Vous comparez plusieurs conditions possibles d'une expression et l'expression elle-même n'est pas triviale.
  2. Vous avez plusieurs valeurs qui peuvent nécessiter le même code.
  3. Vous avez certaines valeurs qui nécessiteront essentiellement toute l'exécution d'une autre valeur, plus seulement quelques instructions.

Utilisez if au lieu de switch lorsque:

  1. Vous voulez tester la véracité d'une expression.
  2. Vous n'avez qu'un seul test affirmatif.
  3. Vous devez évaluer différentes expressions pour chaque branche.

que je devrais utiliser dans ce cas?

Celui avec lequel vous êtes le plus à l'aise. Pour une évaluation de moteur d'état, vous gagneriez un peu de flexibilité avec une instruction switch, dans la mesure où vous pourriez ajouter un peu plus facilement ces derniers. Mais la différence est trop mineure pour être importante.

Dois-je [je] stocker mon code de jeu dans des fonctions [séparées], ou simplement le placer dans le boîtier if statement/switch comme il est atm?

Vous devez absolument déplacer le code interne de chaque branche vers des fonctions distinctes. Vous ne pouvez pas facilement tester à l'unité la fonctionnalité si elle se trouve au milieu d'une fonction de mille lignes.

11
DougM

Sémantique, sémantique, sémantique.

Personnellement, dans une situation comme celle-ci, je fais un jugement pour savoir lequel sera plus facile à comprendre.

Ce qui influence la facilité de compréhension, encore une fois, à mon avis, est peut-être une combinaison de plusieurs facteurs:

  1. Collectivement exhaustif - Existe-t-il un moyen spécifique de gérer chaque valeur juridique? Si c'est le cas, un interrupteur peut être en ordre.
  2. Dépendance/exclusivité mutuelle - Certaines conditions dépendent-elles les unes des autres? Si tel est le cas, une instruction if peut être plus flexible.
  3. Plus de 2 cas - le commutateur/cas a une surcharge cognitive pour moi, donc je serais ennuyé de voir un commutateur/cas pour vrai/faux. Peut-être parce que if (x) { } else { } est plus maigre.
  4. Dans quelle mesure les actions sont-elles similaires? Font-ils partie du même domaine? Si un cas définit ou retourne une variable, tandis qu'un autre cas exécute une fonction qui mute un état et qu'un autre cas imprime/produit une information, je n'en ferais pas un cas car les cas ne sont pas du tout liés. Cependant, s'ils activent tous une sélection de menu et exécutent une fonction différente à l'étape suivante, c'est un bon commutateur car tous les cas choisissent une "étape suivante".

Les deux premiers, collectivement exhaustifs et mutuellement exclusifs, viennent à moi en pensant à un interrupteur physique. Disons que j'ai un interrupteur qui peut être dans 5 états. Pour être vraiment un commutateur, il ne peut être que dans un seul état à un moment donné. Il ne peut jamais ne pas avoir d'État et il ne peut pas coexister avec un autre État. Dans le logiciel, cela revient à dire que pour toute entrée, au moins une des déclarations de cas doit correspondre (y compris la valeur par défaut).

Encore une fois, c'est ma préférence personnelle. Je ne sais pas s'il existe une directive officielle à ce sujet.

5
Brandon

Les cas s'adaptent bien à cette opération. Vous pouvez également instancier un dictionnaire singleton, puis le remplir avec toutes les fonctions que vous auriez besoin du contrôleur pour exécuter, puis parcourir simplement le dictionnaire chaque fois que le contrôleur est activé.

Utiliser if/then s'avérerait problématique car il serait beaucoup plus difficile à maintenir qu'une déclaration de cas ou un dictionnaire.

0
World Engineer