Warum die seltsame Einrückung auf switch-Anweisungen?

77

Warum wird der imho fehlende Einzug der "case" - Schlüsselwörter in einer switch-Anweisung als guter Stil angesehen?

In etwa jeder IDE scheint kein Einzug des Schlüsselworts "case" die Standardformatierungsoption zu sein:

switch (i){
case 0:
    break;
case 1:
    break;
}

während ich dieses Format intuitiver finde:

switch (i){
    case 0:
        break;
    case 1:
        break;
}

Gibt es eine Logik dahinter, die mir entgeht?

fasseg
quelle
2
Wusste das bis jetzt nicht! Es ist wahrscheinlich, weil Schalter vor dem Einrücken erfunden wurde))
rodion
1
NB schaltet standardmäßig ein (und es sieht auch für mich besser lesbar aus)
barti_ddu
1
@gstackoverflow IDEA 15.0.5 es macht es nicht für mich. Ich wünschte es wäre so. Ich bevorzuge Einrückungen, um logischen Gruppierungen zu entsprechen, und der Schalter ist ein logisches Element, dessen Auswirkungen man im Allgemeinen als Einheit betrachten möchte. Daher möchte ich es als Einheit sehen (z. B. eingerückt). Ich neige auch dazu, die Aussagen für die Fallabschnitte in Klammern zu setzen.
Gus

Antworten:

55

Die Fälle sind logische Bezeichnungen. Viele Leute setzen Beschriftungen auf die gleiche Einrückungsstufe wie der Block, in dem sie sich befinden. Meiner Meinung nach ist es auf diese Weise einfacher, den Text durchzulesen.

Ich vergleiche es mit einer Zeitleiste, durch die Sie scrollen können. Sie haben Markierungen auf der Zeitachse selbst, die nicht in den Inhalt eingerückt sind. Sie können dann schnell darauf hinweisen, wo sich Beschriftungen / Markierungen befinden, ohne Ihr Auge von der Grundlinie abzuwenden.

Johannes Schaub - litb
quelle
11
Anders ausgedrückt, der Inhalt des switchBlocks wird eine Ebene von sich switchselbst eingerückt , aber die cases werden eine Ebene von dem Code "entfernt", mit dem sie gemischt sind.
Steve Jessop
Ich war auf dem Zaun darüber und neigte mich zum Einrücken, da ich dachte, es sei etwas lesbarer. Diese Antwort, zusammen mit dem Vorteil, übermäßiges Einrücken / Umwickeln zu verhindern, änderte meine Meinung. Stellen Sie sich die Fälle eher als Etiketten vor, als wenn die Bedingungen die Lesbarkeit geringfügig verbessern, wenn sie nicht eingerückt sind.
Pilot_51
2
Die caseTeile verhalten sich wie Beschriftungen, da der Ausführungsfluss durch die Beschriftung vom obigen Code zum folgenden Code ohne a verläuft break. Ich sehe sie immer noch lieber eingerückt. Ohne den Einzug verbirgt es für mich die switchAussage selbst, was es schwierig macht, den Anfang der Dinge zu sehen. Dies ist jedoch nur dann ein echtes Problem, wenn es zu viele Fälle gibt und das ein ganz anderes Problem ist.
Lee Meador
Was ist mit der Standardklausel? In Eclipse (Java) wird der Standardfall des Schalters automatisch eingerückt. Er ist nicht wie in den Fällen "ungebeult". Ich würde denken, dass eine einfache Lesbarkeit für das, was in Standardfällen passiert, der Notwendigkeit einer Lesbarkeit in definierten Fällen entspricht.
Chexxor
1
Was ist, wenn Sie auch Zahnspangen für cases haben? Sie erhalten 2 schließende Klammern mit derselben Einrückungsstufe in verschiedenen Zeilen.
Iulian Onofrei
28

In 4 Worten: keine Blöcke, keine Einrückung .

Fälle öffnen keinen Block. In C oder C ++ können Sie sogar Variablendeklarationen am Anfang des Schalterblocks einfügen (die Initialisierer werden jedoch nicht aufgerufen, außer bei statischen Variablen, das ist eine Gefahr). Sie können mit vielen seltsamen Dinge tun switch, wie Duff Gerät .

