Oft, wenn ich von der switch-Anweisung höre, wird sie verschoben, um lange if ... else-Ketten zu ersetzen. Aber es scheint, dass ich mit der switch-Anweisung mehr Code schreibe, als ich nur schreiben würde, wenn ... sonst. Sie haben auch andere Probleme, z. B. das Beibehalten aller Variablen für alle Aufrufe im selben Bereich .
Hier ist ein Code, der den Ablauf darstellt, den ich normalerweise schreibe ( dank diam )
String comment; // The generated insult.
int which = (int)(Math.random() * 3); // Result is 0, 1, or 2.
if (which == 0) {
comment = "You look so much better than usual.";
} else if (which == 1) {
comment = "Your work is up to its usual standards.";
} else if (which == 2) {
comment = "You're quite competent for so little experience.";
} else {
comment = "Oops -- something is wrong with this code.";
}
Dann wollen sie, dass ich das durch Folgendes ersetze:
String comment; // The generated insult.
int which = (int)(Math.random() * 3); // Result is 0, 1, or 2.
switch (which) {
case 0:
comment = "You look so much better than usual.";
break;
case 1:
comment = "Your work is up to its usual standards.";
break;
case 2:
comment = "You're quite competent for so little experience.";
break;
default:
comment = "Oops -- something is wrong with this code.";
}
Scheint viel mehr Code in einer viel umständlicheren Syntax zu haben. Aber hat die Verwendung der switch-Anweisung wirklich einen Vorteil?
Antworten:
Für diese besondere Situation scheint es mir beides
if
undcase
sind schlechte Entscheidungen. Ich würde ein einfaches Array verwenden:Als Randnotiz sollten Sie den Multiplikator im Allgemeinen auf der Grundlage der Größe des Arrays berechnen, anstatt das Array hart zu codieren
3
.In Bezug auf , wenn man würde einen Fall / Switch, der Unterschied von einer Kaskade verwendet
if
Aussagen (oder zumindest ein großer Unterschied) ist , daßswitch
halbautomatisch von der Anzahl und die Dichte der Werte Optimierungs basieren kann, während eine Kaskade vonif
Anweisungen Blättern der Compiler Sie haben keine andere Wahl, als Code so zu generieren, wie Sie ihn geschrieben haben, und einen Wert nach dem anderen zu testen, bis eine Übereinstimmung gefunden wird. Bei nur drei realen Fällen ist das kaum ein Problem, aber bei einer ausreichenden Anzahl kann / könnte es von Bedeutung sein.quelle
case
Erklärung oder eine Kaskade vonif
Aussagen geeignet. Meistens sind sie ein (mittelmäßiger) Ersatz für eine Art Karte / Array, und Sie sind besser dran, eine der letzteren direkt zu verwenden.static const
Array zu einem Array machen, um sicherzustellen, dass es immer existiert (in der Frage wurde jedoch keine Sprache angegeben, daher habe ich versucht, auch in der Antwort keine anzunehmen ).Das Problem mit der
if...else if...
Kette ist, dass ich, wenn ich sie lese, jede einzelneif
Bedingung untersuchen muss, um zu verstehen, was das Programm tut. Zum Beispiel könnten Sie so etwas haben:(Offensichtlich ist es für eine kleine Anzahl solcher Aussagen nicht so schlimm.)
Ich hätte keine Möglichkeit zu wissen, dass Sie die Bedingungsvariable zur Hälfte geändert haben, ohne jede einzelne Anweisung gelesen zu haben. Da
switch
Sie sich jedoch auf eine einzige Bedingungsvariable beschränken, kann ich auf einen Blick erkennen, was passiert.Am Ende des Tages würde ich jedoch weder eine
switch
noch eine Kette bevorzugenif...else if
. Oft ist eine Art Sprungtabelle oder Wörterbuch für Fälle wie in der ursprünglichen Frage oder Polymorphismus eine bessere Lösung (wenn Ihre Sprache dies unterstützt). Das ist natürlich nicht immer möglich, aber ich würde nach einer Lösung suchen, die esswitch
als ersten Schritt vermeidet ...quelle
Die obige Schreibweise für diese Art von Schaltergehäuse ist ziemlich gebräuchlich. Der Grund, warum Sie den Schalter als sperriger empfanden, war, dass Ihr Körper nur aus einer Zeile bestand und Sie bei einem Schalter auch die break-Anweisung benötigten. Das Schaltergehäuse hatte also die doppelte Körpergröße von if else. Bei umfangreicherem Code trägt die break-Anweisung nicht viel zum body bei. Bei einzeiligen Texten ist es üblich, den Code in dieselbe Zeile wie die case-Anweisung zu schreiben.
Wie andere bereits erwähnt haben, macht ein Schalter die Absicht klarer, Sie möchten eine Entscheidung auf der Grundlage des Werts einer einzelnen Variablen / eines Ausdrucks treffen. Meine Kommentare sind rein aus Sicht der Lesbarkeit und nicht leistungsbezogen.
quelle
return
die richtige Zeichenfolge haben, können Sie diebreak
Anweisungen entfernen.In diesem Fall stimmt die switch-Anweisung besser mit der Absicht des Codes überein: Wählen Sie eine Aktion aus, die auf einem einzelnen Wert basiert.
Die if-Anweisungen hingegen sind viel schwerer zu lesen - Sie müssen sich alle ansehen, um sicherzugehen, was los ist. Für mich ist es weniger Code (auch wenn die Zeichenanzahl kann etwas höher sein) , da es weniger ist mental zu analysieren.
quelle
Ich stimme Jerry zu, dass ein Array von Zeichenfolgen für diesen speziellen Fall besser ist, aber im Allgemeinen ist es besser, eine switch / case-Anweisung als eine Kette von elseifs zu verwenden. Es ist einfacher zu lesen und manchmal kann der Compiler auf diese Weise besser optimieren, aber es gibt auch einen weiteren Vorteil: Es ist verdammt viel einfacher zu debuggen.
Wenn Sie auf diesen Schalter drücken, müssen Sie nur einmal einen Schritt ausführen, um auf den richtigen Zweig zu gelangen, anstatt vorsichtig mehrere if-Anweisungen nacheinander zu überspringen und möglicherweise die Taste zu schnell zu drücken und darüber hinwegzugehen und etwas zu verpassen und zu haben von vorn anfangen.
quelle
Ich bevorzuge Schalter in solchen Fällen, es entspricht viel besser dem Punkt des Codes, führen Sie eine andere Anweisung für jeden anderen Eingabewert. Das
if..else
wirkt eher wie ein „Trick“ , um den gleichen Effekt zu erzielen.switch
aussagen sind auch sauberer, es ist einfach, einen Tippfehler in all diesen zu verstecken==
Bei großen Blöcken in C ist der Wechsel schneller.
else..if
Dies kann geeigneter sein, wenn Sie einen Bereich haben (zwischen 1 und 100, tun Sie dies, zwischen 100 und 200, tun Sie das), oder in C, wenn Sie versuchen, mit Elementen wie Zeichenfolgen zu wechseln (dies ist in anderen Sprachen möglich). Welches ist das gleiche.Ich neige dazu, viele Schalter zu verwenden, wenn ich in C programmiere.
quelle
Wählen Sie etwas, das effizient und knapp ist, und dokumentieren Sie dann nicht nur, was Sie getan haben, sondern auch, warum.
Code kann überarbeitet werden und nicht immer vom ursprünglichen Autor.
Es gibt Zeiten, in denen Sie eine Implementierung absichtlich einer anderen vorziehen, weil Sie über Code nachdenken, der nicht vorhanden ist.
quelle
Im Allgemeinen mag ich keinen Ansatz. Long Switch oder If-Anweisungen müssen einfach zu einer objektorientierten Abstraktion umgestaltet werden (jedoch würde ich Ihr Beispiel als kurz, nicht lang einstufen).
Ich würde diese Art von Code persönlich in eine separate Hilfsmethode packen.
Wenn Sie den Schalter in einer separaten Methode platzieren, können Sie return-Anweisungen direkt in der switch-Anweisung platzieren (zumindest in c #), sodass auch keine break-Anweisungen erforderlich sind und der Code viel einfacher zu lesen ist.
Und das ist imho viel schöner als der if / else if / else if Ansatz.
quelle
In Python gibt es keine switch-Anweisung, weil if / elif / else nett ist:
Einfach richtig?
quelle
Elif
ist nur eine if-Anweisung mit wenigen fehlenden Buchstaben. Es ist definitiv mehr eineif
Anweisung als eine switch-Anweisung. Die Tatsache, dass die Python KEINEN Schalter hat, lässt jemanden, der sie hasst (wie mich), denken, dass sie nicht allein sind.meta
sofern es sich nicht um ein bekanntes Thema handelt. Danke, dass du mir einen Zeugen gegeben hast.Eines der Dinge, die den C / C # -Stil
switch
besonders nerven, ist das Beharren darauf, dass dercase
Wert Literale ist. Eine schöne Sache an VB / VB.NET ist,select/case
dass jeder Fall ein boolescher Ausdruck sein kann. Das ist praktisch. Insofern eine Reihe sich gegenseitig ausschließender boolescher Ausdrücke oft hilfreich ist, ist eine Reihe von if / else ifs flexibler, ganz zu schweigen davon, dass das Schreiben und Lesen effizienter ist.quelle