<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=Why_I_prefer_no_tabs_in_source_code</id>
		<title>Why I prefer no tabs in source code - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/index.php?action=history&amp;feed=atom&amp;title=Why_I_prefer_no_tabs_in_source_code"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=Why_I_prefer_no_tabs_in_source_code&amp;action=history"/>
		<updated>2026-05-14T06:05:55Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://lib.custis.ru/index.php?title=Why_I_prefer_no_tabs_in_source_code&amp;diff=17305&amp;oldid=prev</id>
		<title>BenderBot: 1 версия</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=Why_I_prefer_no_tabs_in_source_code&amp;diff=17305&amp;oldid=prev"/>
				<updated>2010-08-11T00:01:43Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;' lang='ru'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 00:01, 11 августа 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;' lang='ru'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>BenderBot</name></author>	</entry>

	<entry>
		<id>https://lib.custis.ru/index.php?title=Why_I_prefer_no_tabs_in_source_code&amp;diff=17304&amp;oldid=prev</id>
		<title>StasFomin в 17:32, 10 августа 2010</title>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/index.php?title=Why_I_prefer_no_tabs_in_source_code&amp;diff=17304&amp;oldid=prev"/>
				<updated>2010-08-10T17:32:42Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[http://adamspiers.org/ Adam Spiers] «Почему в коде я предпочел бы обойтись без табов»&lt;br /&gt;
&amp;lt;blockquote&amp;gt;''Перевод статьи [http://adamspiers.org/computing/why_no_tabs.html Why I prefer no tabs in source code]&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{important}} Я заметил, что несколько человек зашло на мою статью с статьи [[Why I love having tabs in source code]], где автор пытается оппонировать моим аргументам против использования табов.&lt;br /&gt;
(Замечу также, что автор весьма невежливо не поставил меня в известность о своей заметке, и, тем самым, не дал мне удобной возможности ответить).&lt;br /&gt;
Он поднял интересные вопросы, правда проигнорировал некоторые мои.&lt;br /&gt;
Хотя возможно он просто их не понял, тогда это моя вина, что я сформулировал их более ясно. Если выдастся время, я попробую это исправить и ответить на его заметку с более конкретными, проясняющими мою позицию, примерами.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Итак, вернемся к моей статье.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Многие программисты смешивают в исходниках пробелы с табами — символами табуляции с ASCII-кодом &amp;lt;tt&amp;gt;09&amp;lt;/tt&amp;gt;, вместо того, чтобы использовать несколько (обычно &amp;lt;tt&amp;gt;8&amp;lt;/tt&amp;gt;) пробелов вместо таба.&lt;br /&gt;
Да, это считается малозначительной вкусовщиной, но я считаю, что, как правило, это не шибко удачная идея, и ниже я поясню почему.&lt;br /&gt;
&lt;br /&gt;
{{note}} «Как правило» — это потому, что в любом правиле есть исключения, которые подтверждают все правила без исключения.&lt;br /&gt;
Ниженаписанное относится в основном к [http://www.fsf.org/ свободному софту], потому что из-за&lt;br /&gt;
«базарной»&amp;lt;ref&amp;gt;Метафора отсылает к известному эссе «[[RuPedia:Собор_и_Базар|Собор и Базар]]» о конкурирующих парадигмах разработки корпоративного и свободного программного обеспечения.&amp;lt;/ref&amp;gt; модели разработки высока публичность кода.&lt;br /&gt;
Однако если вам не повезло, и вы работаете в компании не оставляющей никому выбора ни для правил отступов, ни текстового редактора,&lt;br /&gt;
то, что поделать — эта статья вам все равно не пригодится.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Итак, это:&lt;br /&gt;
&lt;br /&gt;
Менее переносимо, ибо разные редакторы/броузеры/просмотрщики отображают символ табуляции используя разное число пробелов, более того, большинство текстовых редакторов считают это пользовательской настройкой.&lt;br /&gt;
Если вы используете пробелы без табов, вы никак и никогда не зависите от особенностей и настроек редакторов и просмотрщиков, вам не нужно выставлять им правильную ширину таба.&lt;br /&gt;
Даже если вы готовы настраивать каждый редактор/просмотрщик под каждую используемую вами платформу,&lt;br /&gt;
разве вы не усложняете жизнь остальным, кому надо читать и править ваш код?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Становится очень сложно читать ''diff''-результаты, как контекстные, так и в формате ''unified diff'',&lt;br /&gt;
так как там первый столбец означает тип изменения строчки.&lt;br /&gt;
Для многих разработчиков сейчас это очень важно. И даже если вы разрабатываете ваш код в одиночку, насколько&lt;br /&gt;
вы уверены, что никому и никогда не взглянет на ваш код, не будет его править и уж совсем никогда не пошлет вам патчи?&lt;br /&gt;
&lt;br /&gt;
{{note}} Вообще у &amp;lt;tt&amp;gt;diff&amp;lt;/tt&amp;gt; есть пара решений для этого — опции &amp;lt;tt&amp;gt;--expand-tabs&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;--initial-tab&amp;lt;/tt&amp;gt;, но ни оба из них недостаточны.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Становится сложно двигать блоки кода влево-вправо. Например, вы пытаетесь сдвинуть блок только на две колонки вправо — и это не действует на строчки начинающиеся с табов.&lt;br /&gt;
&lt;br /&gt;
Конечно, можно сказать все это не нужно, если у вас вменяемый редактор, делающий автоматический отступ,&lt;br /&gt;
но автоматика не всегда срабатывает верно, особенно для [http://www.perl.com/ Perl]-а, когда даже &amp;lt;tt&amp;gt;[http://www.gnu.org/software/emacs/ GNU emacs]&amp;lt;/tt&amp;gt; не в силах разобраться с синтаксисом.&lt;br /&gt;
&lt;br /&gt;
И опять таки, вы уверены, что никто кроме вас не захочет переформатировать ваш код? Точно уверены? Сто пудов? Уверены что вы ''никогда'' не будете копипейстить фрагменты кода в почте? Ну, представьте, что будет с этим кодом, кто-то ответить на такое письмо.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Аргумент «табы хороши, потому, что каждый может выбрать удобную для себя ширину отступов» не работает, потому что:&lt;br /&gt;
&lt;br /&gt;
* Табы используются не только в начале строк. Может многострочный комментарий, с левым выравниванием текста, но размещенный справа от кода, в общем, вглянем на реальный пример из &amp;lt;tt&amp;gt;/usr/include/gmp.h&amp;lt;/tt&amp;gt;, найденный на FreeBSD-системе:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code-c&amp;gt;&lt;br /&gt;
typedef struct&lt;br /&gt;
{&lt;br /&gt;
  int _mp_alloc;                /* Number of *limbs* allocated and pointed&lt;br /&gt;
                                   to by the D field.  */&lt;br /&gt;
  int _mp_size;                 /* abs(SIZE) is the number of limbs&lt;br /&gt;
                                   the last field points to.  If SIZE&lt;br /&gt;
                                   is negative this is a negative&lt;br /&gt;
                                   number.  */&lt;br /&gt;
  mp_limb_t *_mp_d;             /* Pointer to the limbs.  */&lt;br /&gt;
} __mpz_struct;&lt;br /&gt;
&amp;lt;/code-c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И теперь представим бедолагу сидящего за терминалом 80x25, и решившего просмотреть форматированный табами код, но, не с жирными 8 пробелами на таб, ведь было бы ужасно читать из-за переносов строк или выходов за границы экрана, а задав 2 или 3 пробела на таб.&lt;br /&gt;
Итак, он печатает&lt;br /&gt;
  less -x2 foo.c&lt;br /&gt;
и бах — внезапно прямоугольные блоки комментария справа перестают быть выровненными по левому краю — что за фигня!&lt;br /&gt;
&lt;br /&gt;
* Проблемы могут быть даже если табы только в началах строк. Допустим, какой-то код был написан на &amp;lt;tt&amp;gt;emacs&amp;lt;/tt&amp;gt; с табами по восемь пробелов, но со стилем отступов «Kernighan &amp;amp; Ritchie», где отступы в 5 пробелов. Если &amp;lt;tt&amp;gt;emacs&amp;lt;/tt&amp;gt; настроен на использование табов, строчки с одним отступом будут отбиты пятью пробелами, строчки с двумя отступами будут отбиты табом и двумя пробелами (&amp;lt;tt&amp;gt;8 + 2 == 10&amp;lt;/tt&amp;gt;).&lt;br /&gt;
Если кто-то еще захочет просмотреть этот код в редакторе/листальщике с табами по 4 пробела, то&lt;br /&gt;
в строчках с единичной глубиной будет отступ на 5 колонок, следующий уровень — 6 колонок, третий уровень — 11 колонок… Упс!&lt;br /&gt;
&lt;br /&gt;
* Этот же аргумент можно адресовать и к пробелам. Хотите взглянуть на исходники, чтобы двухколоночные отступы показывались как четырехколоночные? Без проблем:&lt;br /&gt;
 $ perl -pe 's/^((  )+)/$1$1/' foo.c | less&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Хотите переформатировать 8-колоночные отступы в трехколоночные? Легко:&lt;br /&gt;
 $ perl -pi -e 's/^( +)\1{7}/$1 x 3/e' foo.c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Очевидно, можно написать простой Perl-скрипт или макрос для редактора, чтобы сделать эти операции еще более простыми.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
А вы что думаете?&lt;br /&gt;
&lt;br /&gt;
Я всегда интересуюсь [http://adamspiers.org/computing/why_no_tabs.html#others чужой точкой зрения] на этот вопрос.&lt;br /&gt;
Может я что-то упустил?&lt;br /&gt;
Или даже вы попробуете [mailto:adam@spiers.net доказать мне что, я ошибаюсь]?!&lt;br /&gt;
&lt;br /&gt;
Я человек широких взглядов, так что если вы убедите меня, я исправлю эту страницу и мой стиль кодирования.&lt;br /&gt;
В противном же случае…&lt;br /&gt;
&lt;br /&gt;
Будь любезен, сделай всем одолжение!&lt;br /&gt;
Напиши в свое &amp;lt;tt&amp;gt;~/.emacs&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 (setq-default indent-tabs-mode nil)&lt;br /&gt;
&lt;br /&gt;
или в своей &amp;lt;tt&amp;gt;~/.vimrc&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 :set expandtab&lt;br /&gt;
&lt;br /&gt;
Пишите, пожалуйста, [mailto:adam@spiers.net мне], как это сделать в других текстовых редакторах.&lt;br /&gt;
&lt;br /&gt;
== Отзывы и мнения остальных ==&lt;br /&gt;
&lt;br /&gt;
У полубога Линуса есть свои собственные [http://adamspiers.org/computing/Linus-Kernel-CodingStyle заповеди], с некоторыми из которых я согласен.I agree with.&lt;br /&gt;
&lt;br /&gt;
Dawn Endico указал что известных нетскейпщик/мозильщик [http://www.jwz.org/ Jamie Zawinski] тоже написал [http://www.jwz.org/doc/tabs-vs-spaces.html заметку по теме], аргументы которой схожи с моими, но изложение несколько отличается. Рекомендую взглянуть!&lt;br /&gt;
&lt;br /&gt;
{{important}} Неизвестный доброжелатель послал мне пачку ссылок по теме. Я был рад узнать, что в целом, там со мной согласны :-)&lt;br /&gt;
&lt;br /&gt;
* [http://www.movement.uklinux.net/docs/whytabs/ Возможно самая лучшая страничка с защитой табов, из тех что я видел]. Я согласен почти со всем, кроме того что диффы выглядят отлично. Еще он забыл про цитирование кода при email-переписке.&lt;br /&gt;
* [http://www.chris-lott.org/resources/cstyle/CppCodingStandard.html#indent  Стиль отступов в стандарте C++].&lt;br /&gt;
* [http://www.python.org/peps/pep-0008.html  Стиль кодирования для Python]&lt;br /&gt;
* http://www.rudbek.com/Code_gui.htm#Guideline_No_Hard_Tabs &lt;br /&gt;
* http://babbage.cs.qc.edu/courses/cs101/Coding_Guidelines.html&lt;br /&gt;
* [http://www.freebsd.org/cgi/man.cgi?query=style&amp;amp;sektion=9  FreeBSD style guide ]&lt;br /&gt;
* [http://mindprod.com/unmainobfuscation.html  How To Write Unmaintainable Code ]&lt;br /&gt;
* http://xarg.net/writing/tabs &lt;br /&gt;
* [http://www.ingrid.org/jajakarta/turbine/jp/turbine/common/code-standards.html Coding standards for the Jakarta Project]&lt;br /&gt;
&lt;br /&gt;
{{important}} Robert Swindell указал мне на интересное предложение «[http://www.synchro.net/ptsc_hdr.html PT/SC]», где параметры форматирования, такие, как ширина табов, хранятся в заголовке плоского текстового файла в&lt;br /&gt;
едином, человекочитаемом формате. Давайте надеятся, что редакторы вскорости станут его поддерживать…&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Tabs vs. Spaces]]&lt;br /&gt;
&lt;br /&gt;
{{ActualBanner}}&lt;br /&gt;
{{replicate-from-custiswiki-to-lib}}&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	</feed>