Почему некоторые языки рекомендуют использовать пробелы, а не символы табуляции? [закрыто]

10

Может быть, я один в этом, но мало что раздражает меня, как людей, использующих отступы, а не табуляции. Как печатать SpaceSpaceSpaceSpaceлегче и интуитивно понятнее, чем печатать Tab? Конечно, ширина табуляции является переменной, но она гораздо более показательна для отступа, чем для пробелов. То же самое относится и к возврату; Backspace один или четыре раза?

Почему языки, такие как Python, рекомендуют использовать пробелы над вкладками?

Нафтули Кей
источник
24
Вы можете настроить большинство редакторов для вставки пробелов вместо вкладок при нажатии tab. Если вы не можете настроить это в своем любимом редакторе, вам нужен лучший редактор.
Адам Лир
одна вещь, многие редакторы могут быть настроены на вставку 4-8 пробелов при нажатии клавиши «Tab», так что это всего лишь одно нажатие клавиши, как и Tab.
Эхо говорит Восстановить Монику
2
Это все еще не отвечает на мой вопрос. Почему пробелы вместо вкладок? Конечно, вы можете настроить редактор для вставки пробелов вместо вкладок, но вы также можете вставлять вкладки с пробелами. Вопрос в том, почему вы хотите это сделать? Какая возможная выгода получается?
Нафтули Кей
4
@Tk Пробелы однозначные вкладки могут быть изменены
Мартин Беккет
3
@TKKocheran, потому что вкладки делают забавные вещи с вашим выводом, когда вы случайно вставляете их в строку.
zzzzBov

Ответы:

15

Согласованность, в первую очередь.

Кроме того, иногда появляется что-то, что на самом деле использует пробельные символы - например, Python: Скажите, что произойдет, если я выполню следующий фрагмент кода?

def foo():
    print "a"
    print "b"

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

Кроме того, есть разочаровывающие случаи, когда один редактор разработчика имеет вкладки с 8 пробелами, а другой - с 4, а кто-то использует 5 по какой-то странной причине ... Это может выглядеть совершенно нормально на одной рабочей станции, но затем, когда он регистрируется в SVN и кто-то еще обновятся, они увидят ужасный, ужасный беспорядок.

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

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

РЕДАКТИРОВАТЬ: И довольно забавно, сайт, кажется, нормализовал мои вкладки в пробелы, чтобы браузер мог отображать его правильно. Нажмите «изменить», чтобы просмотреть оригинал, вкладки включены;)

Izkata
источник
5
Ваши проблемы с вкладками (особенно с ужасным SVN-беспорядком) возникают только в том случае, если вы используете опцию табуляции в пробелах в вашем редакторе. Если вы и ваша команда согласны отключить опцию табуляции в пространстве, то вкладка всегда будет вкладкой в ​​любом представлении: тогда это просто выбор того, насколько широко вы хотите, чтобы она отображалась в вашем редакторе.
ХорусКол
@HorusKol Нет, ужасный беспорядок в том, что пробелы и табуляции смешались. Я думаю, что я не сделал это достаточно очевидным (см. Одинокое предложение после строки «ужасный, ужасный беспорядок»). Таким образом, пробелы были выровнены так, чтобы они были хорошо выровнены с вкладками, когда они установлены как эквивалентные 4 пробелам, но затем, когда кто-то еще просматривает их (независимо от того, задан ли параметр tabs-to-space), они получают беспорядок.
Изката
4
Я вижу - ну, вам нужно установить руководство для вашей команды - либо постоянно использовать пробелы ИЛИ табуляции ... в любом случае, табуляция - это плохая идея со всех сторон;)
HorusKol
21
Вот почему я считаю идею языков с пробельными символами недостатком дизайна. Вещи, которые вы не видите, никогда не должны нарушать ваш код.
Пол Натан
Просто для записи, я согласен с @PaulNathan
Izkata
11

Это хорошее обсуждение отступов и пробелов в Python; из статьи:

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

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

Для себя я предпочитаю пробелы, потому что код всегда отображается с одинаковым количеством отступов, независимо от того, просматриваю ли я его в IDE или в lessблокноте; то есть пространства более переносимы.

Майк Партридж
источник
3
re: «просматриваю ли я его в IDE, или меньше, или в блокноте; т.е. пробелы более переносимы» - это лучший аргумент для пробелов, которые я когда-либо слышал. Я сам парень с «вкладками», но иногда мне не нравилось видеть код с пробелами, отображаемый неожиданным образом.
Аэрик
2

В Python отступы контролируют ход программы и поэтому жизненно необходимы.
Если вы возьмете код, отформатированный с помощью вкладок, и скопируете его, чтобы вкладки были изменены или потеряны, структура кода будет разрушена. Пробелы всегда пробелы = гораздо безопаснее.

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

