Gibt es einen nennenswerten Unterschied zwischen if und if-else?

8

Gibt es angesichts der folgenden Codeschnipsel einen nennenswerten Unterschied?

%Vor%

vs.

%Vor%

Oder wäre das Prinzip der einzelnen Ausgänge hier besser mit diesem Code?

%Vor%

Gibt es einen wahrnehmbaren Leistungsunterschied? Fühlst du, dass man mehr oder weniger wartbar / lesbar ist als die anderen?

    
Drew 20.04.2010, 19:00
quelle

9 Antworten

10

Mit dem zweiten Beispiel erklären Sie sehr klar, dass sich beide Bedingungen gegenseitig ausschließen.
Mit der ersten ist es nicht so klar, und im (unwahrscheinlichen) Ereignis, dass eine Zuordnung zu input zwischen beiden ifs hinzugefügt wird, würde sich die Logik ändern.
Angenommen, jemand fügt in der Zukunft input = 0 vor dem zweiten if hinzu.
Natürlich ist das unwahrscheinlich, aber wenn wir hier von Wartbarkeit sprechen, dann sagt if-else klar, dass es sich gegenseitig ausschließende Bedingungen gibt, während eine Reihe von Wenns dies nicht tun und sie nicht so voneinander abhängig sind wie wenn Blöcke aufheben.

edit: Jetzt, wo ich sehe, in diesem bestimmten Beispiel, zwingt die Rückkehrklausel die gegenseitige Exklusivität, aber wieder sprechen wir über Wartbarkeit und Lesbarkeit.

Wie auch immer, über die Leistung, wenn dies in Java codiert ist, sollte man sich nicht um die Leistung einiger if-Blöcke kümmern, wenn C in eine wirklich langsame Hardware eingebettet wäre, vielleicht, aber sicherlich nicht mit Java.

>     
Petruza 20.04.2010, 19:06
quelle
4

Verwenden Sie jede Form, die Ihre Absicht am besten beschreibt.

Folgen Sie nicht dem Prinzip des einzelnen Ausgangs, wenn die Dinge so einfach sind - es macht es nur verwirrender.

    
Michael Haren 20.04.2010 19:03
quelle
4
  • In der ersten:

    jemand schließlich, aus irgendeinem seltsamen Grund und wenn Sie nicht schauen, fügen Sie einige add-Anweisung, die diese Methode unter bestimmten seltsamen Bedingungen scheitern machen, wird jeder (oder am schlimmsten, eine einzelne Person) 4 Stunden verbringen. Beobachten Sie den Quellcode und Debuggen der Anwendung, um endlich zu finden, dass etwas in der Mitte war.

  • Das zweite ist definitiv besser, es verhindert nicht nur dieses Szenario, sondern hilft auch klar zu sagen, es das oder dieses andere nicht mehr.

    Wenn der gesamte Code, den wir in einem if schreiben, höchstens 10 Zeilen lang wäre, wäre das nicht wirklich wichtig, aber leider ist das nicht der Fall, es gibt andere Programmierer, die aus irgendeinem Grund denken, dass ein if-body sein sollte & gt; 200 Zeilen lang ... wie auch immer.

  • Ich mag die dritte nicht, es zwingt mich, nach der Rückgabevariablen zu suchen, und es ist einfacher, das return -Schlüsselwort

  • zu finden

Über Geschwindigkeitsleistung sind sie (fast) identisch. Mach dir deswegen keine Sorgen.

    
OscarRyz 20.04.2010 19:31
quelle
1

In Ihrem letzten Beispiel tun Sie das nicht:

%Vor%

aber dies (beachten Sie die Verwendung von Java endgültig ):

%Vor%

Indem Sie dies tun, machen Sie Ihre Absicht klar und dies ist ein Glücksfall für IDEs, die "Programmierung mit Absicht" unterstützen (es gibt keine Notwendigkeit zu "kompilieren", um mögliche Fehler zu sehen, selbst bei einer partiellen AST kann eine gute IDE unvollständige Quellen untersuchen) in Echtzeit und geben Sie sofort Warnungen).

