Андроид, финты ушами.: Табуляция или пробелы? Хороший стиль программирования Табы или пробелы

Для пытливых разработчиков до сих пор остается актуальным вопрос использования табуляции и пробелов для форматирования кода. Могут ли они быть взаимозаменяемы: например, 2 пробела на табуляцию или 4? Но единого стандарта нет, поэтому иногда между разработчиками возникает непонимание. Кроме того, различные IDE и их компиляторы обрабатывают табуляцию также по-своему.

Решением вопроса обычно становится соглашение о правилах форматирования в рамках проекта или языка программирования в целом.

Команда разработчиков из Google исследовала проекты в репозитории Github. Они проанализировали код, написанный на 14 языках программирования. Целью исследования было выявить соотношение табуляций и пробелов - то есть, наиболее популярный способ форматирования текста для каждого из языков.

Реализация

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

Напомним, что около двух месяцев назад весь открытый код Github стал доступен в форме таблиц BigQuery.

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

Из этой таблицы были выделены файлы, содержащие код на 14 самых популярных языках программирования. Для этого в качестве параметров sql-запроса были указаны расширения соответствующих файлов – .java, .h, .js, .c, .php, .html, .cs, .json, .py, .cpp, .xml, .rb, .cc, .go.

SELECT a.id id, size, content, binary, copies, sample_repo_name , sample_path FROM (SELECT id, FIRST(path) sample_path, FIRST(repo_name) sample_repo_name FROM WHERE REGEXP_EXTRACT(path, r"\.([^\.]*)$") IN ("java","h","js","c","php","html","cs","json","py","cpp","xml","rb","cc","go") GROUP BY id) a JOIN b ON a.id = b.id

864.6s elapsed, 1.60 TB processed

Запрос выполнялся довольно долго. И это неудивительно, так как было необходимо выполнить операцию объединения (join) таблицы из 190 миллионов строк с таблицей в 70 миллионов строк. Всего было обработано 1,6 ТБ данных. Результаты запроса доступны по этому адресу .

В таблице записаны файлы без своих дубликатов. Ниже указано общее количество уникальных файлов и их суммарный размер. Дубликаты файлов не учитывались в ходе анализа.

После этого оставалось только сформировать и запустить на выполнение финальный запрос.

SELECT ext, tabs, spaces, countext, LOG((spaces+1)/(tabs+1)) lratio FROM (SELECT REGEXP_EXTRACT(sample_path, r"\.([^\.]*)$") ext, SUM(best="tab") tabs, SUM(best="space") spaces, COUNT(*) countext FROM (SELECT sample_path, sample_repo_name, IF(SUM(line=" ")>SUM(line="\t"), "space", "tab") WITHIN RECORD best, COUNT(line) WITHIN RECORD c FROM (SELECT LEFT(SPLIT(content, "\n"), 1) line, sample_path, sample_repo_name FROM HAVING REGEXP_MATCH(line, r"[ \t]")) HAVING c>10 # at least 10 lines that start with space or tab) GROUP BY ext) ORDER BY countext DESC LIMIT 100

16.0s elapsed, 133 GB processed

Анализ каждой из строк 133 Гб кода занял 16 секунд. Добиться такой скорости помог все тот же BigQuery.


Чаще всего табуляция встречается в языке С, а пробелы - в Java.

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

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

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

Отступы

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

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

int foo(int arr[А][В][С])
{
int а, Ь, с, total = 0;
for (а = 0; а < А; а++)
{
for(b = 0; Ь < В; Ь++)
{
fоr(с = 0; с < С; С++)
{
total += arr[a](b][c];
}
}
}
return total;
}

Поэтому многие уменьшают количество пробелов до четырех:

int foo(int bar[А][В][С])
{
int a, b, c, total = 0;
for(a = 0; a < A; a++)
{
for(b = 0; b < B; b++)
{
for(c = 0; с < C; С++)
{
total += bar[a][b][c];
}
}
}
return total;
}


Лично я пользовался таким способом на протяжении многих лет. Многим позже я обнаружил, что для моих целей наиболее удобными оказываются отступы в два пробела. Это была установка, от которой я не отступаю уже длительное время. Я приобрел привычку использовать два пробела, когда начал регулярно публиковать статьи в Usenet. Я использовал клавишу пробела вместо табулятора не только потому, что установка табулятора у моих читателей дает слишком широкий отступ, но мне также не нравилась сама идея вставки табуляции в публикации Usenet. Коль скоро такое решение было принято, я быстро обнаружил, что уменьшение количества символов пробела в 12 раз для трехуровневого отступа позволяет мне сэкономить немало времени, так что я начал использовать отступы в два пробела. К своему удивлению, я нашел, что мне нравится это больше, чем четыре пробела, так что теперь я использую два пробела все время.

Отступ в три пробела для многих С-программистов представляется неестественным. Тем не менее, он используется на некоторых сайтах, и при этом текст выглядит неплохо.

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

Табуляторы и мэйнфреймовские компиляторы

Некоторые мэйнфреймовские С-компиляторы не отвечают должным образом на вставку символов табуляции в исходные файлы. Если вы чувствуете, что попадаете в собственную ловушку, может оказаться необходимым потратить время (или деньги) на программный инструмент для замены табуляции пробелами. Фактически вы можете уже иметь такой инструмент. Например, редактор Microsoft Visual С++ имеет эту возможность.

Пробелы вокруг символов

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

#include
#include
#define P printf
#define I atoi
int main(int a,char*v
){int r=5, i;if(a>l
) r=l(v*)$") IN ("java","h","js","c","php","html","cs","json","py","cpp","xml","rb","cc","go") GROUP BY id) a JOIN b ON a.id = b.id

864.6s elapsed, 1.60 TB processed

Запрос выполнялся довольно долго. И это неудивительно, так как было необходимо выполнить операцию объединения (join) таблицы из 190 миллионов строк с таблицей в 70 миллионов строк. Всего было обработано 1,6 ТБ данных. Результаты запроса доступны по этому адресу .

В таблице записаны файлы без своих дубликатов. Ниже указано общее количество уникальных файлов и их суммарный размер. Дубликаты файлов не учитывались в ходе анализа.

После этого оставалось только сформировать и запустить на выполнение финальный запрос.

SELECT ext, tabs, spaces, countext, LOG((spaces+1)/(tabs+1)) lratio FROM (SELECT REGEXP_EXTRACT(sample_path, r"\.([^\.]*)$") ext, SUM(best="tab") tabs, SUM(best="space") spaces, COUNT(*) countext FROM (SELECT sample_path, sample_repo_name, IF(SUM(line=" ")>SUM(line="\t"), "space", "tab") WITHIN RECORD best, COUNT(line) WITHIN RECORD c FROM (SELECT LEFT(SPLIT(content, "\n"), 1) line, sample_path, sample_repo_name FROM HAVING REGEXP_MATCH(line, r"[ \t]")) HAVING c>10 # at least 10 lines that start with space or tab) GROUP BY ext) ORDER BY countext DESC LIMIT 100

16.0s elapsed, 133 GB processed

Анализ каждой из строк 133 Гб кода занял 16 секунд. Добиться такой скорости помог все тот же BigQuery.


Чаще всего табуляция встречается в языке С, а пробелы - в Java.

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

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