运算符前后的换行符[关闭]


29

尽管Sun的Java代码约定建议将换行符放在操作员之前,但许多其他准则也对此表示反对。我看不出任何明显的利弊,因此使用其中一种样式相对于另一种样式是否有优势?

String longVarName = a + b + c + d +
          e + f;

String longVarName = a + b + c + d
          + e + f;

您能否发布一个显示两种约定的简单代码示例?
迈克尔

首先,我将尝试通过使用以下方法来避免这种情况:download.oracle.com/javase/1.4.2/docs/api/java/lang/…–
Job

链接断开。
Florian F

Answers:


14

我将其放在一行上,而是根据意图揭示变量名(和函数)来考虑可读性。

一旦变得混乱,就该重构

  • 重命名vars
  • 引入新的变量/函数

subtotal = price * (100 + tax_ratio) / 100`

tax = price * tax_ratio / 100
subtotal = price + tax

2
左侧的公式不正确。它应该是price * (100 + tax_ratio) / 100price * (1 + tax_ratio),取决于tax_ratio是百分比还是小数。
Rufflewind 2014年

4
这不能回答问题。应该有法律禁止这类答复。
爱德华D'Souza

@ EdwardD'Souza我也有同感。但是,为什么答案被接受?
Rudy Vissers

@RudyVissers答案可以更深入地解决问题。它解决了首先需要换行的问题。从这个角度来看,OP可以认为这是他或她的问题的答案,但是从这是一个社区Wiki的角度来看仍然不合适。
Edward D'Souza

嘿,我不再在这里了,但是这很简单-如果您发现自己处在这种情况下,可能是做错了,您应该考虑重构代码-或者在编程15年后将其换句话说,我只是不再关心这些事情了,我关心的是代码的清晰度,简洁性以及让其他人轻松地帮助我
KamilTomšík

36

我可以想象可读性是一个争论

result = longidentifier +
   short -
   alittlelonger -
   c;

result = longidentifier
   + short
   - alittlelonger
   - c;

在第二个示例中,运算符排列很好,您可以轻松地看到变量以哪种符号输入方程式。我认为这对于二进制运算符也很有意义,但是在使用括号等时,您应该做任何更清楚的事情。


4
对于运算符很重要的情况(例如数学表达式等),我会选择第二个,因为正如您所说,它更具可读性。但是对于字符串,我会选择第一个选项,因为运算符是“无意义的”。除了将字符串放在一起,他们什么也不做,而且因为字符串是重要的一环,所以我更喜欢第一种选择。
Niklas H

两种情况都有其优点。这两种情况都比将它们全部排成一列很长!我的偏好是在开始时使用开括号(即使不需要),然后将所有内容对齐。这使它更加明显。
quick_now 2011年

35

我通常遵循最常用的样式准则或某些编码标准工具。当您阅读别人的代码或参与设置样式指南的开放源代码项目时,使用常用样式的好处会带来好处。

我见过的最常见的样式是问题中的第二种样式。请参阅下面的列表:

Google风格指南

如果在非分配运算符处折断了一条线,则该破折号在符号之前出现。

太阳编码惯例

在操作员面前休息

Checkstyle运算符环绕检查默认值为 nl:

操作员必须换行


2
为了清楚起见,我更新了我的答案+ Sun的编码约定。
ceilfors 2014年


10

在代码中,我倾向于将中断符放在运算符之后:

foo = some_long_expression() +
      some_other_long_expression();

在这里,行尾的悬挂运算符对于读者来说是代码继续的重要线索。在没有语句终止符的语言中,悬空运算符可以作为编译器/解释器代码继续的充分线索(否则,我将不得不使用一些难看的连续行构造)。

在记录该表达式时(如果需要记录),我倾向于将中断符放在运算符之前。


至少某些语言(例如Python)不使用尾随的二进制运算符来暗示该行继续,但是需要更多。请注意,括号内的换行符通常不计算在内,因此您不需要显式(且易于出错)的行连续字符。


3

我认为该行应以您要中断的语句的分析树中的最高符号开头。它突出显示了表达式中最重要的运算符。这是您将else放在行的开头而不是前一行的末尾的相同原因。

在下面的示例中,扫描左边距,您可以看到该语句的结构为3个表达式的OR。

if (ch>='A' && ch<='Z'
    || ch>='a' && ch<='z'
    || ch>='0' && ch<='9')
{...}

在下面,|| 运算符不太突出。它不太明显是|| 的表达。特别是如果线条的长度不同。

if (ch>='A' && ch<='Z' ||
    ch>='a' && ch<='z' ||
    ch>='0' && ch<='9')
{...}

仅作为参考,这是非常错误的。|| 运算符根本不突出显示。

if ( ch>='A' && ch<='Z' || ch>='a'
     && ch<='z' || ch>='0' && ch<='9')
{...}

即使我很少看到,我什至喜欢在行的开头加上逗号。我不要在共享代码上这样做。

var note:Object =
    { key: key
    , type: 'P'
    , text: someLongProcedureCallGettingTheUserInitials()
       + ": " + getTheTextThatWasTyped()
    };

2

对于长算术方程式,我通常执行以下两项操作之一。

将所有内容放在一行上:

foo = bar + baz - fizz + buzz + alpha - beta;

我通常对包含加法和减法的方程式执行此操作,我发现用乘法和除法进行拼写非常容易,这会严重破坏运算符的范围。

我使用的第二种格式是渐进运算符:

foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;

我认为没有理由将其缩短为一行,除非可以证明它以明显的方式提高了性能。此外,对于在哪里发生的事情没有任何歧义,并且将/and *运算符放到括号中的机会也更少。


2

在行的开头放置串联字符(或任何运算符)可以提高可读性。我们通过关注每一行的开头来扫描代码。当一行以运算符开头时,读者可以通过扫描该字符来判断该行是上一条语句的延续。

长的数学表达式始终会被排版,以便每行都以运算符开头。没有理由代码不应该遵循此约定。


0

将表达式放在一行上,如果它变得太长,则将其分解为较小的表达式:

days = ((year * months_per_year) + month) * days_per_month + day

变成:

months = year * months_per_year + month
days = months * days_per_month + day

如果无法做到这一点,那么我发现在操作员之前中断它更具可读性,并让操作员直接在上一个赋值下开始(将其放在变量之下使我不得不思考和更新,鉴于目标,这很烦人是为了使事情更容易阅读):

random = years * months_per_year 
         + month * days_per_month 
         + day * hours_per_day 
         + hour * minutes_per_hour 
         + minute * seconds_per_minute 
         + second

1
这个答案不会对已经说过的东西增加任何新的东西。
马丁·彼得
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.