Auf diese Weise sind Sie sicher nicht zu vergessen, Ihren Rückgabewert zu initialisieren. Das ist großartig, wenn Sie später entscheiden, dass Sie schließlich eine andere Bedingung brauchen.

Ich mache das immer und seit ich IntelliJ IDEA (Version 4 oder so, vor langer Zeit) benutze und dies hat mir so viele alberne Ablenkungsfehler erspart ...

Einige Leute werden argumentieren, dass dies zu viel Code für solch einen einfachen Fall ist, aber es fehlt der Punkt völlig: Der Punkt ist, die Absicht klar zu machen, so dass der Code leicht lesbar ist und später leicht erweitert werden kann, ohne versehentlich zu vergessen toBeReturned zuweisen und ohne versehentlich zu vergessen, von einer späteren Klausel zurückzukehren, die Sie hinzufügen können.

Wenn sonst "Prägnanz" der Name des Spiels wäre, würde ich schreiben:

%Vor%

Wobei sowohl doStuff als auch doOtherStuff true zurückgeben würden.

    
SyntaxT3rr0r 20.04.2010 19:49
quelle
0

Semantisch - nein. Leistungsmäßig hängt dies vom Compiler ab, d. H. Ob es erkennen kann, dass beide Bedingungen nicht gleichzeitig wahr sein können. Ich würde wetten Standard Sun Compiler kann. Ob das Single-Exit-Prinzip anzuwenden ist, hängt vom Geschmack ab. Ich persönlich hasse es.

    
doublep 20.04.2010 19:05
quelle
0

Version 1 und 2 könnten schneller als # 3 sein, aber ich denke, der Leistungsunterschied ist minimal. Ich möchte mich lieber auf Lesbarkeit konzentrieren.

Ich persönlich würde niemals Version 2 verwenden. Zwischen # 1 und # 3 würde ich diejenige auswählen, die den am besten lesbaren Code für den betreffenden Fall liefert. Ich mag viele Ausstiegspunkte in meinen Methoden nicht, weil es den Code schwer zu analysieren macht. Es gibt jedoch Fälle, in denen der Fluss deutlicher wird, wenn wir für einige spezielle Fälle sofort austreten und mit den Hauptfällen fortfahren.

    
Eyal Schneider 20.04.2010 19:10
quelle
0

Denken Sie an diesen Fall, wenn die beiden Beispiele nicht ähnlich sind:

%Vor%

vs.

%Vor%

Der erste Ansatz ist wahrscheinlich flexibler , aber beide Formeln können unter verschiedenen Umständen verwendet werden.

Was die Leistung angeht, so denke ich, dass die Unterschiede zu klein sind, um für jede reguläre Java-Anwendung berücksichtigt zu werden, die von vernünftigen Programmierern programmiert wurde:).

    
Andrei Ciobanu 20.04.2010 19:12
quelle
0

In Ihrem Fall würde das zweite if nur aufgerufen werden, wenn das erste if fehlgeschlagen wäre, also ist es hier weniger wichtig, aber wenn Ihr erstes if etwas tat und nicht zurückkehrte, wäre das zweite if (was dann immer falsch wäre) getestet, es sei denn, es war in einem else-if.

Mit anderen Worten, es gibt Fälle, in denen der Unterschied zwischen if-else-if und if-if wichtig ist, aber dies gehört nicht dazu.

Beispiel: Probieren Sie es aus und versuchen Sie es nach dem Entfernen des else. Sie erhalten zwei verschiedene Ausgänge:

%Vor%     
Nick Gotch 20.04.2010 19:13
quelle
-1

Zwischen den ersten und zweiten Schnipsel gibt es wirklich keinen Unterschied. Das dritte Snippet ist jedoch ziemlich ineffizient. Da Sie darauf warten, die Steuerung des Programms an den Aufrufer zurückzugeben, bis zur letzten Codezeile in der Methode, verschwenden Sie Verarbeitungsleistung / Speicher, während die ersten beiden Codeausschnitte die Steuerung zurückgeben, sobald eine der Bedingungen als wahr bestimmt wird / p>     

KSwift87 20.04.2010 19:05
quelle