我应该在二进制运算符之前还是之后放置换行符?[关闭]


11

使用Python或Javascript时,应始终将二进制运算符放在上一行的末尾,以防止换行符过早地终止代码。它可以帮助您发现错误。

但是在C或C ++中,这不是问题,所以我想知道:

我有什么理由比第二个版本更喜欢第二个版本吗?

return lots_of_text
       + 1;

return lots_of_text +
       1;

(例如,其中之一有助于防止其他类型的错误吗?还是其中之一被认为更具可读性?)


不,您不应该在Python中这样做,主要是因为没有达到您声称的效果。尾随运算符不会导致行继续;反斜杠或括号,括号或花括号都没有。

@delnan:我(非常小心)从未说过会导致行继续。我知道您仍然需要将分组字符括起来。我说过,通过给您一个错误,它可以防止行过早结束的错误。
user541686

我知道了,但也没有这样做。至少我从未见过这种情况发生(并且我严格遵守PEP 8关于在运算符后添加换行符的规则),而且我无法想象非人为设计的代码对换行符在运算符之前有效,但在运算符之后无效。例如,第一个代码段中的代码也会出错(由于缩进)。分割行时是否有人不添加缩进?

@delnan:实际上很容易用文本编辑器意外地缩进缩进,例如在批量编辑或进行矩形选择时。而且,如果/在维护期间发生这种情况,则在第一种情况下您不会收到任何错误,并且会悄悄地溜走,但是在第二种情况下您会得到一个不错的错误。
user541686

4
不知道为什么这被否决了。似乎是一个合理的编码风格问题。
Stuart Marks

Answers:


18

从答案中可以看出,在此问题上尚未达成共识。除非您与团队合作,否则请使用更喜欢的东西。


更喜欢在运算符之前插入换行符。

每当我必须换行时,我通常最多在同一行上放置一个术语:

牛顿的Python引力定律:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

比较一下:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

我想知道,我“ 距离平方除以”,我不想知道,“ mass_2 除以”,因为那不是我对数学表达式的看法。

此外,我通常首先要知道,什么我做的(运营商),之前我关心什么,我做的事情(操作数)。

或考虑以下复杂的SQL语句:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

这使我能够轻松地了解各个条件的连接方式,只需从上至下浏览,而不必阅读每一行直到最后找到操作员,而不是:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

我想在“而言前者X是真实的”,那么我修改那个说:“ 这样也不错”,这感觉比周围的其他方法更自然的我。此外,我发现第一个视觉上更容易解析。

或一个PHP示例:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

再说一次,我可以垂直浏览一下,看看我只是在串联文本,因为大多数时候,我觉得我实际上并不在乎字符串/条件中的内容。

当然,我不会无条件地应用此样式。如果将换行符放在操作员看来对我来说更有意义,我会这样做,但目前我无法想到一个示例。


在第一个示例中添加了缺少的括号。
凯文·克莱恩

1
+1:完全正确;数学总是要排版的,以便续行以运算符开头。
凯文·克莱恩

+1与您描述的原因相同,但是您的PHP示例对我来说奇怪。那些混搭.不是.=吗?
Izkata 2012年

@Izkata哦,是的,您当然是正确的。谢谢。凯文:括号是正确的;)我只是将它们与force
phant0m

11

我几乎总是二进制运算符之前换行以使代码读者清楚这是表达式的延续而不是下一条语句。如果下一条语句通常会缩进,则这一点很重要。例如,考虑具有复杂条件表达式的if语句:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

条件表达式的第二部分很容易与then部分的第一条语句混淆。如果条件的第一部分很长,并且&&最终偏离右侧,则可能会造成混乱。将此与替代方法进行比较:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

这看起来有些奇怪,但是很清楚条件的第二部分不是语句的开始。

我也在其他情况下执行此操作,但是if语句最重要,因为缩进模棱两可。当然,可以更改缩进或支撑位置,但这看起来也很奇怪。

tl; dr该行的左端对于快速阅读理解更重要,因此将运算符放在左端是一个更加突出的标记,它表示这是一个连续表达式,而不是陈述。


有趣的想法,但我仍然感到这很混乱(尤其是在完成时+-也可以理解为一元前缀运算符)。使连续线脱颖而出的通常解决方案是使它们缩进更多(即两个级别)。
康拉德·鲁道夫2012年

“条件表达式的第二部分很容易与then部分的第一条语句混淆。”:如果垂直对齐“ {”和“}”(同一列)以使其开头和结尾,则不会发生这种情况的块更加突出。
乔治

8

我总是会用第一个。您希望弄清楚那里的那一处在做什么。如果我看到它,并且在1上方有文字墙,那么我将不知道1的使用情况。

紧邻1的'+'清楚地表明,至少我正在对有问题的1做某事,而不是出于明显的原因而挂出“我全都在您的代码中...”。


借调了...........
詹姆斯(James)

7

我认为,如果在一行中通过在末尾使用二进制运算符来指示该语句在下一行中继续执行,则将极大地帮助您理解理解,从而使该语句不完整。缺少分号不足以让我立即理解。

这可能只是一个习惯问题,但是除非您只使用需要分号的语言(鉴于Shell脚本,makefile和Python等语言的普遍性,我认为这是不现实的),否则您也不会有这种习惯。

编辑:Giorgio在评论中提出了一个极好的观点:这种用法在数学和自然语言中都呼应了常见的标点符号。你会写

我下沉,
所以游泳

不会

我下沉
,所以游泳


3
+1:我也倾向于将行末的+读作逗号,以分隔操作数列表中的两个项目。出于这个原因,我喜欢将+放在行尾,就像对待逗号一样(我永远不会以逗号开始一行)。
乔治

@Giorgio这一点非常好,我已经偷了它作为答案。我希望你能原谅我。
康拉德·鲁道夫2012年

继续:我感到很荣幸。;-)
乔治

7
代码不是英语,我认为使用英语语法规则作为证明编码约定的一种方式是错误的类比。我不喜欢尾随的运算符样式,但我承认Konrad对Python之类的语言很了解。
M. Dudley

3
在数学排版中,换行符始终在运算符之前,而不是之后。在平淡无奇的示例中,运算符为“因此”。在英文散文中,逗号本质上是呼吸的标记。
凯文·克莱恩
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.