Quand est-il approprié d'utiliser une instruction de basculement (classique)? Une telle utilisation est-elle recommandée et encouragée ou devrait-elle être évitée à tout prix?
switch-statement
shabunc
la source
la source
Réponses:
Voici un exemple où cela serait utile.
Ce genre de chose (où un cas inclut l'autre) est plutôt rare, je pense, c'est pourquoi certaines langues plus récentes ne permettent pas la substitution ou nécessitent une syntaxe spéciale pour cela.
la source
// INTENTIONAL FALL THROUGH HERE
commentaire tout en majuscules requis .GetItemsForLevel(Info)
appelGetItemsForLevel(Warning)
, etc.Je les utilise lorsque certaines fonctionnalités doivent être appliquées pour plusieurs valeurs. Par exemple, supposons que vous ayez un objet avec une propriété appelée operationCode. Si le code est égal à 1, 2, 3 ou 4, vous souhaitez démarrer OperationX (). Si c'est 5 ou 6, vous voulez démarrerOperationY () et 7 vous démarrezOperationZ (). Pourquoi avoir 7 cas complets avec des fonctionnalités et des pauses lorsque vous pouvez utiliser des raccourcis
Je pense que c'est complètement valable dans certaines situations, surtout si cela évite 100 déclarations if-else. =)
la source
switch
avec plusieurscase
s liés au même code. C'est différent d'une erreur, où l'exécution de l'un secase
poursuit dans le suivant en raison de l'absence d'unbreak
entre eux.Je les ai utilisés de temps en temps, je pense que c'est toujours une utilisation appropriée - mais seulement lorsqu'ils sont inclus avec le commentaire approprié.
la source
Les cas de chute sont parfaitement bien. Je trouve souvent qu'une énumération est utilisée dans de nombreux endroits et que lorsque vous n'avez pas besoin de différencier certains cas, il est plus facile d'utiliser la logique de substitution.
Par exemple (notez les commentaires explicatifs):
Je trouve ce type d'utilisation parfaitement acceptable.
la source
case X: case Y: doSomething()
etcase X: doSomething(); case Y: doAnotherThing()
. Dans le premier, l'intention est assez explicite, tandis que dans le second, la chute peut être intentionnelle ou non. D'après mon expérience, le premier exemple ne déclenche jamais aucun avertissement dans les compilateurs / analyseurs de code, tandis que le second le fait. Personnellement, je n'appellerais le deuxième exemple que "tomber" - mais je ne suis pas sûr d'une définition "officielle".Ça dépend de:
Les deux principaux problèmes associés au fait de laisser un cas passer au suivant sont les suivants:
Cela rend votre code dépendant de l'ordre des déclarations de cas. Ce n'est pas le cas si vous ne vous trompez jamais, et cela ajoute un degré de complexité souvent indésirable.
Il n'est pas évident que le code d'un cas inclut le code d'un ou de plusieurs cas ultérieurs.
Certains endroits interdisent explicitement de passer. Si vous ne travaillez pas dans un tel endroit, et si vous êtes à l'aise avec la pratique, et si la violation du code en question ne causera aucune souffrance réelle, ce ne sera peut-être pas la pire chose au monde. Si vous le faites, assurez-vous de mettre un commentaire accrocheur à proximité pour avertir ceux qui viendront plus tard (y compris l'avenir).
la source
Voici un exemple rapide (certes incomplet (pas de traitement spécial de l'année bissextile)) de chute qui me simplifie la vie:
la source
Si je ressens le besoin de passer d'un cas à l'autre (rare, certes), je préfère être très explicite et
goto case
, bien sûr, cela suppose que votre langue le supporte.Parce que tomber à travers est si rare et très facile à ignorer lors de la lecture de code, je pense qu'il est approprié d'être explicite - et un goto, même s'il s'agit d'un cas, devrait se démarquer comme un pouce endolori.
Cela permet également d'éviter les bogues qui peuvent survenir lors de la réorganisation des instructions de cas.
la source