Frage

Ist dies eine akzeptable Codierung Praxis?

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 bin ich besser dran, wenn man mit der klassischen ...

if (color != null) {
    messageColor = color;
}
War es hilfreich?

Lösung

Verwenden der ?:Betreiber sollte eingesperrt werden, um den code besser lesbar.Ein klassisches Beispiel:

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

In diesem Fall würde der code weniger lesbar, wenn Sie brach es in etwa 5 if/else-Linien.

Ich in der Regel setzen Sie Klammern um die gesamte operator, so dass, wenn es zu Lesen ich geistig analysieren Sie es als einen einzigen Wert.

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

Eine andere Variante ist

messageColor = color || messageColor;

Die in einigen Sprachen wird ausgewertet zu "Farbe, es sei denn, Farbe ergibt "falsch", in diesem Fall den Wert messageColor.Meiner Meinung nach, sollte dies vermieden werden, da es kann die Leute verwirren.

Das wichtigste ist, konsequent zu sein, so dass die nächste person das Lesen Ihres Codes (selbst wenn es Sie) hat minimalen kognitiven Aufwand.

Andere Tipps

Ablesbarkeit, ein leichteres Verständnis usw. ist die gleiche in diesem Fall ( Ich meine, komm schon ... ). Ich weiß nicht wie die Vervielfältigung und die scheinbare Selbstzuweisung im ersten Beispiel; es möchte etwas übersetzen:

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

, die ein bisschen dumm.

Ich würde in der Regel die zweite in einer Zeile schreiben, aber das ist eine Frage der individuellen Phantasie resp. Codierstil Richtlinien:

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

EDIT (Ich bin jetzt mehr als meinungs Vor 8 Jahren)

Da Sie für 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);
    }
}

Die Verwendung des ternären Operators ist oft ein heikles Thema, zusammen mit anderen Codierungsstandards. Es ist Gebrauch ist wahrscheinlich am besten bestimmt durch Standards auf Ihrer Website Codierung.

Doch in dieser besonderen Situation würde ich auf jeden Fall die zweite Option empfehlen; nicht nur ist es klar, aber die Verwendung des ternären Operators ist hier total unnötig. Es gibt keine Notwendigkeit, erneut zuweisen messageColor sich, so dass die einzige Funktion des ternären Operator in dieser besonderen Situation ist Code-Verschleierung.

Der ternäre Operator ist unter C-Programmierer häufiger. In C, wenn Sie Kontrollstrukturen vermeiden Sie können oft besser Pipelining bekommen, da es keine Verzweigungsvorhersage falsch zu gehen. Ich bezweifle, dass Sie würde jede Performance-Unterschied in Java sehen, und die if-null-then-assign Muster ist weitaus häufiger als die ternäre. wenn Sie eine vorhandene Codebasis werden jedoch beibehalten wird, ist es in der Regel am besten mit dem vorhandenen Code konsistent zu bleiben.

Wenn Sie sich, dies zu tun eine Menge finden, können Sie eine defaultIfNull, firstNonNull oder coalesce Funktion schreiben, die der Code noch prägnanter mehr machen kann. Apache Commons Lang enthält eine defaultIfNull Funktion.

Einige Sprachen umfassen einen ||= Operator, der für säumige Werte in diesen Sprachen das übliche Idiom ist.

Ich ziehe die zweite, weil es deutlicher ausdrückt, was Sie meinen: Sie nur die Farbe ändern möchten, wenn es nicht null ist. Die erste Methode nicht macht dies so klar.

In Ihrem Fall würde ich es vorziehen, die ‚klassische‘ Umsetzung, denn für mich ist es schneller zu verstehen ist, dass Sie nur eine neue Farbe verwenden, wenn die Person einen bevorzugtes hat.

ich es manchmal verwenden in-Methode aufruft, wenn ich NPE vermeiden wollen, aber ich in der Regel diese hässlichen Teile des Codes in einer der nächsten Refactorings elimate;)

Ternary Operatoren häufig als Code missbraucht werden sie produzieren scheint klug und kompakt.

In der Tat machen sie den Code weniger lesbar und fehleranfällig. Wann immer möglich, ist es ratsam, zu verwenden, um die längere Version

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

Statt einer ternären Syntax.

Es scheint gut zu mir (ich benutze Python ternären Operator viel), aber diese Art von Stil Thema ist in der Regel sehr subjektiv. Wenn das Projekt eine Codierungsstil Dokument hat, möchten Sie, dass überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top