[英]Using ternary operator with 4 expressions
这是一种可接受的编码实践吗?
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;
}
应限制使用?:运算符以使代码更具可读性。 一个经典的例子:
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的值。在我看来,这应该避免,因为它可能会混淆人们。
最重要的是保持一致,以便下一个阅读代码的人(即使是你)具有最小的认知开销。
在这种情况下,可读性,易于理解等是相同的( 我的意思是,来吧...... )。 我不喜欢第一个例子中的重复和明显的自我分配; 它会转化为:
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);
}
}
使用三元运算符通常是一个敏感问题,以及其他编码标准。 它的使用可能最好由您网站的编码标准决定。
但是,在这种特殊情况下,我肯定会推荐第二种选择; 不仅更清楚,而且这里完全不需要使用三元运算符。 不需要为自己重新分配messageColor,因此在这种特定情况下三元运算符的唯一功能是代码混淆。
三元运算符在C程序员中更常见。 在C中如果你避开控制结构,你通常可以获得更好的流水线,因为没有分支预测出错。 我怀疑你会看到Java中的任何性能差异,而if-null-then-assign模式比三元模型更常见。 但是,如果要维护现有代码库,通常最好与现有代码保持一致。
如果你发现自己做了很多,你可以写一个defaultIfNull
, firstNonNull
或coalesce
函数,它可以使代码更简洁。 Apache Commons Lang包含defaultIfNull
函数。
有些语言包含||=
运算符,这是在这些语言中默认值的通常习惯用语。
我更喜欢第二种,因为它更清楚地表达了你的意思:你只想改变颜色,如果它不是空的。 第一种方法并没有这么清楚。
三元运算符经常被滥用,因为它们生成的代码看起来很聪明和紧凑。
事实上,它们使代码更不易读,更容易出错。 只要有可能,建议使用较长版本
if ( <condition> ) {
<action> ;
}
而不是三元语法。
在你的情况下,我更喜欢“经典”的实现,因为对我而言,理解起来更快,如果这个人有一个首选的颜色,你只想使用一种新的颜色。
如果我想避免使用NPE,我有时会在方法调用中使用它,但我通常会在下一个重构之一中删除那些丑陋的代码;)
对我来说似乎很好(我经常使用Python的三元运算符),但这种风格问题通常非常主观。 如果项目具有编码样式文档,您可能需要检查它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.