Angenommen, ich habe Code in C mit ungefähr dieser Struktur:
switch (something)
{
case 0:
return "blah";
break;
case 1:
case 4:
return "foo";
break;
case 2:
case 3:
return "bar";
break;
default:
return "foobar";
break;
}
Natürlich sind die break
s nicht notwendig, damit der Code korrekt ausgeführt wird, aber es sieht nach einer schlechten Praxis aus, wenn ich sie mir nicht dort hinlege.
Was denken Sie? Ist es in Ordnung, sie zu entfernen? Oder würden Sie sie für eine erhöhte "Korrektheit" behalten?
c
switch-statement
correctness
houbysoft
quelle
quelle
continue
odergoto
- es ist idiomatisch, sie anstelle von zu verwendenbreak
.Ich würde einen ganz anderen Weg einschlagen. Kehre nicht in der Mitte der Methode / Funktion zurück. Fügen Sie stattdessen einfach den Rückgabewert in eine lokale Variable ein und senden Sie ihn am Ende.
Persönlich finde ich Folgendes besser lesbar:
quelle
Persönlich würde ich die Retouren entfernen und die Pausen behalten. Ich würde die switch-Anweisung verwenden, um einer Variablen einen Wert zuzuweisen. Geben Sie diese Variable dann nach der switch-Anweisung zurück.
Obwohl dies ein strittiger Punkt ist, habe ich immer das Gefühl gehabt, dass gutes Design und Verkapselung einen Weg hinein und einen Weg hinaus bedeuten. Es ist viel einfacher, die Logik zu garantieren, und Sie verpassen nicht versehentlich den Bereinigungscode, der auf der zyklomatischen Komplexität Ihrer Funktion basiert.
Eine Ausnahme: Eine frühzeitige Rückgabe ist in Ordnung, wenn zu Beginn einer Funktion ein fehlerhafter Parameter erkannt wird - bevor Ressourcen erfasst werden.
quelle
switch
, aber im Allgemeinen nicht unbedingt am besten. Nehmen wir an, die switch-Anweisung in einer Funktion steht vor weiteren 500 Codezeilen, die nur in bestimmten Fällen gültig sindtrue
. Was bringt es, all diesen zusätzlichen Code für die Fälle auszuführen, in denen er nicht ausgeführt werden muss? ist es nicht besser, nurreturn
in derswitch
für diecase
s?Behalten Sie die Pausen bei - es ist weniger wahrscheinlich, dass Sie Probleme bekommen, wenn Sie den Code später bearbeiten, wenn die Pausen bereits vorhanden sind.
Trotzdem wird es von vielen (einschließlich mir) als schlechte Praxis angesehen, aus der Mitte einer Funktion zurückzukehren. Idealerweise sollte eine Funktion einen Eintrittspunkt und einen Austrittspunkt haben.
quelle
Entferne sie. Es ist idiomatisch, von
case
Anweisungen zurückzukehren, und ansonsten ist es "nicht erreichbarer Code".quelle
Ich würde sie entfernen. In meinem Buch sollte so ein toter Code als Fehler betrachtet werden, da Sie dadurch zweimal nehmen und sich fragen: "Wie würde ich diese Zeile jemals ausführen?"
quelle
Normalerweise würde ich den Code ohne sie schreiben. IMO, toter Code deutet auf Schlamperei und / oder Unverständnis hin.
Natürlich würde ich auch etwas in Betracht ziehen wie:
Bearbeiten: Auch mit dem bearbeiteten Beitrag kann diese allgemeine Idee gut funktionieren:
An einem bestimmten Punkt, insbesondere wenn die Eingabewerte dünn sind (z. B. 1, 100, 1000 und 10000), möchten Sie stattdessen ein spärliches Array. Sie können dies entweder als Baum oder als Karte recht gut implementieren (obwohl natürlich auch in diesem Fall ein Switch noch funktioniert).
quelle
Ich würde sagen, entfernen Sie sie und definieren Sie einen Standard: Zweig.
quelle
Wäre es nicht besser, ein Array mit zu haben?
und tun
return arr[something];
?Wenn es um die Praxis im Allgemeinen geht, sollten Sie die
break
Anweisungen im Schalter behalten . Für den Fall, dass Siereturn
in Zukunft keine Aussagen mehr benötigen , verringert sich die Wahrscheinlichkeit, dass sie zum nächsten fallencase
.quelle
Für "Korrektheit" sind Blöcke mit einem Eingang und einem Ausgang eine gute Idee. Zumindest waren sie es, als ich mein Informatikstudium absolvierte. Also würde ich wahrscheinlich eine Variable deklarieren, sie im Schalter zuweisen und am Ende der Funktion einmal zurückkehren
quelle
Es ist in Ordnung, sie zu entfernen. Die Verwendung
return
ist genau das Szenario, in dembreak
sie nicht verwendet werden sollte.quelle
Interessant. Der Konsens aus den meisten dieser Antworten scheint zu sein, dass die redundante
break
Aussage unnötige Unordnung ist. Andererseits habe ich diebreak
Aussage in einem Schalter als "Abschluss" eines Falls gelesen .case
Blöcke, die nicht in einem enden,break
neigen dazu, auf mich zu springen, wenn potenzielle Fehler auftreten.Ich weiß, dass es nicht so ist, wenn es ein
return
statt eines gibtbreak
, aber so "lesen" meine Augen die Fallblöcke in einem Schalter, also würde ich es persönlich vorziehen, wenn jedercase
mit einem gepaart wirdbreak
. Aber viele Compiler beschweren über diebreak
nach einemreturn
überflüssig / nicht erreichbar, und anscheinend scheine ich sowieso in der Minderheit zu sein.Also loswerden von
break
areturn
.NB: Bei alledem wird ignoriert, ob ein Verstoß gegen die Ein- / Ausstiegsregel eine gute Idee ist oder nicht. Soweit das geht, habe ich eine Meinung, die sich leider je nach den Umständen ändert ...
quelle
Ich sage, entferne sie. Wenn Ihr Code so unlesbar ist, dass Sie Pausen einfügen müssen, um auf der sicheren Seite zu sein, sollten Sie Ihren Codierungsstil überdenken :)
Außerdem habe ich es immer vorgezogen, Pausen und Rückgaben in der switch-Anweisung nicht zu mischen, sondern bei einer davon zu bleiben.
quelle
Ich persönlich neige dazu, die
break
s zu verlieren . Möglicherweise liegt eine Ursache für diese Gewohnheit in der Programmierung von Fensterprozeduren für Windows-Apps:Ich persönlich finde diesen Ansatz viel einfacher, prägnanter und flexibler, als eine von jedem Handler festgelegte Rückgabevariable zu deklarieren und am Ende zurückzugeben. Angesichts dieses Ansatzes sind die
break
s redundant und sollten daher verschwinden - sie dienen keinem nützlichen Zweck (syntaktisch oder visuell IMO) und blähen nur den Code auf.quelle
Ich denke, die * Pausen * sind für einen Zweck da. Es soll die "Ideologie" der Programmierung am Leben erhalten. Wenn wir unseren Code nur ohne logische Kohärenz "programmieren" wollen, ist er vielleicht jetzt für Sie lesbar, aber versuchen Sie es morgen. Erklären Sie es Ihrem Chef. Versuchen Sie es unter Windows 3030.
Bleah, die Idee ist sehr einfach:
/ * Nur eine kleine Frage. Wie viel Kaffee haben Sie beim Lesen der obigen Informationen getrunken? IT bricht manchmal das System * /
quelle
Beenden Sie den Code an einer Stelle. Dies bietet eine bessere Lesbarkeit des Codes. Das Hinzufügen von return-Anweisungen (mehrere Exits) dazwischen erschwert das Debuggen.
quelle
Wenn Sie einen Code vom Typ "Lookup" haben, können Sie die switch-case-Klausel in eine eigene Methode packen.
Ich habe einige davon in einem "Hobby" -System, das ich zum Spaß entwickle:
(Ja. Das ist GURPS Raum ...)
Ich stimme anderen zu, dass Sie in den meisten Fällen mehr als eine Rückgabe in einer Methode vermeiden sollten, und ich erkenne, dass diese möglicherweise besser als Array oder etwas anderes implementiert wurde. Ich fand gerade, dass Switch-Case-Return eine ziemlich einfache Übereinstimmung mit einer Nachschlagetabelle mit einer 1: 1-Korrelation zwischen Eingabe und Ausgabe ist, wie oben beschrieben (Rollenspiele sind voll davon, ich bin sicher, dass sie in anderen existieren auch "Unternehmen"): D.
Wenn andererseits die case-Klausel komplexer ist oder etwas nach der switch-Anweisung passiert, würde ich nicht empfehlen, return darin zu verwenden, sondern eine Variable im switch setzen, mit einer Pause beenden und return der Wert der Variablen am Ende.
(Auf der ... dritten? Hand ... können Sie einen Schalter jederzeit in eine eigene Methode umgestalten ... Ich bezweifle, dass er sich auf die Leistung auswirkt, und es würde mich nicht wundern, wenn moderne Compiler ihn überhaupt erkennen könnten etwas, das eingefügt werden könnte ...)
quelle