Java-Switch-Fälle: mit oder ohne geschweifte Klammern?

85

Betrachten Sie die folgenden zwei Schnipsel mit geschweiften Klammern:

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

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

Ohne Zahnspange:

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

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

Ich weiß, dass im Snippet mit geschweiften Klammern ein neuer Bereich erstellt wird, indem jeder Fall in geschweifte Klammern eingeschlossen wird. Wenn jedoch nicht für jeden Fall der neue Bereich benötigt wird (dh keine Variablennamen wiederverwendet werden), gibt es irgendeine Leistungsbeeinträchtigung für die Verwendung der geschweiften Klammern mit einem Fall?

cdmckay
quelle

Antworten:

97

Gibt es irgendeine Art von Leistungseinbuße für die Verwendung der Zahnspange mit einem Koffer?

Keiner.

Die geschweiften Klammern sollen dem Compiler helfen, den Umfang einer Variablen, Bedingung, Funktionsdeklaration usw. herauszufinden. Sie hat keinen Einfluss auf die Laufzeitleistung, sobald der Code in eine ausführbare Datei kompiliert wurde.

MrValdez
quelle
21

Keine Leistungseinbußen aus Sicht der Ausführung.

Leichte Leistungseinbußen aus kompilierender Sicht, da es mehr zu analysieren gibt, aber wenn jemand wirklich so besorgt wäre, müsste er seinen Code in eine Zeile schreiben :-)

Und jetzt zum Meinungsteil unseres Beitrags ... Ich habe immer das {und} eingegeben, weil es eine Strafe für die Wartbarkeit gibt, da Sie sie wahrscheinlich zu einem späteren Zeitpunkt eingeben müssen, und es kann schmerzhaft sein, sie zu setzen in später ... aber das ist 103% persönliche Präferenz.

TofuBeer
quelle
Ich bin ein bisschen neugierig, da ich die Antwort selbst nicht sehen kann ... @TofuBeer, wann MÜSSEN Sie die Klammern hinzufügen? Außerdem stimme ich dem Punkt der Wartbarkeit voll und ganz zu. Ich sehe das Problem der Wartbarkeit am Geldautomaten einfach nicht. EDIT: egal. Ich habe gerade den Rest der Antworten unten gelesen.
Nyaray
In einigen Fällen ist dies in C ++ der Fall. Wenn Sie also in beiden Sprachen arbeiten, ist es keine schlechte Angewohnheit, sich darauf einzulassen.
TofuBeer
13

Wie wir wissen, sind Zahnspangen für Schalterfälle nicht erforderlich. Die Verwendung von Zahnspangen kann zu Verwirrung über den Umfang eines Falles führen.

Eine öffnende Klammer ist im Allgemeinen mit etwas Sinnvollem verbunden, wie dem Start einer Funktion oder dem Start einer Schleife oder dem Beginn der Klassendeklaration oder dem Beginn der Array-Initialisierung usw. Wir wissen, dass ein Fall aus dem Schalterblock ausbricht, wenn er auf eine Unterbrechung stößt Aussage. Die Verwendung von geschweiften Klammern scheint daher die Vorstellung eines anderen Fallbereichs für einen unwissenden Leser zu implizieren. Es ist daher besser, geschweifte Klammern zu vermeiden, um die Lesbarkeit der Programmierung zu verbessern.

dh wenn ich so etwas habe,

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

  case 2: 
  ....
}

"Hallo von 1" wird gedruckt. Die Verwendung von geschweiften Klammern kann jedoch einen unwissenden Leser darauf hinweisen, dass der Fall mit '}' endet, da er bereits weiß, was geschweifte Klammern im Allgemeinen bei Schleifen, Methoden usw. bedeuten.

Da wir in 'C' Jump-to-Label-Anweisungen haben, wechselt das Steuerelement einfach zum Fall und setzt seine Ausführung fort. Mit diesem Verständnis ist es nur eine schlechte Praxis, geschweifte Klammern zu verwenden, wenn Sie Fälle für den Wechsel schreiben.

Technisch gesehen können Sie jeden Block Ihres Codes mit einem zusätzlichen Paar geschweifter Klammern umgeben, wenn Sie ihn mit gültiger Syntax verwenden. Die Verwendung von Zahnspangen im Schalter sieht zumindest für mich so schlecht aus, dass es ein anderes Gefühl zu geben scheint, als ich oben gesagt habe.

Mein Vorschlag: Vermeiden Sie einfach die Verwendung von umgebenden Klammern für Schalterfälle.

Echtes Rot.
quelle
5
Stimme dem nicht zu. Die Verwendung von Klammern UND das Schreiben von Code außerhalb der Klammern wäre eine sehr schlechte Form, ja, aber dies diskreditiert die Verwendung von Klammern an sich nicht.
Max Roncace
12

Mit Zahnspangen.

Es gibt so viele Dinge, die mit switch-Anweisungen schief gehen können, dass ich versuche, sie zu vermeiden, wo ich kann, dh

  1. Pausen vergessen und damit Fall-Throughs haben
  2. Vergessen Sie einen Standardfall und fangen Sie damit keinen ungedeckten Zustand
  3. Versehentliches Wiederverwenden von Variablen zwischen case-Anweisungen oder noch schlimmer, was sich auf eine Variable auswirkt, die eine Variable zwischen case-Anweisungen teilt.

