将三元运算符与 4 个表达式一起使用

2022-09-05 00:38:38

这是一种可接受的编码实践吗?

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
    }
}

还是我最好选择经典...

if (color != null) {
    messageColor = color;
}

答案 1

应限制使用 ?: 运算符,以使代码更具可读性。一个典型的例子:

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

在这种情况下,如果将代码分解为大约 5 个 if/else 行,则代码的可读性会降低。

我通常在整个运算符周围放置括号,以便在阅读时将其解析为单个值。

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

另一个变体是

messageColor = color || messageColor;

在某些语言中,其计算结果为“颜色,除非颜色计算为”false“,在这种情况下,messageColor的值。在我看来,这应该避免,因为它可能会使人们感到困惑。

最重要的是保持一致性,以便下一个阅读代码的人(即使是你)具有最小的认知开销。


答案 2

在这种情况下,可读性,易于理解等是相同的(我的意思是,来吧...)。我不喜欢第一个例子中的重复和明显的自我分配;它会翻译成类似的东西:

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

这有点愚蠢。

我通常会在一行中写第二个,但这是个人花哨的编码风格指南的问题:

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

编辑(我现在比8年前更固执己见)

由于您正在寻找最佳实践:

// 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);
    }
}