java 括号应该总是放在三元运算符的周围吗?

zzlelutf  于 2023-06-28  发布在  Java
关注(0)|答案(7)|浏览(164)

Checkstyle抱怨如下:

return (null == a ? a : new A());

说括号是不必要的
虽然没有它们,这句话当然可以很好地工作,但有了它们,它似乎更具可读性---否则,当我阅读它时,我倾向于看到:

return null

首先,然后不得不停下来考虑剩下的

== a ? a : new A();

因为我的大脑已经走上了一条路。
此外,我倾向于做同样的事情 * 每当 * 我看到一个三元运算符,除非它是在括号中分组。
那么:三进制的括号应该成为事实上的标准吗?有什么理由不把它们放在那里吗?

xmjla07d

xmjla07d1#

好吧,checkstyle是正确的,括号对执行是无用的。但是对执行无用并不意味着对代码的良好阅读无用。你应该离开他们,如果它更有意义的阅读。
我认为这段代码不需要更多的括号:

int number = (myBoolean)? 1 : 2;

但是在你的例子中,return关键字和你的布尔值是一个表达式的事实可以改变你阅读语句的方式。

ntjbwcob

ntjbwcob2#

当阅读一个return语句时,我知道'return'和'之间的一切;'是将要返回的内容,所以我不可能像您声称的那样,将您的代码示例读为返回null后跟一些符号。
也许阅读解析技术可以帮助您像我一样看待它。也就是说,我并没有真正阅读过解析技术,尽管这些年来我拼凑了一些解析器。
我总是删除不必要的括号。它们对代码理解没有帮助,因为我非常了解Java的运算符优先级。偶尔我不确定,我会加上括号,等着看IDEA是否告诉我它们是多余的。然后我删除它们,并试图记住我刚刚发现的优先规则。
在我继承的代码库中,我倾向于在由于其他原因而不佳的代码区域中找到最多的冗余括号,因此我将两者联系起来。

2wnc66cl

2wnc66cl3#

不,它不应该是事实上的标准。我更喜欢没有括号。
我认为把它们放在那里的唯一原因是为了强制评估秩序或澄清一条令人困惑的线。

t5zmwmid

t5zmwmid4#

这两种选择都是正确的,使用你的团队使用的,或者如果你是独自工作,你喜欢的。
默认情况下,checkstyle使用Sun的(r.i.p)样式指南,因此如果您希望符合标准样式,请听取它并删除括号。

zy1mlcev

zy1mlcev5#

一般来说,
在三元(也称为条件)运算符或其部分周围 * 不需要 * 括号,因为它们的优先级在运算顺序中非常低(仅在逻辑运算符之下和赋值之上)。请参阅下面的链接以获取完整的表格。
因此,可以说,这些不必要的括号在视觉上使代码变得混乱,并且它们揭示了程序员对代码缺乏理解。
可能需要在三进制中或周围使用括号的例外情况是:

  • 如果你的三元足够复杂,值得多行;然后你可以用圆括号括住你的语句,以防止自动插入分号。
  • 如果您的三元嵌套在另一个三元中。

参见MDN:

cxfofazt

cxfofazt6#

由于您的问题的基础与阅读代码的行为有关,因此我将从这个Angular 来处理这个问题。
所谓的“快速阅读”训练计划的基本原则之一是,他们试图让读者发展一行文本的“完形”,而不是按顺序逐字阅读。您可能会尝试从他们的书中学习一页,并从您的代码中后退一步(如果必要的话,按字面意思),以获得完整行的感觉,而不是将阅读行为视为逐个标记解析的行为。
或者,您可以使用允许您配置样式的编辑器:你可以用不同的颜色来表示三元运算符,这样它就能很好地显示出来。例如,Notepad++有许多内置主题可以做到这一点,许多其他编辑器也是如此。

a11xaf1n

a11xaf1n7#

有两个很好的理由将括号放在三元运算符周围。

  • 许多人认为它更有可读性。如果你也这样做,把括号。有时候把它们放进去是愚蠢的--要始终如一。
  • 缺少括号可能导致不正确的操作顺序,尤其是在以后修改代码时。这类似于忘记预处理器宏周围的括号。考虑下面的第二个语句给出了与第一个不同的结果。

int num =(true?val1:val2)* 2;
int num = true?val1:val2 * 2

相关问题