Мартин Беккет
источник
Меня больше беспокоит потерянное время, затрачиваемое на ввод пробела или клавиши «пробел» четыре раза по сравнению с одним нажатием клавиши для выполнения обеих задач.
Нафтули Кей
Да, но Python такой странный. Я никогда не сталкивался с чем-то еще, что заботится о местах.
Аэрик
@TKKocheran О, это твоя настоящая забота? Я не знаю, как они это сделали, но vim на моей работе настроен так, чтобы backspace возвращался к последней табуляции, через несколько пробелов, полностью прозрачно
Izkata
Не могли бы вы бросить .vimrcдля меня :)
Нафтули Кей
1
@TKKocheran Нашел - просто set softtabstop=4, и TAB, и BACKSPACE будут использовать 4 пробела в качестве вкладки. (Ну, для каждой табуляции, рассматривая ширину как 4 пробела)
Izkata
2

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

Для примера одного стиля, который обычно требует пробелов, рассмотрим что-то вроде:

call_some_function(parameter1,
                   parameter2,
                   parameter3,
                   parameter4,
                   parameter5,
                   parameter6,
                   parameter7);

Если вы не хотите переименовать все свои функции, чтобы они были точным кратным размеру вкладок (минус одна для скобок), то сами по себе просто не будут этого делать.

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

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

a.m = 9;   // this is the slope
a.i = 4;   // this is the intensity
a.x = 1;   // this is the x-intercept

Поскольку они стоят прямо сейчас, все они выстраиваются идеально. Однако при просмотре шрифтом переменной ширины все становится ужасно. С пробелами комментарии могут (часто будут) слегка выровняться. Однако с вкладками смещение часто становится довольно радикальным:

a.m = 9;          // this is the slope
a.i = 4;  // this is the intensity
a.x = 1;          // this is the x-intercept

Внезапно небольшая разница в ширине между 'i' и 'm' или 'x' в нашем шрифте переменной ширины была увеличена до полной табуляции.

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

Чтобы ответить на ваши другие вопросы: другие уже указали на это, но я не могу представить, чтобы кто-либо в программном редакторе (или многое другое) фактически использовал пробел для вставки пробелов, поэтому ваш вопрос о «наборе текста spacespacespacespace» не имеет значения, потому что никто так не делает. Аналогично с обратным интервалом: трудно представить редактор, который потребовал бы нажатия BkSpcчетыре раза, чтобы перейти к предыдущей позиции табуляции, поэтому (опять же) вопрос не имеет значения.

Итог: с вкладками все в порядке, если вы (и только вы) когда-либо просматриваете свой код, и вы делаете это только с помощью одного редактора, который никогда не перенастраивается (вообще!). Однако эти условия настолько близки к невозможному Убедитесь, что есть только один разумный ответ: никогда не используйте вкладки вообще.

Джерри Гроб
источник
1
Я вижу, вы говорите "пропорциональные шрифты разбивают пробелы и табуляции, но они ломают табуляции хуже, поэтому используйте пробелы". Почему бы не использовать эластичные вкладки? nickgravgaard.com/elastictabstops
амара
@sparkleshy: Это хорошая идея, но она не имеет никакого значения для реального кода, и не будет, пока все (или, по крайней мере, подавляющее большинство) реальных редакторов уже не включат его.
Джерри Коффин
... Я знаю: '(- ну, вроде бы. Вы по-прежнему можете использовать редактор, который поддерживается пробелами (например, клавиша табуляции должна быть, если вы используете пробелы), но притворяется, что это упругие табуляции; это делает управление пробелами проще.
Амара
2
Если вы программируете в шрифтах с пропорциональной шириной, у вас есть гораздо больше проблем, чем просто вкладки, о которых нужно беспокоиться ...
Брайан Ноблаух,
1
@BrianKnoblauch: Как человек, который использует шрифт eurofurence, я должен не согласиться. Единственные вещи, которые когда-либо вызывают у меня проблемы - это пробелы. Это также связано с моим стилем отступов, который никогда не должен отличаться более чем на одну вкладку между строками. Предполагая, что я когда-либо получу эластичные таб-стопы, мой код будет выглядеть еще лучше.
Волхв
2

Большая проблема заключается в несогласованности ширины «табуляции», иногда они отображаются как четыре пробела, иногда восемь. Во многих редакторах вы можете установить их от 1 до 9 пробелов.

Так что это превращает простой редактор WYSWYG в то, что вы видите, это то, что может получить кто-то другой.

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

Джеймс Андерсон
источник