Programming languages 在程序中使用括号会降低可读性的例子有哪些?

Programming languages 在程序中使用括号会降低可读性的例子有哪些?,programming-languages,parentheses,language-concepts,Programming Languages,Parentheses,Language Concepts,我一直认为括号提高了可读性,但在我的教科书中有一句话,括号的使用大大降低了程序的可读性。有人举过例子吗?如果一个方法不带参数,为什么需要一个空的()来调用方法()?我相信groovy你不需要这么做。显然,你的教科书是由讨厌Lisp的人写的 无论如何,这是一个品味的问题,没有一个真理适合每个人。我认为括号不是提高代码可读性的最佳方法。例如,可以使用新行在if语句中的条件下划线。如果不需要,我就不使用括号

我一直认为括号提高了可读性,但在我的教科书中有一句话,括号的使用大大降低了程序的可读性。有人举过例子吗?

如果一个方法不带参数,为什么需要一个空的
()
来调用
方法()
?我相信groovy你不需要这么做。

显然,你的教科书是由讨厌Lisp的人写的


无论如何,这是一个品味的问题,没有一个真理适合每个人。

我认为括号不是提高代码可读性的最佳方法。例如,可以使用新行在if语句中的条件下划线。如果不需要,我就不使用括号
if(((a == null) || (!(a.isSomething()))) && ((b == null) || (!(b.isSomething()))))
{
   // do some stuff
}
Result=(x*y+p*q-1)%t

Result=((x*y)+(p*q))-1)%t

就我个人而言,我更喜欢前者(但那只是我自己),因为后者让我认为偏执狂是为了改变实际的操作顺序,而事实上他们并没有这样做。你的教科书也可能提到什么时候你可以把你的计算分成多个变量。例如,在求解二次型
ax^2+bx+c=0时,您可能会遇到类似的情况:

x1=(-b+sqrt(b*b-4*a*c))/(2*a)

看起来确实有点难看。在我看来,这看起来更好:

SqrtDelta = sqrt(b*b - 4*a*c);
x1 = (-b + SqrtDelta) / (2*a);

这只是一个简单的例子,当你使用涉及大量计算的算法时,事情会变得非常糟糕,因此将计算分成多个部分将比偏执论更有助于可读性。

我可以找到很多反例,其中缺少括号会降低可读性,但我能想到的关于作者的意思的唯一例子是:

if(((a == null) || (!(a.isSomething()))) && ((b == null) || (!(b.isSomething()))))
{
   // do some stuff
}
在上面的例子中,方法调用周围的()是不必要的,这种代码可能会受益于将术语分解成变量。所有这些亲密的父母处于中间状态,很难确切地看出什么是与什么组合的。

boolean aIsNotSomething = (a == null) || !a.isSomething();  // parens for readability
boolean bIsNotSomething = (b == null) || !b.isSomething();  // ditto
if(aIsNotSomething && bIsNotSomething)
{
   // do some stuff
}
我认为以上内容更具可读性,但这是我个人的观点。这可能就是作者所说的

parens的一些好用法:

  • 在没有参数的情况下,区分行为改变时的操作顺序
  • 当行为不受影响时,要区分操作顺序,但不太了解绑定规则的人将阅读您的代码。好公民规则
  • 表示在用于更大表达式之前,应先对参数中的表达式求值:
    System.out.println(“答案是“+(a+b))
可能会混淆对paren的使用:

  • 在不可能有其他含义的地方,比如在上面的
    a.isSomething()
    前面。在Java中,如果
    a
    对象,
    !一个
    本身就是一个错误,很明显,
    !a、 isSomething()
    必须否定方法调用的返回值
  • 将大量的条件或表达式链接在一起,如果分解这些条件或表达式,会更清晰。正如上面的代码示例中所示,将大型偏执语句分解为较小的块可以让代码在调试器中更直接地逐步执行,并且如果代码后面需要条件/值,则不会重复表达式并执行两次。不过,这是主观的,如果只在一个位置使用表达式,并且调试器仍然显示中间计算的表达式,则显然没有意义

任何极端化和/或过度使用的东西都会使代码无法阅读。用评论来表达同样的观点并不难。如果您曾经看过几乎每一行代码都有注释的代码,您会发现它很难阅读。或者你可以在每一行代码周围都有空白,这会使每一行代码易于阅读,但通常大多数人都希望类似的相关行(这不需要使用突破方法)被组合在一起。

你必须对它们进行过度处理,以真正损害可读性,但作为个人品味的问题,我总是发现

return (x + 1);

<>和C和C++代码中的相似之处非常令人恼火。

括号在强<明显冗余> <强>时可降低可读性。读者希望他们在那里是有原因的,但没有理由。因此,出现了认知性呃逆

我所说的“明显”冗余是什么意思

  • 如果可以在不改变程序含义的情况下删除括号,则括号是多余的

  • 用于消除中缀运算符歧义的括号并非“明显冗余”,即使它们是冗余的,但可能在乘法和加法运算符的非常特殊的情况下除外。原因:许多语言的优先级在10到15级之间,许多人使用多种语言工作,并且没有人能够记住所有规则。通常最好消除歧义,即使括号是多余的

  • 所有其他多余的括号显然都是多余的

在学习一门新语言的人编写的代码中经常会发现多余的括号;也许新语法的不确定性会导致防御性插入。 清除他们


你要求举例说明。以下是我在初学者编写的ML代码和Haskell代码中反复看到的三个示例:

  • 如果(…)那么
    之间的括号总是多余和分散注意力的。它们使作者看起来像一个C程序员。如果。。。然后

  • 变量周围的括号很傻,如
    print(x)
    中的括号。变量周围不需要括号;这个
    length xs + 1