2014-05-16 3 views
9

Ist es jemals ein guter Codierungsstil, sich stark auf den Kurzschluss in der Booleschen Auswertung zu verlassen?unter Verwendung der Java-Kurzschlussauswertung (Codierungsstil)

Ich habe jemanden kennen gelernt, der es liebt, dies zu tun. wenn die Geschäftslogik Zum Beispiel ist: „Wenn Alice nicht hungrig ist oder wenn beide Alice und Bob sind hungrig“, statt zu schreiben

// if Alice is not hungry or both alice and bob are hungry 
if (!A || A && B)` 

er würde

// if Alice is not hungry OR both alice and bob are hungry 
if (!A || B) 

schreiben Argument, dass || kurz ist -circuited, also wird der rechte Operand genau dann ausgewertet, wenn der erste false ist (was A = true bedeutet).

(Das Ärgerliche daran ist, dass auf den ersten Blick könnte man denken, dies ein Fehler ist, aber dann fühlen würden Sie dumm aussehen, wenn Sie es ändern, was offensichtlicher ist!)

+1

In boolescher Logik ist es wahrscheinlich in Ordnung. Es ist normalerweise für die meisten Programmierer verständlich. Es könnte jedoch einen Kommentar wert sein. –

+1

Dies ist eine Meinungsfrage, aber nach meiner Erfahrung habe ich gesehen, dass Java-Kurzschlüsse viel zur Vereinfachung boolescher Ausdrücke verwendet haben. Es ist nicht zu schwer zu lesen, sobald man sich daran gewöhnt hat. – Kon

+0

@AnubianNoob Recht, das Problem ist, dass der Entwickler den Kommentar hinterlassen würde, der das Prädikat eher wie ein Fehler aussehen lässt! (Das heißt, das Objekt würde die Geschäftslogik angeben, während das Prädikat etwas anderes zu tun scheint!) –

Antwort

0

ich in diesem Fall denken , ob es Kurzschlüsse oder nicht die Ergebnisse werden die gleichen sein. Er verlässt sich hier nicht auf einen Kurzschluss, sondern vereinfacht die erforderliche Logik.

Meiner Meinung nach gibt es keine sehr solide Schwarz-Weiß-Antwort. Ich persönlich würde logische Aussagen nicht so vereinfachen, weil es für mich schwer zu lesen ist, wenn ich später darauf zurückkommen würde. Das Hinzufügen des zusätzlichen Bits der Logik, um meine Überprüfungen explizit zu erklären, würde nicht

3

Dies hat nicht wirklich etwas mit Kurzschluss zu tun; diese beiden Ausdrücke wäre gleichbedeutend auch ohne Kurzschlüsse:

 
A B  !A | A & B  !A | B 
----------------------------------- 
0 0  1    1 
0 1  1    1 
1 0  0    0 
1 1  1    1 

Gerade wählen je nachdem, was Sie denken, wird es einfacher, in die Zukunft zu verstehen und zu verwalten; was auch immer expliziter Ihren Zweck übermittelt. Der klare Gewinner in dieser Hinsicht scheint Ihr erster Ausschnitt zu sein.

+0

+1 für die Wahrheitstabelle. –

0

Sie verlassen sich in diesem Fall nicht wirklich auf die Kurzschlussauswertung. Sie vereinfachen nur einen booleschen Ausdruck. Die Logik funktioniert sowohl mit & als auch &&.

Die Auswirkungen von Kurzschlüssen sind:

  • Vermeiden Sie die Ausführung des kurzgeschlossen Code einige überflüssige Berechnung (die eine Ausnahme oder nicht beenden könnten Nebenwirkungen haben, werfen)
  • Potenziell speichern

Kurzschlüsse ändern daher das boolesche Ergebnis in keiner Weise.

10

Sie können und sollten sich auf Kurzschlüsse in Ausdrücken verlassen, aber das Beispiel, das Sie geben, ist nur eine schlechte Programmierung. Die Logik des Ausdrucks sollte mit dem Kommentar und der vom Menschen lesbaren Logik des Tests übereinstimmen. Der Optimierer versteht die Boolesche Logik vollständig und beseitigt jegliche offensichtliche Ineffizienz, über die sich Ihr Teamkollege beschweren könnte.

Das Wichtigste ist, den Code für den Entwickler klar und verständlich zu machen. Einen cleveren Code zu schreiben, um zu beweisen, wie schlau Sie sind, ist nie eine gute Übung.

8

Ist es jemals ein guter Stil?Ja, ich denke, dass die meisten Leute diesen idiomatischen Stil zu schätzen wissen:

myFoo != null && myFoo.myMethod();