web-dev-qa-db-fra.com

Java commutateurs: avec ou sans accolades?

Considérez les deux extraits suivants, avec des accolades:

switch (var) {
  case FOO: {
    x = x + 1;
    break;
  }

  case BAR: {
    y = y + 1;
    break;
  }
}

Sans bretelles:

switch (var) {
  case FOO:
    x = x + 1;
    break;

  case BAR:
    y = y + 1;
    break;
}

Je sais que, dans l'extrait d'accolades, une nouvelle étendue est créée en enfermant chaque cas entre accolades. Cependant, si chaque cas n'a pas besoin de la nouvelle portée (c'est-à-dire qu'aucun nom de variable n'est réutilisé), y a-t-il une sorte de pénalité de performance pour l'utilisation des accolades avec un cas?

79
cdmckay

existe-t-il une sorte de pénalité de performance pour l'utilisation des accolades avec un étui?

Aucun.

Les accolades sont là pour aider le compilateur à déterminer la portée d'une variable, d'une condition, d'une déclaration de fonction, etc. Cela n'affecte pas les performances d'exécution une fois le code compilé dans un exécutable.

89
MrValdez

Aucune pénalité de performance du point de vue de l'exécution.

Légère pénalité de performance du point de vue de la compilation, car il y a plus à analyser, mais si quelqu'un était réellement préoccupé par cela, il devrait écrire son code sur une seule ligne :-)

Et maintenant, pour la partie opinion de notre article ... Je mets toujours les {et} parce qu'il y a une pénalité pour la maintenabilité dans la mesure où vous devrez probablement les mettre à une date ultérieure, et cela peut être pénible de les mettre plus tard ... mais c'est 103% de préférence personnelle.

20
TofuBeer

Ceci est un exemple extrême d'optimisation prématurée. Il serait préférable de se soucier de la manière la plus facile à lire et à déboguer.

19
tsimon

Comme nous le savons, les accolades pour les boîtiers de commutation ne sont pas nécessaires. L'utilisation d'accolades peut entraîner une confusion quant à la portée d'un incident.

Une accolade ouvrante est généralement associée à quelque chose de significatif comme le début d'une fonction ou le début d'une boucle ou le début d'une déclaration de classe ou le début de l'initialisation d'un tableau, etc. déclaration. Ainsi, l'utilisation d'accolades semble impliquer l'idée d'un cas différent pour un lecteur ignorant. Donc, il vaut mieux éviter d'utiliser des accolades pour une meilleure lisibilité de la programmation.

c'est-à-dire quand j'ai quelque chose comme,

switch(i)
{
  case 1 :
  {
     //do something
  }
  System.out.println("Hello from 1");

  case 2: 
  ....
}

"Bonjour de 1" est imprimé. Mais l'utilisation d'une accolade peut suggérer à un lecteur ignorant que le cas se termine par '}', sachant déjà ce que les accolades signifient généralement en cas de boucles, de méthodes, etc.

Comme nous avons des instructions de saut d'étiquette en "C", le contrôle passe simplement à la casse et continue son exécution. Donc, avec cette compréhension, c'est juste une mauvaise pratique d'utiliser des accolades lors de l'écriture de cas pour le commutateur.

Techniquement parlant, vous pouvez entourer n'importe quel bloc de votre code avec une paire supplémentaire d'accolades lorsqu'il est utilisé avec une syntaxe valide. Utiliser des accolades dans le commutateur me semble si mauvais au moins qu'il semble donner une sensation différente comme je l'ai dit ci-dessus.

Ma suggestion: évitez simplement d'utiliser des accolades environnantes pour les boîtiers de commutation.

12
Real Red.

Avec bretelles.

Il y a tellement de choses qui peuvent mal tourner avec les instructions switch que j'essaie de les éviter où je peux, c'est-à-dire.

  1. Oublier les pauses et ainsi avoir des retombées de cas
  2. Oublier un cas par défaut et donc ne pas attraper une condition non traitée
  3. Réutilisation accidentelle de variables entre les déclarations de cas, ou pire encore, affectant une variable qui IS partage une variable entre les déclarations de cas.

L'utilisation d'accolades est un moyen d'empêcher le partage intentionnel et accidentel de variables entre les déclarations de cas

9
jklp

Cette question va probablement être clôturée comme "argumentative" (BRACE WAR!) Mais bon sang. J'aime vraiment les accolades après les cas. Pour moi, cela fait ressembler la syntaxe de commutateur laide au reste des constructions de langage. (Il n'y a pas de pénalité pour l'utilisation d'accolades dans ce "cas")

5
Andy White

Vous dites que les accolades peuvent être omises car aucun nom de variable n'est réutilisé. En réutilisant les noms de variables, je suppose que vous entendez déclarer une nouvelle variable du même type.

Les accolades sont en fait les plus utiles pour vous assurer de ne pas réutiliser la même variable dans différents cases par erreur. Ils ne déclarent aucune variable aujourd'hui, mais quelqu'un les ajoutera demain et sans les accolades, le code est sujet aux erreurs.

5
Miserable Variable

Je n'utiliserais pas d'accolades pour les boîtiers de commutation.

  • L'instruction switch semble déjà assez baroque sans accolades.

  • Les boîtiers de commutation doivent être très courts. Lorsque vous devez déclarer des variables, c'est un signe que vous le faites mal.

Maintenant, nous allons conserver un code C hérité qui propose des boîtiers de commutation de plus de 500 lignes ...

3
starblue

Je n'y avais jamais pensé auparavant. Je n'ai jamais eu besoin des accolades dans une clause case, donc je ne vois pas vraiment pourquoi vous en auriez besoin. Personnellement, je ne vais pas pour l'idée "Ce sera plus facile à maintenir", ce sont juste des ordures, ce sera plus facile à maintenir si le code a du sens et est documenté.

Pas d'accolades ... moins de syntaxe, c'est plus

1
Gareth Davis