Должен ли я поставить новые строки до или после бинарных операторов? [закрыто]

11

Когда вы находитесь в Python или Javascript, вы всегда должны помещать бинарные операторы в конец предыдущей строки, чтобы исключить преждевременное завершение вашего кода новыми строками; это помогает вам ловить ошибки.

Но в C или C ++ это не проблема, поэтому мне интересно:

Есть ли причина для меня предпочесть вторую версию первой?

return lots_of_text
       + 1;

против

return lots_of_text +
       1;

(Например, один из них помогает предотвратить другие виды ошибок? Или один из них считается более читабельным?)

user541686
источник
Нет, вы не должны делать это в Python, главным образом потому, что не имеет такого эффекта, который, как вы заявляете, он имеет. Трейлинг-оператор не вызывает продолжения строки; обратная косая черта или наличие открытых скобок, скобок или скобок.
@delnan: я (очень осторожно) никогда не говорил, что это вызывает продолжение строки. Я знаю, что вам все еще нужно заключить в группу символы. Я сказал, что это помогает предотвратить ошибки, связанные с преждевременным завершением строки, что приводит к ошибке.
user541686
Я вижу, но это тоже не делает. По крайней мере, я никогда не видел, чтобы это произошло (и я строго следую правилу PEP 8 о том, чтобы ставить новые строки после операторов), и я не могу представить не надуманный код, который действителен с новой строкой перед оператором, но не после оператора. Например, код, как в вашем первом фрагменте, также содержит ошибки (из-за отступа). Кто-нибудь не добавляет отступы при разбиении строки?
@delnan: На самом деле очень легко случайно испортить отступ с помощью вашего текстового редактора, например, при массовом редактировании или выполнении прямоугольного выделения. И если / когда это произойдет во время технического обслуживания, вы не получите ошибку в первом случае, и она молча проскочит вами, но во втором случае вы получите хорошую ошибку.
user541686
4
Не уверен, почему это было понижено. Это кажется разумным вопросом стиля кодирования.
Стюарт Маркс

Ответы:

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";

Опять же, я могу просто читать по вертикали, чтобы увидеть, что я просто конкатенирую текст, потому что большую часть времени я чувствую, что мне действительно все равно, что находится внутри строк / условий.

Конечно, я бы не стал применять этот стиль безоговорочно. Если бы добавление новой строки после оператора показалось мне более логичным, я бы так и сделал, но пока не могу придумать пример.

phant0m
источник
Добавлена ​​пропущенная скобка в первом примере.
Кевин Клайн
1
+1: точно верно; математика всегда набирается так, что строки продолжения начинаются с оператора.
Кевин Клайн
+1 по тем же причинам, которые вы описываете, но ваш пример PHP выглядит довольно странно для меня. Не следует ли эти concats просто ., не .=?
Изката
@Izkata о да, конечно, вы правы. Спасибо. Кевин: круглые скобки были правильными;) Я просто выровнял их сforce
phant0m
11

Я почти всегда разбиваю строки перед двоичными операторами, чтобы прояснить читателям кода, что это продолжение выражения, а не следующее утверждение. Это важно, если следующий оператор обычно имеет отступ. Например, рассмотрим оператор if со сложным условным выражением:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

Вторая часть условного выражения легко спутать с первым утверждением then-part. Это может привести к путанице, если первая часть условия длинная, а && заканчивается вправо. Сравните это с альтернативой:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Это выглядит немного странно, но совершенно ясно, что вторая часть условия не является началом оператора.

Я делаю это и в других контекстах, но утверждение if является наиболее важным, поскольку отступы неоднозначны. Конечно, можно изменить отступ или расположение скобок, но это тоже выглядит странно.

tl; dr левый конец строки более важен для быстрого понимания прочитанного, поэтому размещение оператора на левом конце является более заметным маркером, так как это продолжение, а не утверждение.

Стюарт Маркс
источник
Интересная мысль, но я все еще нахожу это довольно запутанным (особенно когда это делается +и -которое также можно понимать как унарные префиксные операторы). Обычное решение, чтобы выделить продолжающиеся линии, состоит в том, чтобы сделать их более глубокими (т.е. на два уровня).
Конрад Рудольф
«Вторая часть условного выражения легко спутать с первым оператором then-part» из блока выделяются более четко.
Джорджио
8

Я бы всегда использовал первое. Вы хотите, чтобы было ясно, что вы делаете с этим 1 там. Если бы я увидел это и там была стена текста над этим, я бы понятия не имел, что происходит с использованием этого слова.

Знак «+» рядом с 1 дает понять, что как минимум я делаю что-то с рассматриваемой цифрой 1, а не вывешиваю: «Я весь в вашем коде, чувак ...» без видимой причины.

Мировой инженер
источник
прикомандирован ...........
Джеймс
7

Я чувствую, что это очень помогает в прочтении понимания, когда строка указывает, что оператор продолжается в следующей строке, имея двоичный оператор в конце, и, таким образом, делает оператор неполным. Недостающей точки с запятой мне недостаточно, чтобы сразу понять это.

Это может быть просто вопросом привычки, но если вы не работаете исключительно на языках, которые требуют точки с запятой (что я считаю довольно нереалистичным, учитывая распространенность сценариев оболочки, make-файлов и языков, таких как Python), у вас, вероятно, также не будет этой привычки.

РЕДАКТИРОВАТЬ: Джорджо делает замечание в комментариях: это использование повторяет пунктуацию , как в математике, так и на естественных языках. Ты бы написал

Я тону,
поэтому я плавал

Ты бы не писал

Я тону
, поэтому я плавал

Конрад Рудольф
источник
3
+1: я также склонен читать + в конце строки как запятую, разделяющую два элемента в списке операндов. По этой причине я предпочитаю ставить + в конце строки, как я делаю с запятой (я никогда не начинаю строку с запятой).
Джорджио
@ Джорджио Этот момент настолько хорош, что я украл его для своего ответа. Я надеюсь, что вы можете простить меня.
Конрад Рудольф
Идите дальше: я чувствую себя честью. ;-)
Джорджио
7
Код не является английским, и я думаю, что это ложная аналогия, чтобы использовать правила синтаксиса английского языка как способ оправдать соглашения о кодировании. Мне не нравится стиль трейлинг-оператора, но я признаю, что у Конрада есть хорошая точка зрения о таких языках, как Python.
М. Дадли
3
В математической верстке разрыв строки всегда перед оператором, а не после. В прозаическом примере оператор «поэтому». В английской прозе запятые - это, по сути, метки дыхания.
Кевин Клайн