Pull to refresh
259.88
Rating
PVS-Studio
Static Code Analysis for C, C++, C# and Java

Пора завязывать использовать символы табуляции в коде

PVS-Studio corporate blog

единорог и табуляции


Многие могут счесть спор, о том, что лучше пробелы или табуляции в коде за holy wars. Однако нет, я не хочу устраивать дискуссию на эту тему. Я однозначно утверждаю, что в обязательном порядке следует использовать пробелы. И разговор и «предпочтении того или иного» здесь не уместен. Как не уместно в наше время обсуждать, что удобнее, компьютер или печатная машинка. Поскольку печатные машинки закончили свое существование, ориентироваться в дальнейшем на их использование, по меньшей мере, нерационально. А если ещё учесть, сколь удобнее пользоваться компьютером для набора текста, то вопрос выбора просто отпадает.



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



Эту заметку меня побудило написать то, что табуляции мне надоели. Вроде и мелочь. Но идут годы, а эта инфекция у программистов всё никак не проходит. Хотя сам я при написании кода не использую табуляции, тем не менее, регулярно вспоминаю недобрым словом их поклонников. Не волнуйтесь, от этого сон и аппетит у меня не нарушается, но некоторое время впустую я трачу. А если учесть, сколько еще людей сталкивается с аналогичными досадными моментами, то суммарный вред весьма ощутимый. И если от спама выгоду получают хотя бы спамеры, то от использования табов выгоды не получает никто. Энергия уходит в никуда. Этот как капающий кран. Одна капля, которую тратит программист, не существенна. Но в сумме уже столько утекло и продолжает утекать, ужас. Предлагаю дочитать эту статью и, наконец, прекратить эту утечку!



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



1) Объем файлов с исходным кодом меньше.



2) Замена всех пробелов может привести к потере истории правок. Нельзя будет сравнить старое и новое.



3) Изменяя длину табуляции, я легко могу настроить отступы в программе под свое предпочтение.



Займемся критикой чистого разума.



1) Объем файлов с исходным кодом меньше



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



2) Замена всех пробелов может привести к потере истории правок. Нельзя будет сравнить старое и новое.



Формально тоже всё верно. Но, пожалуй, это слишком мрачная картина. Так ли уж часто вам приходится исследовать историю файла на большую глубину? Обычно никто не заглядывает в историю глубже одной-двух ревизий файла. Замена табуляции на пробелы делается глобально и один раз и не должна мешать дальнейшим сравнениям.



Если надо часто и глубоко по времени сравнивать файлы, то это что-то в консерватории не то. И тут уже не до пробелов/табуляций. А если нормальному программисту в нормальном проекте все-таки раз в год придется историю одного файла до 10-ого колена изучать, то ему тот же WinMerge поможет. Он умеет замену табуляций на пробел за отличие не считать. Думаю и другие системы сравнения не хуже.



В общем, тоже не аргумент. А если и аргумент, то уж очень слабенький.



3) Изменяя длину табуляции, я легко могу настроить отступы в программе под свое предпочтение.



Никогда не работает на практике.



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



Сделаю небольшое отступление. На самом деле в утверждении зерно смысла есть. Вот только выдранное из контекста, оно бестолково. Подобное может работать только тогда, где код выравнивается ТОЛЬКО табуляцией. Пробелы для выравнивания НЕ ИСПОЛЬЗУЮТСЯ ВООБЩЕ. В этом случае да, меня размер табуляции, мы можем менять отображения кода. Например, одному нравится смотреть на такой код (один таб = 2 пробела):



  if(A==B)
    x = y;

Другой использует другой размер и любуется на этот же код в своем любимом стиле (один таб = 4 пробела):



    if(A==B)
        x = y;

Вот только никто так не делает. Походите по своему коду и вы увидете что-то более реалистичное (один таб = 2 пробела):



  A=Aaaaaaaaaaaa &&
    Bbbbbbbbb;

Если теперь таб станет равен не двум пробелам, то вся красота оформления моментально нарушится.



    A=Aaaaaaaaaaaa &&
        Bbbbbbbbb;

Или вот, я взял и смотрю чей-то файл. Кто-то старался, выравнивал:



wcex.cbSize          = sizeof(WNDCLASSEX);
wcex.style           = WS_OVERLAPPED  ;
wcex.lpfnWndProc     = (WNDPROC)ClipBoardWndProc;
wcex.cbClsExtra      = 0;
wcex.cbWndExtra      = 0;
wcex.hInstance       = theApp.m_hInstance;
wcex.hIcon           = 0;
wcex.hCursor         = ::LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);

Вот только у меня, в FAR с другим размером табуляции это вот так смотрится:



wcex.cbSize          = sizeof(WNDCLASSEX);
wcex.style                   = WS_OVERLAPPED  ;
wcex.lpfnWndProc     = (WNDPROC)ClipBoardWndProc;
wcex.cbClsExtra      = 0;
wcex.cbWndExtra      = 0;
wcex.hInstance       = theApp.m_hInstance;
wcex.hIcon                   = 0;
wcex.hCursor                 = ::LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);

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



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



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



С доводами в защиту табуляции я закончил. Теперь перечислю недостатки от их использования.



1) Тяжело работать с проектами, где используются библиотеки, содержащие в тексте табуляции. Предположим, в одной библиотеке табуляция равна 3 символам, в другой 4 символам. А вы в проекте используете 2 символа. В результате какая-то часть кода у вас будет отображаться в редакторе со сбитым форматированием.



Ну и где польза от переменного размера табуляции? Какой размер не выбери, где-то да криво будет. Если же везде будут пробелы, то и смотреться все красиво будет. Да, будут разные отступы, но форматирование то красивое везде останется!



2) Легко пустить козла в огород. Скажем у вас табуляция равна 4 пробелам. Кто-то что-то чуть-чуть поправил, используя другой размер табуляции или явно вставив пробелы. У него все смотрелось нормально, а у вас строчка кода куда-то уедет.



3) Надо постоянно настраивать различные редакторы под нужный вам размер табуляции. Даже если вам нужно просто посмотреть код не правя. Иначе все разъезжается. Особенно это не удобно, когда приходится что-то делать со своим кодом на сторонней машине. Или наоборот заглядывать в чужой код. Тут объяснить всю суетность сложно. Это надо прочувствовать. Программисты, пожалуй делятся на тех, кто знает и понимает про это неудобство, и кто нет. Но прошу, те, кто не понимает, поверьте — эти неудобства есть! И если вам, в общем-то, всё равно, то используйте пробелы! Сэкономите кому то немного сил и времени.



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



Ну и на последок отвечу на: «мы так всегда писали, значит и дальше так стоит продолжать». Часто, причем, это подкрепляется каким-либо бородатым стандартом кодирования, используемым программистами. Слава богу, профессиональные разработчики не стоят на месте. И не боятся нарушить старинные устои. Примером тому может служить Google C++ Style Guide. Вот цитата оттуда по поводу пробелов и табуляций.



Spaces vs. Tabs



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.



Слава богу! Хоть у кого-то разумный подход!



Желаю и вам свежести в ваших стандартах кодирования!



UPDATE:



ПРИМЕЧАНИЕ ДЛЯ ТЕХ, КТО В ТАНКЕ



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



Никогда бы не подумал, что из-за этого меня заминусуют. «Вот ведь гад! Рекомендует пробелы нажимать до посинения, вместо милого таба!»

Tags:
Hubs:
Total votes 492: ↑258 and ↓234 +24
Views 38K
Comments Comments 217

Information

Founded
2008
Website
pvs-studio.com
Employees
31–50 employees
Registered