Почему замыкающие пробелы имеют большое значение? [закрыто]


116

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

Это уже звучит как довольно веская причина, чтобы избежать этого, но я хочу посмотреть, есть ли что-то большее, чем это. Итак, почему замыкающие пробелы такие большие дела?


30
Замыкающие пробелы действительно совершают шум. Не могу думать ни о какой другой причине.
Яннис

17
Хороший инструмент сравнения должен быть в состоянии игнорировать конечные (и ведущий тоже, если вы хотите) пропуска. В конце концов, Emacs может сделать это, почему бы не ваши инструменты сравнения?
FrustratedWithFormsDesigner

4
Навигация до конца строки с помощью кнопки «Конец» может привести к путанице с большим количеством пробелов.
Ярек Ковтуненко

11
Я думаю, что вы задаете вопрос неправильно. И наоборот: «Каковы преимущества отстранения пробелов? ». Ответ становится довольно очевидным, когда
задаешь

7
Может быть, вы должны попробовать программирование в Whitespace . * 8 ')
Марк Бут

Ответы:


76

Причины, по которым это важно для меня:

  • Когда я нажимаю клавишу «Конец», я ожидаю, что курсор переместится в конец строки (в зависимости от того, какой редактор я использую и как он настроен), и я ожидаю, что смогу начать печатать прямо сейчас. Если курсор попадает туда, и мне нужно удалить 3 или 4 символа, это раздражает. Особенно, если это противоречит всем файлам.

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

В то время как не строго программирование, пробел может серьезно испортить ввод данных, если в файле есть конечный / ведущий, который будет проанализирован и использован как ввод чего-то другого. Это случается чаще всего, когда чистый, сгенерированный входной файл загрязняется тем, кто его редактирует в Excel или чем-то еще, а затем может появиться конечный пробел (и другие проблемы форматирования).


8
Точка 1 - это проблема вашего редактора, а не конечного пробела.
Марьян Венема

33
@MarjanVenema: Да, редактор может быть спроектирован так, чтобы переходить к последнему непробельному пространству, но тогда вы никогда не узнаете о конечных пробелах (если не указано другое - также я, вероятно, нахожу странным, что END не перейти к концу строки, к чему я привык). Что было бы проблемой с многострочными строковыми литералами. Тогда редактор должен знать, что в многострочном строковом литерале END должен идти до последнего символа, включая пробел. Редактор, который я использую, не такой умный.
FrustratedWithFormsDesigner

2
Я бы добавил, что выделение мышью сложно сделать без выделения лишних пробелов, и это может иметь значение, если это для вырезанной пасты. Или что он генерирует шум, когда фиксирует (в конце концов, конфилирует!) Даром. Не очень большое дело, но много маленьких неприятностей. Это создает ощущение, что предыдущий разработчик был ленивым и ожидал, что вы уйдете в его / ее беспорядок.
Deadalnix

1
@deadalnix: конечно, именно поэтому вам нужен хороший редактор с опциями, которые соответствуют предпочтениям большинства людей. И поэтому пункт 1 является проблемой с редактором, а не конечным пробелом.
Марьян Венема

1
Точка 1 именно поэтому я предпочитаю использовать определенный стиль конечных пробелов: пустые строки с отступом от кода, который они разделяют. Это позволяет сразу вводить новый код без необходимости делать
отступы

29

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

Я предполагаю, что причина этого чувства не в программировании, а в области настольных издательских систем. Вы когда-нибудь получали документ, напечатанный кем-то другим, который нужно было напечатать в публикации? Во всех современных публикациях, особенно при использовании столбцов, принято, чтобы предложения следовали друг за другом последовательно в пределах одного абзаца, а не начинали новую строку для каждого предложения. Что ж, когда есть пробелы в конце, требуется намного больше усилий, чтобы сделать это правильно (много операций поиска и замены, которые устраняют двойные пробелы и т. Д.).

Я знаю, что другие причины (в программировании) - не очень веские, но они настолько беспокоят мою подсознательную психику, что заставляют меня ее устранить:

  • Требуется больше места для хранения, чем необходимо
  • При компиляции парсер должен будет пропустить лишний символ без веской причины.
  • Некоторые редакторы могут добавить дополнительную пустую строку, когда WordWrap включен, и завершающий пробел не подходит

Да, да, я знаю! Я знаю, это нежелательные причины. Я не перфекционист, но ... ну, может быть, я?

Последняя причина, о которой я могу подумать, - это непоследовательное движение курсора. Такое ощущение, что курсор висит в воздухе в конце линии, каждый шаг вправо может привести к его падению или зависанию в неизвестной степени, он просто чувствует себя неустойчивым (как те невидимые или исчезающие блоки, которые Super Марио прыгал).

Вероятно, мне может быть поставлен диагноз trailspacefobia?


Не моя сфера, но мне это кажется странным ... какую систему верстки вы используете в настольных изданиях, которая по умолчанию не игнорирует конечные / множественные пробелы ? Я думал, что способ, которым LaTeX и большинство языков программирования делают это, был стандартным везде, за исключением потребительского мусора WYSIWYG.
оставил около

