Персональные инструменты
 

Why I prefer no tabs in source code (Так говорил Виталий)

Материал из CustisWiki

Перейти к: навигация, поиск

Документ Why I prefer no tabs in source code начинается с очень разумной строчки:

Многие программисты смешивают в исходниках пробелы с табами — символами табуляции с ASCII-кодом 09, вместо того, чтобы использовать несколько (обычно 8) пробелов вместо таба.

Но дальше, вместо того, чтобы эту мысль развить, автор зачем-то переходит к другим, не очень разумным аргументам. Поэтому и существует «контр-документ» http://derkarl.org/why_to_tabs.html, который с точки зрения чёткости аргументации мне нравится больше, несмотря на то, что сам я в своём коде всегда использую пробелы.

  • Менее переносимо. Вопрос — как понимать «переносимость». Противник табов рассматривает «личную» переносимость — то есть, он сам взял и перенесся за другой компьютер или другой редактор, настройки табов там другие, а код всё равно выглядит так, как должен. Защитник табов же наоборот, рассматривает «гуманистическую» переносимость — если код перенёсся к другому человеку, у которого маленький монитор — или большой, 24", но повёрнутый вертикально :-) — или же у которого личные предпочтения в 8 пробелов — этому человеку не придётся прикладывать дополнительных усилий для переформатирования.
  • Сложно смотреть diff’ы — вообще полный бред. Первый символ в unified diff’е это " ", «+» или «-» вне зависимости от того, табы там или пробелы. Однако с аргументами защитника табов я здесь тоже не согласен — понятно, что при изменении стиля отступов меняются почти все строки файла. Понятно, что стилей отступов пробелами много, а стиль отступов табами один, и внутри стиля изменения целого файла не будет.
  • Становится сложно двигать блоки кода влево-вправо, например на 2 колонки — а нахрена блок кода двигать на 2 колонки?!! (по-видимому, не равные полному уровню отступа) Блоки хорошего кода должны быть выровнены на целое (а не дробное) число уровней отступа! Если же речь о выравнивании комментариев и прочей мутоты вроде многострочных прототипов и вызовов функций — это задача, отличная от выравнивания блоков кода, и нефиг использовать табы и для выравнивания блоков кода, и для выравнивания комментариев. Короче говоря, снова побеждает защитник табов… Правда, привнося в жизнь своих соратников некоторый геморрой в виде необходимости постоянно следить за тем, где ставить табы, а где ставить пробелы.
  • …какой-то код был написан на emacs с табами по восемь пробелов, но со стилем отступов «Kernighan & Ritchie», где отступы в 5 пробелов… — это не проблема табов, это проблема людей, смешивающих в отступах блоков кода табы с пробелами.

Important.svg Смешивание пробелов с табами — это как раз то самое ужасное, что может быть в форматировании кода! Например, в UNIX’е многие (похоже, стандартно) считают, что размер таба — 8 символов, но отступ при этом — 4 символа. Получается, что 1 уровень — это 4 символа, 2 уровень — 1 таб, 3 уровень — 1 таб и 4 символа, и т. п. А потом прихожу я со своим нормальным размером таба в 4 символа и несмотря на то, что с авторами софтины, которую я правлю, мы сходимся во мнении насчёт размера отступа, его код выглядит у меня совсем не так, как планировалось — нечётные и чётные уровни будут попарно равны, потому что 1 таб = 4 символа.

Кстати, в защиту табов есть ещё один аргумент — когда код выравнивается табами, нигде в середине файла не может случайно попасться строка, выровненная «нецелым» отступом в, например, 7 пробелов. Пример: строка-конец многострочного массива (PHP). То есть на строке скобка и точка с запятой «);». В том же файле перед закрывающимися скобками — пробелы. Пришёл человек и решил автоматически переформатировать код — заменить « )» на «)», то есть, убрать пробелы перед закрывающимися скобками. Итог — строка со скобкой выровнена на (n*4-1) символ.

А вышеописанные плюсы пробелов вовсе не в том, что выравнивание пробелами корректнее. Плюс пробелов в том, что с ними тупо проще:

  • Не нужно заморачиваться над корректностью форматирования — выравниванием комментариев и т. п.; разделением задач выравнивания блоков кода и выравнивания прочих элементов.
  • Более WYSIWYG — то, что ты видишь, ты гарантированно получишь везде. И твой сосед тоже. И даже сосед твоего соседа. В том числе в какой-нибудь глючной системе просмотра репозиториев, в которой не настраивается размер таба.