Die Verwendung von geschweiften Klammern ist eine Möglichkeit, um zu verhindern, dass Variablen absichtlich und versehentlich zwischen case-Anweisungen ausgetauscht werden

jklp
quelle
8
Das Einbeziehen der Punkte 1 und 2 war für diese Frage (für mich) irreführend; Ihre Schlusszeile sollte ausdrücklich sagen, dass Klammern nur 3 lösen - ich dachte, Sie meinten, dass Klammern die Notwendigkeit von Pausen ausschließen, und versuchten es dann.
Ataulm
Punkt 3 macht nicht einmal Sinn. Sie können Variablen nur wiederverwenden, wenn sie in einem übergeordneten Bereich der switch-Anweisung deklariert wurden. Das heißt, wenn Sie eine Variable in einem Fall deklarieren, kann sie nicht in einer anderen case-Anweisung verwendet werden. Wenn Sie eine Variable über der switch-Anweisung deklarieren (im übergeordneten Bereich), spielt es keine Rolle, ob Sie geschweifte Klammern verwenden oder nicht, case-Anweisungen haben Zugriff auf die Variable.
Dsingleton
Ich habe gerade (wieder) entdeckt, dass Variablen, die in Fall 1 deklariert wurden, in Fall 2 noch im Gültigkeitsbereich sein können. Beispiel: ...case 1: int a = 10; break; case 2: int a = 11; break; ...Kompiliert nicht. (getestet mit Oracle JDK 8)
anuragw
5

Diese Frage wird wahrscheinlich als "argumentativ" (BRACE WAR!) Geschlossen, aber was solls. Ich mag eigentlich die Zahnspangen nach den Fällen. Für mich sieht die hässliche Switch-Syntax eher wie der Rest der Sprachkonstrukte aus. (In diesem "Fall" gibt es keine Strafe für die Verwendung von Zahnspangen.)

Andy White
quelle
Ich denke, es ist eine Art objektive Frage ... Ich ziehe die argumentative Sache zurück
Andy White
Ich bevorzuge es ohne die Zahnspangen ... Ich finde, dass die Zahnspangen viel unnötiges Geräusch verursachen.
CDMckay
Ja, ich wünschte, es wäre eher so: case (FOO) {x = x + 1} case (BAR) {y = y + 1}
Andy White
Vernünftige Leerzeichen == schön. Unnötige Zahnspangen == saugen.
Shog9
3
Whitespace == Mischung aus Tabs und Leerzeichen == saugen (dachte nur, ich würde einen Tab vs. Space-Kommentar in die Mischung werfen)
Andy White
5

Sie sagen, die geschweiften Klammern können weggelassen werden, da keine Variablennamen wiederverwendet werden. Ich gehe davon aus, dass Sie mit der Wiederverwendung von Variablennamen eine neue Variable desselben Typs deklarieren.

Die geschweiften Klammern sind tatsächlich am nützlichsten, um sicherzustellen, dass Sie nicht versehentlich dieselbe Variable in verschiedenen cases wiederverwenden . Sie deklarieren heute keine Variablen, aber jemand wird sie morgen hinzufügen und ohne die geschweiften Klammern ist der Code fehleranfällig.

Elende Variable
quelle
3

Ich würde keine Zahnspangen für Schaltergehäuse verwenden.

  • Die switch-Anweisung sieht schon ohne geschweifte Klammern barock genug aus.

  • Schaltergehäuse sollten sehr kurz sein. Wenn Sie Variablen deklarieren müssen, ist dies ein Zeichen dafür, dass Sie es falsch machen.

Nun geht es weiter mit der Pflege eines alten C-Codes, der Fälle mit mehr als 500 Zeilen umschaltet ...

Sternenblau
quelle
1

Ich habe noch nie darüber nachgedacht. Ich habe die Klammern in einer case-Klausel nie gebraucht, kann also nicht wirklich erkennen, warum Sie sie brauchen würden. Persönlich gehe ich nicht auf die Idee "Es wird einfacher zu warten sein", das ist nur Müll, es wird einfacher zu warten sein, wenn der Code Sinn macht und dokumentiert ist.

Keine geschweiften Klammern ... weniger Syntax ist mehr

Gareth Davis
quelle
Die {und} heben die Dinge jedoch ebenfalls hervor, was das Lesen erleichtert (IMO).
TofuBeer
Jep. Ich wollte eine Geschichte über eine Methode erzählen, die ich einmal ändern musste (ich brauchte ungefähr 4 Stunden, um eine Codezeile hinzuzufügen), aber der Code war verrückt (ungefähr 10 Seiten lang und 4 Seiten breit, wenn er gedruckt wurde), also nicht der typische Fall. Aber wenn es {} verwendet hätte, hätte es eine Minute gedauert, es hinzuzufügen.
TofuBeer
Ich denke, der Punkt ist hier, dass der ursprüngliche Programmierer, wenn er sich die Mühe gemacht hätte, {} Blöcke einzufügen, damit der Code besser lesbar ist, sich tatsächlich darum gekümmert hätte, dass er eine 10-seitige switch-Anweisung geschrieben und den Code in a geändert hätte etwas weniger verrückt
Gareth Davis
Das wäre ein Traum gewesen. Es war verschachtelt, wenn / sonst ... von COBOL-Programmierern in C ++ - Code geschrieben worden wäre. Ich habe nicht lange danach aufgehört.
TofuBeer