Da Fälle nur Beschriftungen sind, erscheint das Einrücken nicht so intuitiv, und das Nichteinrücken ist der von den meisten Stilen gewählte Stil.

kriss
quelle
Ich würde nicht sagen, dass es sich notwendigerweise um Labels handelt, da man sie sich sowohl als Labels als auch als Syntaxzucker für eine Folge von if-elses vorstellen kann. Da sie jedoch wie Etiketten aussehen, ist die Einrückung auf diese Weise möglicherweise besser geeignet.
Rodion
28
Ich glaube nicht, dass diese Regel den fraglichen Stil beschreibt. switchführt einen Block ein und casenicht. Und doch casescheint eine neue Ebene der Einrückung einzuführen, während switchdies nicht der Fall ist.
Steve Jessop
1
@rodion: In Bezug auf die Komplexität sind C-Switch-Implementierungen O (1) und die äquivalenten if-else-Zeichenfolgen sind O (n). Wenn-else wird erwartet, dass genau eine Aussage folgt, kein Fall usw. Sie können auch Verweise auf Fälle als Bezeichnungen im C-Standard finden (das genaue Zitat wurde nicht überprüft, aber ich bin mir ziemlich sicher, dass ich es gesehen habe ).
kriss
@Steve: switchführt selbst keinen Block ein. Es ist nur eine Blockanweisung, die normalerweise als abhängige Anweisung verwendet wird, die den Block einführt.
Jens Gustedt
1
@kriss: Alle automatischen Variablendeklarationen sind Definitionen. Sie sind einfach nicht initialisiert. Es schadet nicht, initialisierte Variablendefinitionen am Anfang eines Wechsels zu platzieren, aber die Initialisierung wird niemals durchgeführt, daher ist sie nutzlos. Natürlich sind statische Variablendefinitionen auch zu Beginn eines Wechsels gültig, unabhängig davon, ob sie initialisiert wurden.
R .. GitHub STOP HELPING ICE
11

Die offiziellen Oracle- Codekonventionen von 1999 für die Java TM -Programmiersprache (Abschnitt 7.8) empfehlen einen Switch-Stil, bei dem case-Anweisungen nicht relativ zur switch-Anweisung als Ganzes eingerückt werden.

Dies ist eine subjektive Entscheidung, aber Sun entschied, dass es besser ist, wenn sich alle an einen Stil halten, und entschied sich für diesen.

Johan Kotlinski
quelle
Hmmm. Seig heil!
Rex der Seltsame
4

Es stehen verschiedene Einrückungsstile zur Auswahl. AFAIK, keiner gilt als besserer Stil als die anderen, solange Sie konsequent einen Einrückungsstil verwenden. Für mich Einrücken caseEtiketten ist besser lesbar, gleiche gilt für private, protectedund publicEtiketten in Klassen, aber meine IDE wird die Einbuchtung meinen Weg nicht. Mein Code ist nicht so lesbar, wie ich es gerne hätte. Naja...

Mingos
quelle
3
das gleiche für mich, ich hasse wirklich Fälle nicht eingerückt, programmiere seit über 20 Jahren, aber ich kann auch kaufen, es ist eine subjektive Angelegenheit ...
rupps
4

Vielleicht ist es, die gleiche Einrückungsstufe ifbeizubehalten wie das logische Äquivalent, das in Aussagen ausgedrückt wird? Das ist:

switch(i){
case 0:
  //do something 1
case 1:
  //do something 2
}

Würde ähnlich aussehen wie sein logisches Äquivalent:

if(i==0){
  //do something 1
}else if(i==1){
  //do something 2
}
rodion
quelle
2
Wahrscheinlich nicht - switch / case wird normalerweise von einem Jumptable implementiert, wenn möglich, nicht von einer if / else-Schlange.
Johan Kotlinski
0

FWIW, eine andere Option verwendet zwei halbe Einrückungen:

switch (i) {
  case 1:
    ...
  case n:
    ...
}
Solomon Ucko
quelle