Что лучше таб или пробел
Пора завязывать использовать пробелы вместо табуляции в коде
Этот топик — ответ на топик «Пора завязывать использовать символы табуляции в коде».
Я хотел было ответить к комментариях, но в силу объема и желания независимости от исходного топика решил создать новый топик.
Итак, под катом — почему табы лучше пробелов, самые значительные заблуждения касательно табов и как ими правильно пользоваться.
Начнём с того, что большинство людей (по крайней мере на Хабре) предпочитают табы.
По ссылке есть очень классный комментарий от GreyCat:
На самом деле странно то, что многие до сих пор не отличают indentation и alignment. Ну, вот это — indentation:
А вот это — alignment:
Первое можно делать и табами, и пробелами, но когда делаешь табами — каждый может подстроить ширину indent’а на свой вкус и ничего никуда не едет. А второе — строго пробелами.
В IDE есть опция Smart Tabs для этого:
Если правильно использовать табы (а именно — только для indentation) — можно без проблем менять размер табов не нарушая стиль программирования.
2 пробела на таб:
5 пробелов на таб:
9 пробелов на таб:
Так каких проблем мы лишаемся?
1. Каждый программист может настроить длину табуляции под свой вкус. Всегда работает на практике. Когда код с большой вложенностью — можно поставить ширину табуляции в два пробела, иначе — в четыре.
2. Легче работать с посторонними библиотеками. Какие-то библиотеки поддерживают стиль с шириной таба в два пробела, какие-то с шириной в четыре пробела. Только использование табов не накладывает ограничение на стиль.
Процитирую пару мыслей из предыдущего топика:
Тяжело работать с проектами, где используются библиотеки, содержащие в тесте табуляции. Предположим, в одной библиотеке табуляция равна 3 символам, в другой 4 символам. А вы в проекте используете 2 символа. В результате какая-то часть кода у вас будет отображаться в редакторе со сбитым форматированием.
На самом деле в проектах, которые используют табуляцию таких проблем нету — так как табуляция безразмерна, а вот поддерживать одновременно пару библиотек с разным размером пробело-табуляции становится проблематичным, т.к. уже нельзя пользоваться tab (чтобы IDE заменяла табы на пробелы). Конечно, есть шанс решить такую проблему разными проектами с разными настройками, но это тот еще костыль, да и башку все-равно сносит от разных размеров вложенности.
Легко пустить козла в огород. Скажем у вас табуляция равна 4 пробелам. Кто-то что-то чуть-чуть поправил, используя другой размер табуляции или явно вставив пробелы. У него все смотрелось нормально, а у вас строчка кода куда-то уедет.
Аналогично, табуляция — безразмерная. Такая проблема есть только в проектах, которые используют пробелы. Там где используются табы — они могут быть хоть 2, хоть 10 символов шириной.
Надо постоянно настраивать различные редакторы под нужный вам размер табуляции. Даже если вам нужно просто посмотреть код не правя. Иначе все разъезжается. Особенно это не удобно, когда приходится что-то делать со своим кодом на сторонней машине.
Допустим, я открываю Kate, чтобы по-быстряку поправить код в каком-то файле. Оппа, размер табуляции два пробела. Надо лезть в конфиг. А в соседнем файле из другой либы — четыре пробела. Придётся пользоваться пробелом вместо таба для отступов, ужас. С табами такой проблемы нету.
Лишние сложности тем, кто работает одновременно с проектами, где по стандартам кодирования требуются разные отступы. Если стандарты требуют использование табуляции, то это ещё тот вечно ноющий зуб. В случае пробелов опять-таки все намного проще.
Как выше разобрали, такая проблема есть именно с проблемами, а не с табами.
А еще дополнительно у пробелов есть такие недостатки, как невозможность быстрого перемещения стрелочками клавиатуры (щёлкает каждый пробел, а не через блок), возможность допустить ошибку (поставить в одном месте 3 пробела вместо 4, чем порушить дальнейшую структуру), увеличение размера файла и куча всего ещё.
Вывод
У пробелов нету ни одного существенного преимущество по сравнению с табами, при этом мы не сковываем программиста в рамки и не заставляем его мучаться с слишком маленькими (или слишком большими) для него табами.
Главное
Не так важно, что именно вы используете. Важно, чтобы вы следили за порядком своего кода и всегда придерживались одного и того же стиля. Включите отображение табов/пробелов, иногда меняйте размер табуляции на другой и пробегайте глазами код, чтобы удостоверится, что у вас где-то не вставились пробелы вместо табов или табы вместо пробелов.
Табы или пробелы? Анализ 400 тысяч репозиториев GitHub, миллиарда файлов, 14 ТБ кода
Для пытливых разработчиков до сих пор остается актуальным вопрос использования табуляции и пробелов для форматирования кода. Могут ли они быть взаимозаменяемы: например, 2 пробела на табуляцию или 4? Но единого стандарта нет, поэтому иногда между разработчиками возникает непонимание. Кроме того, различные IDE и их компиляторы обрабатывают табуляцию также по-своему.
Решением вопроса обычно становится соглашение о правилах форматирования в рамках проекта или языка программирования в целом.
Команда разработчиков из Google исследовала проекты в репозитории Github. Они проанализировали код, написанный на 14 языках программирования. Целью исследования было выявить соотношение табуляций и пробелов — то есть, наиболее популярный способ форматирования текста для каждого из языков.
Реализация
Для анализа использовалась уже существующая таблица [bigquery-public-data:github_repos.sample_files], в которую записаны наименования репозиториев Github.
Напомним, что около двух месяцев назад весь открытый код Github стал доступен в форме таблиц BigQuery.
Однако для анализа были выбраны не все репозитории, а только верхние 400 тысяч репозиториев с наибольшим числом звёзд, которые они получили за период с января по май 2016 года.
Запрос выполнялся довольно долго. И это неудивительно, так как было необходимо выполнить операцию объединения (join) таблицы из 190 миллионов строк с таблицей в 70 миллионов строк. Всего было обработано 1,6 ТБ данных. Результаты запроса доступны по этому адресу.
В таблице [contents] записаны файлы без своих дубликатов. Ниже указано общее количество уникальных файлов и их суммарный размер. Дубликаты файлов не учитывались в ходе анализа.
После этого оставалось только сформировать и запустить на выполнение финальный запрос.
Анализ каждой из строк 133 Гб кода занял 16 секунд. Добиться такой скорости помог все тот же BigQuery.
Чаще всего табуляция встречается в языке С, а пробелы — в Java.
Хотя для кого-то соотношение тех или иных управляющих символов не имеет значения, а споры на эту тему кажутся надуманными. Это не имеет значения и для некоторых IDE, которые сохраняют табуляцию как некоторое количество пробелов. Также существуют IDE, в которых это количество можно настраивать вручную.
Некоторое время назад эта проблема была обыграна в сериале «Кремниевая долина». Парень и девушка не сошлись в вопросе форматирования. В результате старый холивар не только привел к недопониманию в профессиональном плане, но и создал проблемы в их личных отношениях.
PSR-2, анализ одного пункта стандарта. Пробелы или табы
Что говорит стандарт
1. Overview
Code MUST use 4 spaces for indenting, not tabs.
2.4. Indenting
Code MUST use an indent of 4 spaces, and MUST NOT use tabs for indenting.
N.b.: Using only spaces, and not mixing spaces with tabs, helps to avoid problems with diffs, patches, history, and annotations. The use of spaces also makes it easy to insert fine-grained sub-indentation for inter-line alignment.
«Nb: Использование только пробелы, а не смешивая пространства с вкладками, помогает избежать проблем с файлов изменений, исправлений, истории и аннотации. Использование пространств также делает его легко вставить мелкозернистый суб-отступ для выравнивания между линией.»
С под-отступом понятно, довольно интересная фишка, но я как то никогда ею не пользовался, используется например так:
Но такое как раз и заложено в теории SmartTabs, когда табы используются для отступов от начала строки, а пробелы как раз для таких вот хитрых маневров (и при изменении размера таба основной код будет меняться а код с пробелами всегда останется читаемым независимо от размера таба).
А вот пробелы, как написано в стандарте, используются для того, чтобы не было проблем при работе с системами контроля версий. Вот с этим я и хочу разобраться и проверить так ли это.
Ставим эксперимент №1
1. Создадим два файла, в одном будет код с пробелами в другом, точно такое же код, но уже с табами.
2. Сделаем копии этих файлов и внесем в них изменения.
3. Теперь посмотрим с помощью программы WinMerge
4. Отправим эти файлы в GIT
5. Посмотрим с помощью программы SourceTree
6. Посмотрим на сайте Bitbucket
7. Как видим с обычным, не повторяющимся кодом, никаких проблем нет, неважно используются пробелы или табы.
Ставим эксперимент №2
1. А теперь поставим эксперимент, баги которого я сам неоднократно замечал используя табы. Очень интересно посмотреть, вдруг и правда пробелы решают эту проблему.
2. Создадим два файла, у которого после изменений будут повторяющиеся куски кода. И также сделаем копии этих файлов и внесем в них изменения.
3. Теперь посмотрим с помощью программы WinMerge
4. Отправим эти файлы в GIT
5. Посмотрим с помощью программы SourceTree
6. Посмотрим на сайте Bitbucket
7. Внезапно, что с табами что с пробелами проблема видна невооруженным глазом и ни одна из программ не смогла правильно понять где произошли изменения. Тогда к чему в стандарте написано, что пробелы позволяют решить проблему: helps to avoid problems with diffs, patches, history, and annotations.
В качестве заключения
Так может быть стоит плюнуть на этот пункт стандарта и использовать SmartTabs, ведь преимущества использования табов в начале строки неоспоримы. Табы можно настроить как нравится, хочешь как два пробела, хочешь как 4, а хочешь как 8 или даже 3. При этом если все используется правильно, то код никогда и никуда не уедет.
UPDATE1
Прочитав комментарии я полностью изменил свое мнение по поводу пробелов, проведя данное исследование хотелось разобраться в плюсах 4 пробелов перед табами, тем более тогда мне казалось, что у табов плюсов гораздо больше. Но теперь табы уже не кажутся такими хорошими как раньше. Да, нужно делать как в стандарте, тем более, что так делает большинство, зачем плыть против течения. Но у пробелов тоже есть свои минусы. В общем когда делали стандарт выбрали наименьшее зло из двух возможных (ИМХО).
Но эти холивары похоже будут длится еще довольно долго.
Отступы в коде: tab или пробел? Программист Google изучил миллиард файлов в поисках ответа
Один из величайших «холиваров» среди программистов: использовать ли кнопку tab или нажимать 4 раза на пробел при расставлении отступов в коде. Gizmodo, ссылаясь на блог программиста из Google, сообщает о попытке найти победителя в этом споре. Разработчик Фелипе Хоффа проанализировал около миллиарда файлов на 14-ти языках программирования и пришёл к выводу, что «space people» лидируют со значительным отрывом.
Рано или поздно дебаты сводятся к тому, как исходный код отображается в различных редакторах. Проблемы начинаются тогда, когда в одном файле используются разные методы идентации. Особенно «опасно» это в случае работы нескольких человек над одним проектом. Неудивительно, что программисты в итоге разделяют друг друга на «tab people» и «space people». История нашла своё отражение даже в одном из эпизодов сериала «Кремниевая долина»
Разработчик из Google Фелипе Хоффа решил найти победителя в этом извечном споре и проанализировал около миллиарда исходных файлов, написанных на 14-ти языках программирования. Результаты исследования программист опубликовал в своём блоге на Medium.
Специальный скрипт изучил файлы с GitHub, размещённые на BigQuery. Отдельно выполнялась проверка на дублирование, а слишком маленькие файлы, в которых было менее 10 строк кода, не принимались в расчёт. Каждый файл давал один голос в пользу того или иного метода. В случае, если в файле использвались и пробелы, и tab, голос получал метод, который встречался чаще.
Наконец, 400 000 репозиториев были отсортированы по количеству звёзд, полученных на GitHub в период с января по май 2016 года.
И вот каким был результат:
Со значительным перевесом победу одержали «space people». В каждом крупном языке программирования, кроме C, в наиболее популярных файлах на GitHub использовались пробелы. При этом в программах на Go пробелами пользуется абсолютное меньшинство разработчиков.
Эти данные, пожалуй, наиболее точные из всех возможных аргументов, которые приводятся в спорах о tab и space, и никаких уточнений в ближайшее время ожидать не приходится.
К сожалению, программист Google не сообщил, к какому «лагерю» принадлежит он сам.
Хотите сообщить важную новость? Пишите в Телеграм-бот.
А также подписывайтесь на наш Телеграм-канал.
😣😖😫😩 Айтишники рассказали про признаки плохого оффера. Читайте истории, выводы и советы.
Пора завязывать использовать символы табуляции в коде
Многие могут счесть спор, о том, что лучше пробелы или табуляции в коде за holy wars. Однако нет, я не хочу устраивать дискуссию на эту тему. Я однозначно утверждаю, что в обязательном порядке следует использовать пробелы. И разговор и «предпочтении того или иного» здесь не уместен. Как не уместно в наше время обсуждать, что удобнее, компьютер или печатная машинка. Поскольку печатные машинки закончили свое существование, ориентироваться в дальнейшем на их использование, по меньшей мере, нерационально. А если ещё учесть, сколь удобнее пользоваться компьютером для набора текста, то вопрос выбора просто отпадает.
С пробелами и табуляцией ситуация не настолько грандиозна и масштабна, но аналогия прослеживается. Далее я поясню, почему рационально перейти на пробелы для форматирования кода.
Эту заметку меня побудило написать то, что табуляции мне надоели. Вроде и мелочь. Но идут годы, а эта инфекция у программистов всё никак не проходит. Хотя сам я при написании кода не использую табуляции, тем не менее, регулярно вспоминаю недобрым словом их поклонников. Не волнуйтесь, от этого сон и аппетит у меня не нарушается, но некоторое время впустую я трачу. А если учесть, сколько еще людей сталкивается с аналогичными досадными моментами, то суммарный вред весьма ощутимый. И если от спама выгоду получают хотя бы спамеры, то от использования табов выгоды не получает никто. Энергия уходит в никуда. Этот как капающий кран. Одна капля, которую тратит программист, не существенна. Но в сумме уже столько утекло и продолжает утекать, ужас. Предлагаю дочитать эту статью и, наконец, прекратить эту утечку!
В начале, перечислю аргументы, которые вспоминают, когда не хотят перейти от табуляции к пробелам. Я уверен, что они высосаны из пальца и единственная настоящая причина это лень. Тем не менее, рассмотрю эти аргументы и раскритикую эти.
1) Объем файлов с исходным кодом меньше.
2) Замена всех пробелов может привести к потере истории правок. Нельзя будет сравнить старое и новое.
3) Изменяя длину табуляции, я легко могу настроить отступы в программе под свое предпочтение.
Займемся критикой чистого разума.
1) Объем файлов с исходным кодом меньше
Насколько это верный, настолько же и глупый аргумент. В наше время экономить на килобайтах просто бессмысленно. Данный аргумент потерял всякий смысл более 10 лет назад.
2) Замена всех пробелов может привести к потере истории правок. Нельзя будет сравнить старое и новое.
Формально тоже всё верно. Но, пожалуй, это слишком мрачная картина. Так ли уж часто вам приходится исследовать историю файла на большую глубину? Обычно никто не заглядывает в историю глубже одной-двух ревизий файла. Замена табуляции на пробелы делается глобально и один раз и не должна мешать дальнейшим сравнениям.
Если надо часто и глубоко по времени сравнивать файлы, то это что-то в консерватории не то. И тут уже не до пробелов/табуляций. А если нормальному программисту в нормальном проекте все-таки раз в год придется историю одного файла до 10-ого колена изучать, то ему тот же WinMerge поможет. Он умеет замену табуляций на пробел за отличие не считать. Думаю и другие системы сравнения не хуже.
В общем, тоже не аргумент. А если и аргумент, то уж очень слабенький.
3) Изменяя длину табуляции, я легко могу настроить отступы в программе под свое предпочтение.
Никогда не работает на практике.
Тот, кто заявляет что-то подобное, не понимает, про что он говорит. И сам он ни разу не пробовал такое сделать, а то бы не говорил ерунды.
Сделаю небольшое отступление. На самом деле в утверждении зерно смысла есть. Вот только выдранное из контекста, оно бестолково. Подобное может работать только тогда, где код выравнивается ТОЛЬКО табуляцией. Пробелы для выравнивания НЕ ИСПОЛЬЗУЮТСЯ ВООБЩЕ. В этом случае да, меня размер табуляции, мы можем менять отображения кода. Например, одному нравится смотреть на такой код (один таб = 2 пробела):
Другой использует другой размер и любуется на этот же код в своем любимом стиле (один таб = 4 пробела):
Вот только никто так не делает. Походите по своему коду и вы увидете что-то более реалистичное (один таб = 2 пробела):
Если теперь таб станет равен не двум пробелам, то вся красота оформления моментально нарушится.
Или вот, я взял и смотрю чей-то файл. Кто-то старался, выравнивал:
Вот только у меня, в FAR с другим размером табуляции это вот так смотрится:
Таких примеров массу привести можно. Сами можете поменять размер табуляции и полюбоваться на свой код. Особенно это полезно сделать, если захочется оспорить данный текст.
Итак, код после изменения размера табуляции будет нормально смотреть, если использовать только табуляции. Но это очень аскетично. И код часто не красивый получается. Поэтому подавляющее число программистов используют для выравнивания помимо табов еще и пробелы. И тем самым уничтожают возможность менять размер злосчастных табов.
В результате получаем, что использование табуляции из абстракнтых соображений не имеет смысла. Я утверждаю, что взяв свой или чужой код и изменив размер табуляции, в 99% случаев мы получим некрасивый, разъехавшийся код. А раз так, то и аргумент в защиту справедлив только на 1%, а то и меньше. Ни разу не видел, чтоб с другими табуляциями код смотрелся хорошо. А уж кода я смотрю много.
С доводами в защиту табуляции я закончил. Теперь перечислю недостатки от их использования.
1) Тяжело работать с проектами, где используются библиотеки, содержащие в тексте табуляции. Предположим, в одной библиотеке табуляция равна 3 символам, в другой 4 символам. А вы в проекте используете 2 символа. В результате какая-то часть кода у вас будет отображаться в редакторе со сбитым форматированием.
Ну и где польза от переменного размера табуляции? Какой размер не выбери, где-то да криво будет. Если же везде будут пробелы, то и смотреться все красиво будет. Да, будут разные отступы, но форматирование то красивое везде останется!
2) Легко пустить козла в огород. Скажем у вас табуляция равна 4 пробелам. Кто-то что-то чуть-чуть поправил, используя другой размер табуляции или явно вставив пробелы. У него все смотрелось нормально, а у вас строчка кода куда-то уедет.
3) Надо постоянно настраивать различные редакторы под нужный вам размер табуляции. Даже если вам нужно просто посмотреть код не правя. Иначе все разъезжается. Особенно это не удобно, когда приходится что-то делать со своим кодом на сторонней машине. Или наоборот заглядывать в чужой код. Тут объяснить всю суетность сложно. Это надо прочувствовать. Программисты, пожалуй делятся на тех, кто знает и понимает про это неудобство, и кто нет. Но прошу, те, кто не понимает, поверьте — эти неудобства есть! И если вам, в общем-то, всё равно, то используйте пробелы! Сэкономите кому то немного сил и времени.
4) Лишние сложности тем, кто работает одновременно с проектами, где по стандартам кодирования требуются разные отступы. Если стандарты требуют использование табуляции, то это ещё тот вечно ноющий зуб. В случае пробелов опять-таки все намного проще.
Ну и на последок отвечу на: «мы так всегда писали, значит и дальше так стоит продолжать». Часто, причем, это подкрепляется каким-либо бородатым стандартом кодирования, используемым программистами. Слава богу, профессиональные разработчики не стоят на месте. И не боятся нарушить старинные устои. Примером тому может служить Google C++ Style Guide. Вот цитата оттуда по поводу пробелов и табуляций.
Use only spaces, and indent 2 spaces at a time.
We use spaces for indentation. Do not use tabs in your code. You should set your editor to emit spaces when you hit the tab key.
Слава богу! Хоть у кого-то разумный подход!
Желаю и вам свежести в ваших стандартах кодирования!
ПРИМЕЧАНИЕ ДЛЯ ТЕХ, КТО В ТАНКЕ
Чтобы использовать для оформления пробелы, вовсе не обязательно 4 или более раз нажимать клавишу пробел. Во всех редакторах есть возможность настроить, сколько пробелов вставлять при нажатии таба.
Никогда бы не подумал, что из-за этого меня заминусуют. «Вот ведь гад! Рекомендует пробелы нажимать до посинения, вместо милого таба!»