【问题标题】:Should parenthesis always be placed around the ternary operator?括号是否应该始终放在三元运算符周围?
【发布时间】:2011-04-06 22:51:34
【问题描述】:

Checkstyle 抱怨以下问题:

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

并说括号是不必要的。

虽然没有它们,该声明当然可以正常工作,但如果有它们,它似乎更具可读性——否则,当我阅读它时,我倾向于看到:

return null

先停下来考虑剩下的

== a ? a : new A(); 

部分,因为我的大脑已经走上了一条路。

此外,我倾向于做同样的事情每当我看到一个三元运算符,除非它被分组在括号中。

那么:三元组周围的括号是否应该成为事实上的标准?有什么理由不把它们放在那里吗?

【问题讨论】:

  • 对我来说,使用括号也更具可读性。我有一个像 var thing = something.prop1.method2().... 这样的例子? x:是的。阅读它,我首先期待 something.prop1.method2 将是初始化我的 var 的东西。如果有括号...我会怀疑正在使用三元运算符。

标签: java ternary-operator


【解决方案1】:

好吧,checkstyle 是对的,括号对执行没有用。但对执行无用并不意味着对代码的良好阅读无用。如果阅读更有意义,您应该留下它们。

我认为这段代码不需要更多的括号:

int number = (myBoolean)? 1 : 2;

但在您的情况下,return 关键字和您的布尔值是一个表达式这一事实可能会改变您阅读语句的方式。

【讨论】:

  • 你为什么在你的示例代码中把括号放在myBoolean 周围?这与被问及的模式不同。
  • 我也更喜欢这种语法。似乎它更容易阅读和识别条件
【解决方案2】:

阅读 return 语句时,我知道 'return' 和 ';' 之间的所有内容是要返回的内容,因此我无法将您的代码示例读取为 return null 后跟一些符号,因为您声称您已阅读它。

也许阅读解析技术可能会帮助您像我一样看待它。也就是说,我还没有真正阅读过解析技术,尽管这些年来我拼凑了一些解析器。

我总是删除不必要的括号。它们对代码理解没有帮助,因为我非常了解 Java 的运算符优先级。我不确定的奇怪时间,我添加括号并等待看看 IDEA 是否告诉我它们是多余的。然后我删除它们,并尝试记住我刚刚发现的优先规则。

在我继承的代码库中,我倾向于在由于其他原因而较差的代码区域中找到最多的冗余括号,因此我将两者联系起来。

【讨论】:

    【解决方案3】:

    不,它不应该是事实上的标准。我更喜欢不带括号的。

    我认为将它们放在那里的唯一原因是强制评估顺序或澄清令人困惑的行。

    【讨论】:

      【解决方案4】:

      这两个选项都是正确的,使用你的团队使用的或者你喜欢的,如果你单独工作。

      IIRC 默认情况下,checkstyle 使用 Sun 的 (rip) 风格指南,所以如果你想符合标准风格,听它并删除括号。

      【讨论】:

        【解决方案5】:

        一般来说,没有

        括号不需要围绕三元(也称为条件)运算符或其部分,因为它们的优先级在运算顺序中非常低(仅低于逻辑运算符和高于赋值)。有关完整表格,请参阅下面的链接。

        因此,可以说,这种不必要的括号视觉上混乱代码,并且它们揭示了程序员缺乏理解

        可能需要在三元组中或周围使用括号的例外情况是:

        • 如果你的三进制足够复杂,需要多行;然后,您可以将语句括在括号中,以防止自动插入分号。

        • 如果您的三元组嵌套在另一个三元组中。

        参见 MDN:

        【讨论】:

          【解决方案6】:

          由于您的问题的基础与阅读代码的行为有关,我将从这个角度来处理这个问题。

          所谓的“速读”训练计划的一个基本原则是,它们试图让读者形成一行文本的格式塔,而不是按单词顺序阅读它——逐字逐句。您可能会尝试从他们的书中获取一页并从您的代码中退后一步——如果有必要的话——从字面上理解——以了解整行,而不是将阅读行为视为逐个令牌解析的行为。

          或者,您可以使用一个编辑器来配置样式:您可以将三元运算符设置为不同的颜色,以便它跳出来。例如,Notepad++ 有许多内置主题可以做到这一点,许多其他编辑器也是如此。

          【讨论】:

            猜你喜欢
            • 2017-02-01
            • 2013-05-17
            • 2021-07-26
            • 1970-01-01
            • 2021-03-29
            • 2021-10-06
            • 1970-01-01
            • 2015-08-04
            • 2020-11-02
            相关资源
            最近更新 更多