2016-08-03 6 views
0

Ich habe die ähnliche Frage gelesen und gelernt, dass es nicht möglich ist, eine Tenary-Operation anstelle if Anweisung, die else Anweisung nicht verwenden. Denn if-without else Aussagen sind binär nicht sinnvoll. Meine Frage ist mehr Best-Practice.Bedingte Tenary ohne sonst

In meinem Code, gibt es viele Code-Schnipsel wie die

if(calculation < 1){ 
     calculation= 0; 
    } 

Ich möchte diese mit tenary verkürzen. Es ist eine gute Übung, diese Aussagen mit dem Folgenden zu ändern.

calculation = calculation < 1 ? 0 : calculation; 
+0

* "Ist es eine gute Praxis ..." * ruft zur Stellungnahme auf. Meinungsbasierte Fragen sind für SO unpassend. –

+0

Und: Nein, es ist keine gute Übung. ;-) –

+1

Schlägt Ihnen dieser ternäre Ausdruck, den Sie vorschlagen, kürzer vor? – Eran

Antwort

2

Sie könnten eine Klasse (oder Klassen) erstellen, die eine schöne fließende API erstellen würden. So dass Ihre Linie sein würde:

calculationTo = replace(calculationTo).with(0).when(calculationTo < 1) 

Meiner Meinung liest es nicht viel besser als ein Standard-if-Anweisung, aber es hängt auch von den Bedingungen, die Sie haben.

Beispielimplementierung:

public class Replacer<T> { 

    private final T value; 
    private T replacementValue; 

    private Replacer(T value) { 
     this.value = value; 
    } 

    public static <V> Replacer<V> replace(V value) { 
     return new Replacer<V>(value); 
    } 

    public Replacer<T> with (T replacementValue) { 
     this.replacementValue = replacementValue; 
     return this; 
    } 

    public T when(boolean condition) { 
     if (condition) { 
      return replacementValue; 
     } else { 
      return value; 
     } 
    } 

} 

import static somepackage.Replacer.replace; 

public class Main { 

    public static void main(String[] args) { 
     int calculationTo = 3; 

     calculationTo = replace(calculationTo).with(0).when(calculationTo < 1); 
    } 

} 

Sie könnten es erweitern oder eine Funktion machen Zustand so kann es mit Lambda, etc. verwendet werden würde ich auch Verfahren with Rückkehr Gegenstand unterschiedlicher Klasse machen (zB ReplacerWithValue), so dass der Aufruf von with zweimal in einer Kette zu einem Kompilierungsfehler führen würde.

+0

Ich denke, diese Lösung ist mehr selbsterklärend als nur eine einfache if-Anweisung. If-else-Anweisung könnte leicht zu schreiben sein, aber nicht lesbarer. –

0

Da Sie nach einer Best Practice fragen, werde ich auf etwas hinweisen, wo Sie es besser machen könnten und dann erzähle ich Ihnen, warum ich den ternären Operator mag.

Lassen Sie mich anders formulieren sind Sie Code-Schnipsel: „Was bedeutet‚Berechnung‘repräsentieren“

if (calculatedValueAfterStep1 < 1) { 
    calculatedValueAfterStep2 = 0; 
} else { 
    calculatedValueAfterStep2 = calculatedValueAfterStep1; 
} 

Wenn Sie Ihren Code lesen und jemand fragt, Dann können Sie diese Frage nicht beantworten, ohne nach der Zeilennummer zu fragen. Die Bedeutung von "Berechnung" ändert sich im Verlauf des Programmcodes. Wenn Sie nicht erklären können, was eine Variable bedeutet, können Sie ihr keinen guten Namen geben. Deshalb mag ich meine Version besser. Es gibt eine klare Definition, welche Bedeutung die Variablen "calculatedValueAfterStep1" und "CalculatedValueAfterStep2" haben. Ja, die Namen sind schlecht. Ändern Sie sie entsprechend in Ihre Domain.

Jetzt, wenn Sie den Code betrachten, werden Sie feststellen, dass "CalculatedValueAfterStep2" nicht deklariert ist. Also lass uns den Code ändern:

int calculatedValueAfterStep2 = -1; 
if (calculatedValueAfterStep1 < 1) { 
    calculatedValueAfterStep2 = 0; 
} else { 
    calculatedValueAfterStep2 = calculatedValueAfterStep1; 
} 

Jetzt wird es hässlich. Die gleiche Person, die die frühere Frage stellt, wird nun fragen: "Warum wird 'berechneterWertAfterStep2' mit '-1' initialisiert?". Also hier kommt der ternäre Operator:

int calculatedValueAfterStep2 = (calculatedValueAfterStep1 < 1) ? 0 : calculatedValueAfterStep2; 

schön!