Verwendung eines Bedingungsoperators, um auszuwählen, welches Objekt eine bestimmte Methode aufruft?

8

Ich habe zwei Sammlungen und Elemente, die zu einer oder der anderen dieser Sammlungen hinzugefügt werden, je nachdem, ob bestimmte Kriterien erfüllt sind.

Etwas unbeabsichtigt stolperte ich über die Tatsache, dass es legal ist zu schreiben

%Vor%

statt

%Vor%

Während der erste mich schlau macht (immer ein Plus), bin ich mir nicht sicher über längerfristige Lesbarkeit, Wartbarkeit usw. Der grundlegende Vorteil, den ich sehe, ist, dass, wenn ich weiß, ich immer dasselbe machen werde Ding, es wird ein Ort, um eine Methode zu ändern (statt zwei, oder vielleicht viele, wenn ich eine switch-Anweisung über bedingte Operatoren ). Der Hauptnachteil tritt auf, wenn dies nicht der Fall ist (d. H. Ich muss einen Methodenaufruf zu einigen Fällen hinzufügen und nicht zu anderen).

Welche Vor- und Nachteile der beiden Methoden (oder andere Lösungen) sehen Sie?

Wenn Sie nicht denken, dass diese bestimmte Instanz der Verwendung des Bedingungsoperators zum Festlegen des Objekts, mit dem eine Methode aufgerufen werden soll, die richtige Wahl ist, gibt es Fälle, in denen dies sinnvoll ist?

    
Carl 25.01.2010, 15:23
quelle

9 Antworten

29

Ein einfacheres Code-Snippet wäre

%Vor%

Mit anderen Worten, trennen Sie die Zuweisung von der Verwendung davon.

    
matt b 25.01.2010, 15:27
quelle
5

So schlau wie das Beispiel ist, ist Lesbarkeit und Wartbarkeit immer die klügste Idee.

In Bezug auf den Bedingungsoperator sollten Sie nur zwei Werte haben, wenn Ihre Bedingung über dieses Maximum hinausgeht, kann es unlesbar werden. Bedingte Operatoren sind keine Standardmethode, um mit verschiedenen Werten umzugehen.

    
Anthony Forloney 25.01.2010 15:25
quelle
1

Ich bin gegen das langzeitige Aufrufen der Funktion in jedem Zweig der if-Anweisung, weil es nicht immer klar ist, ob es zufällig ist, dass die aufgerufene Funktion dieselbe ist und es zwei Orte gibt, die geändert werden müssen ändere die aufgerufene Funktion (okay, 'add' ist ein einfacher Fall). Aus diesem Grund würde ich normalerweise das korrekte Objekt einer Variablen zuweisen (normalerweise in einer if-Anweisung, da normalerweise auch etwas anderes passiert), aber den gesamten Code außerhalb der Bedingung ziehen.

    
Andrew Aylett 25.01.2010 16:02
quelle
1

Mein bevorzugter Weg ist:

%Vor%

Zunächst einmal möchte ich keine Anrufe tätigen und den Wert der Variablen temp (dem Test (foo)) aus zwei Gründen zuweisen:

  1. es ist einfacher zu debuggen (System.out.println, oder sogar der Debugger - wenn die Methode Nebenwirkungen hat, dann nur ein Blick auf es in einem Debugger wird es wieder aufrufen - damit die Nebenwirkungen verursachen).
  2. selbst wenn es keine Nebenwirkungen gibt, rät es davon ab, es mehr als einmal anzurufen, was den Code effizienter macht. Der Compiler / Hotspot sollte sich mit der Entfernung der nicht benötigten temporären Variable befassen.

Zweitens mag ich keinen Code wo, wenn Sie Ihre Augen verwischen, sieht es genauso aus. COne.add (foo) und cOther.add (foo) "sehen" gleich aus, wenn Sie Ihre Augen "verwischen". Wenn Sie es beispielsweise in eine Liste geändert haben und add (int, E) anstelle von add (E) verwenden, haben Sie nur eine Stelle, an der Sie den Code ändern können, was bedeutet, dass weniger Fehler gemacht werden müssen (wie cOne.add (1, foo) und cOther.add (2, foo), wenn sie beide add (1, foo)) sein sollten.

BEARBEITEN (basierend auf dem Kommentar)

Es gibt ein paar Möglichkeiten, es hängt davon ab, wie Sie den Code ausgelegt haben. Ich würde wahrscheinlich mit etwas gehen wie:

%Vor%

und dann etwas wie:

%Vor%

Im Wesentlichen mache ich eine Methode für alles innerhalb eines {} Blocks, wenn es sinnvoll ist (und normalerweise tut es das). Ich mag viele kleine Methoden.

    
TofuBeer 25.01.2010 17:17
quelle
1

Ein mögliches Problem bei der Verwendung von Bedingungsoperatoren ist, wenn die Argumente komplexer werden. Zum Beispiel, wenn die folgende Zeile eine NullPointerException auslöst:

%Vor%

Welche der drei Dereferenzierungen verursacht die NPE? obj1 , obj2 oder obj1.getValue() Manchmal könnte es möglich sein, durch Inferenz im vorhergehenden Code, aber nicht immer ...

auszuarbeiten

Vergleiche die folgenden zwei Teile des Codes:

%Vor%

vs

%Vor%

Die meisten Leute würden argumentieren, dass die Bedingung einfacher zu lesen ist, und es ist sicherlich prägnanter.

Nun, würde ich damit eine Bedingung verwenden, um eine Methode aufzurufen? Nein, es fügt viel visuelle Komplexität hinzu und man muss sich daran erinnern, dass das Debuggen doppelt so schwer ist wie das Schreiben von Code. Das heißt, je einfacher der Code ist, desto einfacher ist es für Sie oder jemand anderen, ihn in sechs Monaten zu verstehen. Ich würde mehr als glücklich sein, die zwei Linienversion in der angenommenen Antwort zu verwenden.

    
Paul Wagland 25.01.2010 21:17
quelle
1

Bedingte Operatoren, die für diesen Zweck verwendet werden, sind ziemlich selten, so dass das Auge nicht wirklich danach sucht.

Ich mag, dass mein Java-Code konsistent aussieht, so dass ich und zukünftige Betreuer leicht Dinge wie Verzweigungen, zu viel Komplexität etc. erkennen können. Da ich Wenns an anderer Stelle verwende, kann ich normalerweise die Kosten dafür mit einem Konditional übernehmen .

Wenn ich eine Sprache verwende, in der ich viele Tricks über Ausdrücke wie Python mache, ist das eine andere Geschichte.

    
Uri 25.01.2010 16:20
quelle
0

IMHO die "volle", lange Version ist ein bisschen besser lesbar und definitiv besser für die Wartung auf lange Sicht.

    
Dominik Sandjaja 25.01.2010 15:25
quelle
0

Ich würde die erste bevorzugen (Oder die Zwischenlösung von matt). Es ist nur kürzer. Wenn der Bedingungsoperator in Ihrem Projekt eher häufig verwendet wird, gewöhnen sich die Leute daran und "Lesbarkeit" steigt.

Oder mit anderen Worten: Wenn Sie an Perl gewöhnt sind, können Sie es leicht lesen.

    
bertolami 25.01.2010 15:35
quelle
0

Wenn Sie zu dem, was matt b gesagt hat, kommen, könnten Sie einen Schritt weiter gehen und dieses Format verwenden, wenn Sie sich für den bedingten Operator entscheiden:

%Vor%

Es gibt dem Code mehr Gefühl und macht es leichter zu lesen.

    
Jon Onstott 25.01.2010 18:40
quelle