识别冗余括号

问题描述

通常很容易在程序中发现不必要的括号,但我对在 if 语句中使用括号有点困惑。

public class TestClass {
    void method(String sectionName) {
        if ("Content".equals(sectionName) || "Overview".equals(sectionName)
                // suppression list
                || (!"AbbreviationAsWordInName".equals(sectionName)
                        && !"AbstractClassName".equals(sectionName)
                        )) {
             System.out.println();
         }
    }
}

我觉得第 5 行(!"AbbreviationAsWordInName" 之前)的括号是不必要的。现在的问题是,通常我可以测试代码然后得出结论,但现在我正在修复开源程序中的一些错误,而该插件又被许多其他程序使用,所以我很少感到困惑。

更多示例-

if (active == (forward ? past : future) &&
    ((increasing && switchOnIncrease) || (!increasing && switchOnDecrease))) 

在上面的例子中,我觉得第 2 行有不必要的括号。
另一个例子-

else if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {}

我认为上面的例子中有额外的括号,应该像-

else if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F') {}

请帮我找到一个可靠的解决方案。

解决方法

如果将此 if 语句格式化为一行,您将更清楚地了解语句中实际发生的情况。

if ("Content".equals(sectionName) || "Overview".equals(sectionName) || (!"AbbreviationAsWordInName".equals(sectionName) && "AbstractClassName".equals(sectionName) )) {

现在,如果您查看它并将其分解为多个部分,您会发现只需要满足 3 个条件。

  • 第一。 if ("Content".equals(sectionName))
  • 第二。 if ("Overview".equals(sectionName))
  • 第三。 if (!"AbbreviationAsWordInName".equals(sectionName) && "AbstractClassName".equals(sectionName) )

虽然在 || 之后和关闭括号之前将括号放在第三个条件中可能是正确的,但代码将作为单个条件进行评估 - 对于任何查看第三个条件的人来说,这些“冗余” ' 括号实际上提供了一些关于构成此条件的一部分的清晰性。毫无疑问,这两个 "AbbreviationAsWordInName".equals(sectionName)"AbstractClassName".equals(sectionName) 必须相遇才能评估为真。

如果省略这个括号,人们可能会混淆这两个是否构成单个条件的一部分。

另外值得一提的是,在逻辑表达式中存在一定的优先级,例如:src enter image description here

就像算术运算符一样,逻辑运算符也有一个运算顺序:首先是 NOT,然后是 AND,然后是 OR。如果您在实际需要的地方(甚至没有注意到)在逻辑表达式中省略括号,这可能会导致逻辑上不同的表达式。始终使用括号以确保计算机按预期顺序评估条件。

我想在一天结束时(至少在我看来)最好将逻辑条件清楚地分开,这样它们更容易理解,而且额外的括号,就像缩进、空格和其他样式标准一样,有助于视觉上的组织以合乎逻辑的方式编写代码。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...