wake-up-neo.com

Verwenden eines ternären Operators mit 4 Ausdrücken

Ist das eine akzeptable Kodierungspraxis?

public class MessageFormat {
    private static final Color DEFAULT_COLOR = Color.RED;

    private Color messageColor = DEFAULT_COLOR;

    public MessageFormat(Person person) {
        Color color = person.getPreferredColor();
        messageColor = (color != null) ? color : messageColor; // this line
    }
}

oder gehe ich besser mit dem Klassiker ...

if (color != null) {
    messageColor = color;
}
11
Brandon Coffman

Die Verwendung des Operators?: Sollte eingeschränkt werden, um Code lesbarer zu machen. Ein klassisches Beispiel:

a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );

In diesem Fall wäre der Code weniger lesbar, wenn Sie ihn in etwa 5 if/else-Zeilen aufteilen.

Normalerweise lege ich den gesamten Operator in Klammern, damit ich ihn beim Lesen mental als einen einzigen Wert analysiere.

 messageColor = (color != null ? color : messageColor); 

Eine andere Variante ist

messageColor = color || messageColor;

Was in einigen Sprachen als "Farbe" ausgewertet wird, wenn die Farbe nicht "False" ist, in welchem ​​Fall messageColor. Meiner Meinung nach sollte dies vermieden werden, da dies die Leute verwirren kann.

Das Wichtigste ist, konsistent zu sein, damit die nächste Person, die Ihren Code liest (auch wenn Sie es sind), einen minimalen kognitiven Aufwand hat. 

Lesbarkeit, Verständlichkeit usw. sind in diesem Fall die gleichen ( ich meine, komm schon ... ). Ich mag die Vervielfältigung und die scheinbare Selbstzuteilung im ersten Beispiel nicht. es würde zu etwas übersetzen:

if (colour != null) {messageColour = colour;}
   else {messageColour = messageColour;};

das ist ein bisschen dumm.

Normalerweise würde ich die zweite in einer Zeile schreiben, aber das ist eine Frage der individuellen Phantasie. Richtlinien für den Codierungsstil:

if (colour != null) {messageColour = colour;};

EDIT(Ich bin jetzt mehr als vor 8 Jahren meinungsstark)

Da Sie nach Best Practices suchen:

// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
    static final Color DEFAULT_COLOR = Color.RED;

    // Strongly prefer final fields.
    private final Color messageColor;

    // Protect parameters and variables against abuse by other Java developers
    MessageFormat (final Person person) {
        // Use Optionals; null is a code smell
        final Optional<Color> preferredColor = person.getPreferredColor();
        // Bask in the clarity of the message
        this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
    }
}
4
Svante

Die Verwendung des ternären Operators ist neben anderen Kodierungsstandards oft ein heikles Thema. Die Verwendung wird wahrscheinlich am besten durch Codierungsstandards an Ihrem Standort bestimmt.

In dieser spezifischen Situation würde ich jedoch die zweite Option definitiv empfehlen. Dies ist nicht nur klarer, sondern der Einsatz des ternären Operators ist hier völlig überflüssig. Es ist nicht notwendig, messageColor sich selbst neu zuzuweisen. Daher ist die einzige Funktion des ternären Operators in dieser speziellen Situation die Verschleierung des Codes.

2
Gabriel Reid

Der ternäre Operator ist bei C-Programmierern häufiger. Wenn Sie in C Kontrollstrukturen vermeiden, erhalten Sie oft bessere Pipelines, da keine Verzweigungsvoraussage fehlerhaft ist. Ich bezweifle, dass Sie in Java einen Leistungsunterschied feststellen würden, und das Wenn-Null-dann-Zuweisungsmuster ist weitaus häufiger als das Ternärmodell. Wenn Sie jedoch eine vorhandene Codebase verwalten, ist es in der Regel am besten, mit dem vorhandenen Code konsistent zu bleiben.

Wenn Sie dies häufig tun, können Sie eine defaultIfNull-, firstNonNull- oder coalesce-Funktion schreiben, die den Code möglicherweise noch präziser macht. Apache Commons Lang enthält eine defaultIfNull-Funktion.

Einige Sprachen enthalten einen ||=-Operator, der übliche Ausdruck für Standardwerte in diesen Sprachen. 

2
brianegge

Ich bevorzuge die zweite, weil sie klarer ausdrückt, was Sie meinen: Sie möchten die Farbe nur ändern, wenn sie nicht null ist. Die erste Methode macht das nicht so klar.

1
Mark Byers

Ternäre Operatoren werden oft missbraucht, da der von ihnen erzeugte Code klug und kompakt erscheint.

Tatsächlich machen sie den Code weniger lesbar und fehleranfälliger. Wann immer möglich, empfiehlt es sich, die längere Version von 

 if ( <condition> ) {
     <action> ;
 }

Anstelle einer ternären Syntax.

1
Alon

In Ihrem Fall würde ich die "klassische" Implementierung bevorzugen, weil es für mich schneller zu verstehen ist, dass Sie nur dann eine neue Farbe verwenden möchten, wenn die Person eine bevorzugte hat.

Ich benutze es manchmal in Methodenaufrufen, wenn ich NPEs vermeiden möchte, aber normalerweise entferne ich diese hässlichen Teile des Codes in einem der nächsten Refactorings;)

1
Andreas_D

Es scheint mir gut zu sein (ich benutze viel Pythons ternären Operator), aber diese Art von Stil ist in der Regel höchst subjektiv. Wenn das Projekt über ein Codierungsstildokument verfügt, sollten Sie das überprüfen.

0
djc