尽管Sun的Java代码约定建议将换行符放在操作员之前,但许多其他准则也对此表示反对。我看不出任何明显的利弊,因此使用其中一种样式相对于另一种样式是否有优势?
String longVarName = a + b + c + d +
e + f;
与
String longVarName = a + b + c + d
+ e + f;
尽管Sun的Java代码约定建议将换行符放在操作员之前,但许多其他准则也对此表示反对。我看不出任何明显的利弊,因此使用其中一种样式相对于另一种样式是否有优势?
String longVarName = a + b + c + d +
e + f;
与
String longVarName = a + b + c + d
+ e + f;
Answers:
我将其放在一行上,而是根据意图揭示变量名(和函数)来考虑可读性。
一旦变得混乱,就该重构:
例
subtotal = price * (100 + tax_ratio) / 100`
与
tax = price * tax_ratio / 100
subtotal = price + tax
price * (100 + tax_ratio) / 100
或price * (1 + tax_ratio)
,取决于tax_ratio
是百分比还是小数。
我可以想象可读性是一个争论
result = longidentifier +
short -
alittlelonger -
c;
与
result = longidentifier
+ short
- alittlelonger
- c;
在第二个示例中,运算符排列很好,您可以轻松地看到变量以哪种符号输入方程式。我认为这对于二进制运算符也很有意义,但是在使用括号等时,您应该做任何更清楚的事情。
我通常遵循最常用的样式准则或某些编码标准工具。当您阅读别人的代码或参与设置样式指南的开放源代码项目时,使用常用样式的好处会带来好处。
我见过的最常见的样式是问题中的第二种样式。请参阅下面的列表:
如果在非分配运算符处折断了一条线,则该破折号在符号之前出现。
在操作员面前休息
操作员必须换行
在代码中,我倾向于将中断符放在运算符之后:
foo = some_long_expression() +
some_other_long_expression();
在这里,行尾的悬挂运算符对于读者来说是代码继续的重要线索。在没有语句终止符的语言中,悬空运算符可以作为编译器/解释器代码继续的充分线索(否则,我将不得不使用一些难看的连续行构造)。
在记录该表达式时(如果需要记录),我倾向于将中断符放在运算符之前。
只要您保持一致,就知道这两种方式都没有真正的优势。当考虑代码合并和空格时,这尤其重要。
我认为该行应以您要中断的语句的分析树中的最高符号开头。它突出显示了表达式中最重要的运算符。这是您将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()
};
对于长算术方程式,我通常执行以下两项操作之一。
将所有内容放在一行上:
foo = bar + baz - fizz + buzz + alpha - beta;
我通常对仅包含加法和减法的方程式执行此操作,我发现用乘法和除法进行拼写非常容易,这会严重破坏运算符的范围。
我使用的第二种格式是渐进运算符:
foo = bar;
foo += baz;
foo -= fizz;
foo += buzz;
foo /= alpha - beta;
foo *= spiff;
我认为没有理由将其缩短为一行,除非可以证明它以明显的方式提高了性能。此外,对于在哪里发生的事情没有任何歧义,并且将/
and *
运算符放到括号中的机会也更少。
将表达式放在一行上,如果它变得太长,则将其分解为较小的表达式:
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