Чи слід ставити нові рядки до або після двійкових операторів? [зачинено]


11

Якщо ви перебуваєте в Python або Javascript, вам слід завжди ставити двійкові оператори в кінці попереднього рядка, щоб запобігти передчасному припиненню коду нових рядків; це допомагає вам виявити помилки.

Але для C або C ++ це не проблема, тому мені цікаво:

Чи є якась причина, щоб я віддав перевагу другому варіанту першому?

return lots_of_text
       + 1;

проти

return lots_of_text +
       1;

(Наприклад, чи допомагає одна з них запобігти виникненню інших помилок? Або одна з них вважається більш читаною?)


Ні, ви не повинні робити цього в Python, здебільшого тому, що це не має ефекту, який ви стверджуєте, що це має. Кінцевий оператор не викликає продовження рядка; зворотна косою рисою або з незакритими дужками, дужками або дужками.

@delnan: Я (дуже обережно) ніколи не сказав, що це призводить до продовження рядка. Я знаю, що вам все ще потрібно укласти групування символів. Я сказав, що це допомагає запобігти помилкам, коли ваш рядок закінчується передчасно, що це робить, видаючи вам помилку.
користувач541686

Я бачу, але це теж не робить. Принаймні, я ніколи не бачив, щоб це сталося (і я суворо дотримуюсь правила PEP 8 щодо розміщення нових рядків після операторів), і не можу уявити непридуманий код, який дійсний для нового рядка перед оператором, але не після оператора. Наприклад, код, як у першому фрагменті, також має помилки (через відступ). Хтось не додає відступів під час поділу рядка?

@delnan: Насправді дуже легко випадково закрутити відступи у вашому текстовому редакторі, наприклад, під час групового редагування чи прямокутного вибору. І якщо / коли це станеться під час технічного обслуговування, ви не отримаєте помилки в першому випадку, і вона мовчки проскочить за вами, але ви отримаєте приємну помилку у другому випадку.
користувач541686

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

Знову ж таки, я можу просто прочеркнути прочитане вертикально, щоб побачити, що я просто об'єднуючий текст, бо більшу частину часу я відчуваю, що мені насправді не важливо, що знаходиться в рядках / умовах.

Звичайно, я б не застосовував цей стиль беззастережно. Якщо розміщення нової лінії після того, як оператор, здається, має для мене більше сенсу, я б це зробив, але наразі не можу придумати приклад.


До першого прикладу додані відсутні дужки.
Кевін Клайн

1
+1: абсолютно правильно; математика завжди набирається так, що лінії продовження починаються з оператора.
кевін клайн

+1 з тих же причин ви описуєте, але ваш PHP приклад виглядає досить дивно для мене. Чи не повинні бути ці конмати ., чи не так .=?
Ізката

@Izkata о так, ти прав, звичайно. Дякую. Кевін: Дужки були правильними;) Я щойно їх вирівнявforce
phant0m

11

Я майже завжди перериваю рядки перед бінарними операторами, щоб зрозуміти читачам коду, що це продовження виразу, а не наступне твердження. Це важливо, якщо наступне твердження зазвичай буде з відступом. Наприклад, розглянемо оператор if, який має складний умовний вираз:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

Другу частину умовного виразу легко сплутати з першим твердженням тодішньої частини. Це може бути дуже заплутано, якщо перша частина умови тривала, а && закінчується праворуч. Порівняйте це з альтернативою:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Це виглядає дещо дивним, але це дає зрозуміти, що друга частина умови не є початком заяви.

Я це роблю і в інших контекстах, але найвище значення є твердженням if, оскільки відступ є неоднозначним. Звичайно, можна змінити відступ або розміщення дужок, але це також виглядає дивно.

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


Цікава думка, але мені здається, що це досить заплутано (особливо, коли це зроблено, +і -що також можна розуміти як оператори унарних префіксів). Звичайним рішенням виділити продовжуючі лінії є відступ їх більше (тобто на два рівні).
Конрад Рудольф

"Другу частину умовного виразу легко плутати з першим твердженням тодішньої частини.": Це не відбувається, якщо вирівняти вертикально "{" і "}" (той самий стовпець), щоб зробити початок і кінець блоку виділяються чіткіше.
Джорджіо

8

Я завжди використовував би першу. Ви хочете, щоб було зрозуміло, що ви робите з цим 1 там. Якби я це бачив, а над цим було стінка тексту 1, я б поняття не мав, що відбувається в частині використання цього 1.

Значення "+" поруч із 1 дає зрозуміти, що як мінімум я щось роблю з питанням 1, а не зависаю, ідучи "Я весь у твоєму коді ..." без видимих ​​причин.


відряджений ...........
Джеймс

7

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

Це може бути просто питанням звички, але якщо ви не працюєте виключно мовами, для яких потрібна крапка з комою (що я вважаю досить нереальним, враховуючи всю розповсюдженість скриптів оболонок, файлів і мов, таких як Python), ви, ймовірно, не матимете і цієї звички.

EDIT: Джорджіо відзначає чудові коментарі: це використання повторюється загальними пунктуаційними знаками , як з математики, так і з природничих мов. Ви б написали

Я тону,
тому поплив

Ти б не писав

Я тону
, тому поплив


3
+1: Я також схильний читати + в кінці рядка як кома, що розділяє два елементи у списку операндів. З цієї причини я вважаю за краще ставити + у кінці рядка, як це робив би з комою (я б ніколи не запускав рядок з комою).
Джорджіо

@Giorgio Цей пункт настільки чудовий, що я його вкрав за свою відповідь. Сподіваюся, ви можете мені пробачити.
Конрад Рудольф

Вперед: я відчуваю себе шанованим. ;-)
Джорджіо

7
Код не є англійською мовою, і я думаю, що помилковою аналогією є використання англійських синтаксичних правил як способу виправдання умов кодування. Мені не подобається стиль трейлінг-оператора, але я визнаю, що Конрад має хорошу думку щодо таких мов, як Python.
М. Дадлі

3
При математичному наборі перерив рядка завжди перед оператором, а не після. У прозаїчному прикладі оператор - "отже". В англійській прозі комами є по суті знаки дихання.
Кевін Клайн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.