Wann verwenden Sie IF-ELSE IF-ELSE über Switch-Anweisungen und umgekehrt [Duplikat

StackOverflow https://stackoverflow.com/questions/427760

  •  06-07-2019
  •  | 
  •  

Frage

Warum Sie eine verwenden möchten switch blockieren über eine Reihe von if Aussagen?

switch Aussagen scheinen das Gleiche zu tun, dauern aber länger, um zu tippen.

War es hilfreich?

Lösung

Wie bei den meisten Dingen sollten Sie auswählen, welche Sie basierend auf dem Kontext und was konzeptionell der richtige Weg ist. Ein Switch sagt wirklich "Wählen Sie eine davon basierend auf diesem Variablenwert", aber eine IF -Aussage ist nur eine Reihe von Booleschen Schecks.

Als Beispiel, wenn Sie es getan haben:

int value = // some value
if (value == 1) {
    doThis();
} else if (value == 2) {
    doThat();
} else {
    doTheOther();
}

Dies wäre viel besser als Switch dargestellt, da es dann offensichtlich offensichtlich macht, dass die Auswahl der Aktion auf der Grundlage des Werts von "Wert" und nicht auf einem willkürlichen Test auftritt.

Wenn Sie feststellen, dass Sie Switches und IF-Elses schreiben und eine OO-Sprache verwenden, sollten Sie in Betracht ziehen, sie loszuwerden und Polymorphismus zu verwenden, um das gleiche Ergebnis zu erzielen, wenn möglich.

Schließlich kann ich mich nicht daran erinnern, wer es gesagt hat, aber ich habe einmal jemanden gefragt gelesen: "Ist Ihre Schreibgeschwindigkeit wirklich das, was sich darauf auswirkt, wie schnell Sie codieren?" (paraphrasiert)

Andere Tipps

Wenn Sie den Wert einer einzelnen Variablen einschalten, würde ich jedes Mal einen Switch verwenden, es ist das, wofür das Konstrukt gemacht wurde.

Ansonsten bleiben Sie bei mehreren IF-ELSE-Anweisungen.

In Bezug auf die Lesbarkeit:

Ich bevorzuge normalerweise, wenn/sonst über Switch-Anweisungen konstruiert, insbesondere in Sprachen, die Herbstfälle ermöglichen. Was ich oft festgestellt habe, ist, wie die Projekte älter werden und mehrere Entwickler involviert sind. Sie werden Probleme mit dem Aufbau einer Switch -Erklärung haben.

Wenn sie (die Aussagen) mehr als einfach werden, werden viele Programmierer faul und anstatt die gesamte Aussage zu lesen, um sie zu verstehen, werden sie einfach in einem Fall auftreten, um den Fall zu decken, den sie in die Aussage hinzufügen.

Ich habe viele Fälle gesehen, in denen Code wiederholt in einer Switch-Anweisung, weil der Test einer Person bereits abgedeckt war, ein einfacher Fall-obwohl der Fall ausreichte . Ich habe auch einige albtraumhafte Switch-Aussagen mit vielen Fällen gesehen, die schlecht konstruiert waren, und einfach zu versuchen, die gesamte Logik zu befolgen, wobei viele durch Überlagen verteilte Fälle und viele Fälle, die nicht waren, schwierig ... welche Art von Leads zu dem ersten/Redundanzproblem, über das ich gesprochen habe.

Theoretisch könnte das gleiche Problem mit if/sonst konstruieren, aber in der Praxis scheint dies einfach nicht so oft zu passieren. Vielleicht sind (nur eine Vermutung) Programmierer gezwungen, etwas sorgfältiger zu lesen, da Sie die oft komplexeren Bedingungen verstehen müssen, die innerhalb des If/sonst -Konstrukts getestet werden? Wenn Sie etwas Einfaches schreiben, von dem Sie wissen, dass andere wahrscheinlich niemals berühren und es gut konstruieren können, dann ist es ein Wurf. In diesem Fall ist alles, was für Sie lesbarer ist und sich für Sie am besten anfühlt, wahrscheinlich die richtige Antwort, da Sie wahrscheinlich diesen Code aufrechterhalten.

in Bezug auf Geschwindigkeit:

Switch-Anweisungen werden oft schneller als If-ELSE-Konstrukte (aber nicht immer). Da die möglichen Werte einer Switch -Anweisung vorher ausgelegt sind, können Compiler die Leistung optimieren, indem sie Sprungtabellen erstellen. Jede Bedingung muss nicht wie in einem if/else -Konstrukt getestet werden (na ja, bis Sie sowieso die richtige finden).

Dies ist jedoch nicht immer der Fall. Wenn Sie beispielsweise einen einfachen Schalter mit möglichen Werten von 1 bis 10 haben, ist dies der Fall. Je mehr Werte Sie hinzufügen Sprungtabellen sollen größer sein und der Schalter wird weniger effizient (nicht als ein if/else, aber weniger effizient als die vergleichsweise einfache Switch -Anweisung). Wenn die Werte sehr varianten (dh anstelle von 1 bis 10, haben Sie 10 mögliche Werte von 1, 1000, 10000, 100000 usw. bis 100000000000), ist der Schalter weniger effizient als im einfacheren Fall .

Hoffe das hilft.

Ich persönlich bevorzuge es, Switch-Aussagen über zu viele verschachtelte IF-Ellen zu sehen, da sie viel einfacher zu lesen sind. Switches sind auch besser in den Lesbarkeitsbegriffen für die Anzeige eines Zustands.

Siehe auch den Kommentar in diesem Beitrag zu Pacman ifs.

Dies hängt sehr von dem spezifischen Fall ab. Ich denke, man sollte die verwenden switch über dem if-else Wenn es viele verschachtelt gibt if-elses.

Die Frage ist, wie viel ist viele?

Gestern habe ich mir die gleiche Frage gestellt:

public enum ProgramType {
    NEW, OLD
}

if (progType == OLD) {
    // ...
} else if (progType == NEW) {
    // ...
}

if (progType == OLD) {
    // ...
} else {
    // ...
}

switch (progType) {
case OLD:
    // ...
    break;
case NEW:
    // ...
    break;
default:
    break;
}

In diesem Fall der 1. if Hat einen unnötigen zweiten Test. Der 2. fühlt sich ein wenig schlecht an, weil es das Neue verbirgt.

Am Ende wählte ich die switch Weil es einfach besser liest.

Switch -Anweisungen sind viel einfacher zu lesen und zu warten, zweifellos. Und sind normalerweise schneller und weniger fehleranfällig.

Verwenden Sie Schalter jedes Mal, wenn Sie mehr als 2 Bedingungen für eine einzelne Variable haben. Nehmen Sie zum Beispiel Wochentage. Wenn Sie für jeden Wochentag eine andere Aktion haben, sollten Sie einen Switch verwenden.

Andere Situationen (mehrere Variablen oder Komplexen, wenn Klauseln Sie mit IFS sollten, aber es gibt keine Regel, wo Sie jeweils verwenden sollen.

Ich habe oft gedacht, dass die Verwendung von Elendien und beim Durchlesen von Fallinstanzen (bei denen die Sprache zulässt) Code -Gerüche sind, wenn nicht Gerüche.

Für mich selbst habe ich normalerweise festgestellt, dass verschachtelte (wenn/dann/sonst) die Dinge normalerweise besser als Elseif widerspiegeln, und dass für gegenseitig ausschließliche Fälle (oft wenn eine Kombination von Attributen Vorrang vor einem anderen hat), Fall oder ähnliches ist klarer zu Zwei Jahre später lesen.

Ich denke, die auswählen Die von Rexx verwendete Aussage ist ein besonders gutes Beispiel dafür, wie man "Fall" gut macht (keine Drop-Throughs) (dummes Beispiel):

Select
    When (Vehicle ¬= "Car") Then
        Name = "Red Bus"
    When (Colour == "Red") Then
        Name = "Ferrari"
    Otherwise
        Name = "Plain old other car"
    End

Oh, und wenn die Optimierung nicht mehr abgeschlossen ist, holen Sie sich einen neuen Compiler oder eine neue Sprache ...

Die Tendenz, Dinge zu vermeiden, weil es länger dauert, wenn es eine schlechte Sache ist, versuchen Sie, es auszuwurzeln. Das heißt, übermäßig ausführliche Dinge sind auch schwer zu lesen, so klein und einfach ist wichtig, aber die Lesbarkeit ist nicht wichtig, was wichtig ist. Präzise Einzeiler können oft schwieriger zu lesen sein als eine einfache, gut angelegte 3- oder 4-Zeilen.

Verwenden Sie, welche Konstrukte die Logik der Operation am besten enthält.

Angenommen, Sie haben beschlossen, Switch zu verwenden, da Sie nur an einer einzelnen Variablen arbeiten, die unterschiedliche Werte haben kann. Wenn dies zu einer kleinen Switch-Anweisung (2-3 Fälle) führen würde, würde ich sagen, dass das in Ordnung ist. Wenn es so aussieht, dass Sie mehr haben, würde ich empfehlen, stattdessen Polymorphismus zu verwenden. Hier kann ein abstraktes Muster verwendet werden, um ein Objekt zu erstellen, das die Aktion ausführen würde, die Sie in den Schalter ausführen wollten. Die hässliche Switch -Anweisung wird abstrahiert und Sie haben einen saubereren Code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top