Adobe InDesign (это также подпадает под WYSIWYG мусор на потребительском уровне?). Да, он будет игнорировать конечные пробелы, но заменит все переводы строк на пробелы в абзаце, и вы получите двойные пробелы (которые не игнорируются), тогда для их устранения потребуется дополнительная замена.
Луи Сомерс

«Настольная публикация» - это не то, что вы делаете с «системой набора текста».
Ракслице

22

Многие из этих ответов почти касаются причины, по которой это плохо для меня, но в основном: это «ломает» текстовые редакторы. Мой опыт с Vim.

Vim спроектирован так, что общие действия отображаются на буквы настолько чисто, что вам даже не нужно думать о том, какую букву или комбинацию клавиш нажимать. Различные горячие клавиши позволяют курсору перемещаться по тексту так быстро, что требуется всего пара нажатий клавиш, чтобы переместить его туда, куда вы хотите. Даже такие вещи, как свертывание блоков кода, быстрая, так как вы можете нажать END или $, чтобы перейти к концу строки, где курсор должен перекрываться {или} или (или) или что-то в этом роде - нет необходимости прерывать поток мыслей для получить представление на экране.

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

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

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


2
Как примечание, скорость набора текста не имеет никакого отношения к тому, используете ли вы мышь для навигации или нет. Некоторая навигация идеально подходит для мыши. ; p
Стивен Джеурис

2
Если вы используете vim, вы можете быстро удалить все оставшиеся пробелы:%s/ *$//
Джорджио

1
@ Джорджио, я знаю, но я не могу просто сделать это в любое время, потому что это считается изменением в управлении версиями
Izkata

@izkata: правда. Я переформатирую файлы, которые нужно изменить, прежде чем регистрировать их, но это проигранное сражение, если другие разработчики продолжают проверять файлы с конечным пробелом.
Джорджио

17

Удивительно, но самый очевидный ответ отсутствует: конечные пробелы могут и будут приводить к трудностям поиска ошибок.

Наиболее очевидная ситуация - многострочные строки. Python, JavaScript и Bash - несколько примеров языков, на которые может повлиять это:

print("Hello\·
····World")

производит:

  File "demo.py", line 1
    print("Hello\
                 ^
SyntaxError: EOL while scanning string literal

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

Хотя выделение синтаксиса может помочь избежать таких случаев, еще проще избежать проблемы, не пропуская пробелы в конце строк. Вот почему некоторые средства проверки стиля будут выдавать предупреждение при обнаружении пробелов, а некоторые редакторы будут обрезать их автоматически.

введите описание изображения здесь

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

Другой контекст, кратко упомянутый в предыдущем ответе , это данные, хранящиеся в файлах.

Например, файлы CSV, содержащие конечные пробелы, могут вызывать несогласованность данных, что также очень трудно обнаружить: совместимые со стандартами синтаксические анализаторы будут обрезать пробелы (стандарт указывает, что начальные или конечные пробелы не имеют значения, если они не разделены двойными кавычками), но некоторые синтаксические анализаторы могут плохо себя вести и оставить пробел как часть значения.

Другие пользовательские форматы могут, в частности, учитывать, что пробел является частью значения, что приводит к непротиворечивым, но все еще трудным для отладки ситуациям.


14

Недавно я провел день в поисках ошибки, которая оказалась неожиданным конечным пробелом в данных.


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

@kevincline - должно быть по крайней мере. Если это не видно на экране или на распечатке, я не хочу об этом думать.
Ладья

6
Поскольку вы потратили день на поиск ошибки, пробелы в пробелах - это большое дело? Пожалуйста, измените ваш ответ, чтобы быть более общим, чем это. Добавьте некоторую предысторию, аргументацию ... У меня лично никогда не было проблем с запаздывающими пробелами, но я не использую это как вывод, что они также не являются проблемой.
Стивен Джеурис

2
@Steven Trailing whitespace вызвал ошибку, которую было трудно отследить. Похоже, хороший ответ для меня. Вы можете представить, как в такой ситуации может произойти сбой кода для разбора данных.
Уилл Шеппард

Я удалил пробелы в конце данных, и теперь тест не пройден. Вы несете ответственность за это. Как вас зовут? Куда мне отправить счет?
Томас Веллер

8

Когда я выбираю исходный код программы для того, чтобы скопировать и вставить его (или удалить), я нахожу это немного раздражающим, когда вижу все нерегулярные лишние пробелы в конце строк: так как мне приходится читать код, пока я его выбираю замыкающий пробел - это ненужный шум. Пример (точки обозначают пробел):

if (fp)........
{....
    fclose(fp);.
}
else
{.....
    prinft("File is NULL\n");
}..

Этот пример является искусственным, но я видел много кода, который выглядит следующим образом.


7

Помимо очевидной проблемы, что это нарушает разбор в некоторых случаях? Как заметил другой автор, это может привести к тонким и трудным для отслеживания ошибкам. Пробелы не всегда незначительны. В некоторых случаях конечные пробелы могут значительно изменить смысл строки кода или данных.

В большинстве случаев существуют пробелы для форматирования кода для читателей. Конечный пробел может указывать на несколько вещей, включая:

  • Неполное утверждение;
  • Недостающий комментарий;
  • Ошибочное редактирование; или же
  • Небрежное редактирование.

Два из них могут привести к неправильному функционированию, а другой может затруднить понимание кода.


4

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.