Комментарии 407
Не надо выдумывать сложностей. Дома у меня большой дисплей, там таб широкий — это удобно. А на нетбуке в дороге экранчик маленький, там таб узенький — опять же удобно. А те кто делают отступы пробелами лишают меня такой возможности.
Нет ни единого аргумента, чтобы использовать пробелы вместо табов для отступов.
p.s. вы правда считаете, что всякий алгоритм можно отрефакторить до 2-4 уровней?
p.s. вы правда считаете, что всякий алгоритм можно отрефакторить до 2-4 уровней?
да, причём не только можно, но и нужно :)
ну и функции декомпозировать, если больше 2х сферических экранов.
И да, 2000 строк кода это одна функция.
![](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg59.imageshack.us%2Fimg59%2F2305%2F85530797.th.png%22)
p. s. автор этих строк профессионал с огромным опытом, работающий в одной крупной и всем известной ИТ-компании.
Я вот прекрасно вижу ворох if-then-else, которые меняются свичами.
На производительности это ни скажется ни разу, ибо современные компиляторы сами используют такой подход при генерации кода.
Единственный минус такой замены в плюсах/си только то, что мы не сможет в case'ах падать вниз, что самом по себе является дурным тоном.
Ну вроде такого:
case 'a':
doSomeForA();
case 'b'"
doSomeForAB();
break;
Ну а насчет «красивости» — мне свитчи совсем не нравятся, использую таблицы вызовов довольно часто. Здесь дело вкуса.
1. Вызов функции сопровождается как минимум сохранением адреса возврата на стеке, а зачастую еще и регистров, что совсем не нужно в случае со switch.
2. Компилятор может соптимизиоровать безусловный переход на начало switch + вычисляемый переход на нужный case в один переход, добавляемый после каждого case. С функциями из call table такая оптимизация невозможна.
3. Со switch «горячие» указатели (Instruction pointer, Stack pointer и т.п.) будут локальными переменными и закэшируются в регистрах. С функциями и таблицей переходов это будут либо глобальные переменные, либо локальные переменные, передаваемые по ссылке. И то, и другое менее эффективно.
В GCC есть computed goto, что хорошо подходит для написания эффективного интерпретатора, однако это не входит в стандарт С, и другими компиляторами не поддерживается.
Мне понравилось решение этой проблемы с помощью макросов CASE/ENDCASE/DISPATCH, которые могут быть раскрыты в switch/case, computed goto или call table в зависимости от условий.
CASE(opcode1) handle_opcode_1; DISPATCH(1) ENDCASE CASE(opcode2) handle_opcode_2; DISPATCH(2) ENDCASE
Основная проблема в том, что компилятор не распознаёт то, какую функцию мы вызываем. И не может соптимизировать — инлайн не выполняется, оптимизация по регистрам тоже невозможно, так как не известно в каком окружении вызывается табличная функция, и какие регистры свободны, для case'ов такой проблемы нет.
Действительно, насчет производительности я был не прав.
Второе — инвертировать if. То есть заменить
if (cond) {
// do something
} else {
// error
}
наif (!cond) {
// error, break
}
// no error
// do something
И никакой многоступенчатой вложенности.
Ваше предложение плохо тем что вы подменяете логику работы кода и ухудшаете его читабельность.
Вместо того чтобы сказать при определенном условии — сделай то-то и то (например — если прошел запрос к базе данных — выведи ответ на веб страницу), а если упало — обработай ошибку. Вы меняете его на если что-то упало — выведи ошибку, а вот если не упало — сделай то-то (если запрос не прошел — выведи ошибку, а если прошел — напечатай информацию). Это намного более непонятно, тк более специфичная или даже исключительная ситуация обрабатывается раньше чем нормальная логика приложения.
if ($user)
if ($user.has_right('hello')
if ($name = $user.getNameFromDB())
echo "hello {$name}";
else
throw new DBEcxeption;
else
throw new ForbiddenException;
else
throw new NeedAutenticateException;
и
if (!$user)
throw new NeedAutenticateException;
if (!$user.has_right('hello')
throw new ForbiddenException;
if (!($name = $user.getNameFromDB()))
throw new DBEcxeption;
echo "hello {$name}";
А представьте, что таких проверок десяток? Даже просто посмотреть какое исключение выбросится для не сработавшего условия где-нить на 5-м уровне вложенности может быть не просто в первом варианте. Да даже выделить глазом сразу где собственно основной код. А во втором, по-моему, проще — глаз пробегает по кучке проверок, не вникая в их суть, и останавливается на основном коде. Главное, чтобы более специфичная или исключительная логика была элементарна — если не получается уложиться в 1-2 строчки, по которым с первого взгляда видно, что они обрабатывают специфическую ситуацию, то надо их выделять в функцию/метод с соответствующим именем.
если пользователь зарегистрирован,
если пользователь имеет право на просмотр записи
если эта запись присутствует в базе данных
то нужно вывести ему эту запись
(кстати про доступность информации из базы — вполне можно вынести проверку доступности именно в тот код, кде доступ происходит — более логично)
Вторая запись мне говорит:
если пользователь не зарегистрирован
соощить обо ошибке
если пользователь не имеет прав
сообщить об ошибке (примерно на этом месте я забываю зачем я вообще
полез в эту функцию)
если записи не существует в базе
сообщить об ошибке
вывести результат
вы говорите об абстрактной читаемости и красоте, а я о практической — которая помогает понимать — что код делает и зачем он был написан.
От большой вложенности стоит спасаться — это факт, но для этого есть другие средства:
1) лучшая локализация места в котором происходи ошибка
2) extract method
Кончено, код
if ($user)
echo getNonEmtyNameFromDBIfUserHasRight($user);
else
throw new NeedAutenticateException;
читабельней любого варианта, но, имхо, как раз читабельней абстрактно.
И логику никто не подменяет. Она остаётся прежней. Ведь суть логики — только если все проверки пройдены, выполнить код.
Сочетание «ei» (дающее дифтонг) — «ей»,
Буква «a» в закрытом слоге (и это не английское «а», а полудолгий звук, которого в русском вообще нет) — «е», допустимо также «а».
«Когерентность каша» :)
Меня, лично, очень радует такой вариант заимствования: «читается КАК пишется(ближайшее слово ИЗ ( дословный_перевод(), дословный_перевод_корней(), транслитерация() ))».
Типа: «action» — «акция», «dataform» — «датаформа».
А вообще — добрые, необычные искажения слов при заимствовании идут языку и его носителям только на пользу.
Чего стоит одна только «вьюшка» против монструозного «представления» на устах суровых ораклоидов.
Дословный перевод обычно всё же не плох, если переводится нужное значение слова, а не первое попавшееся, особенно если у этого первого попавшегося несколько значений в русском языке, в общем «действие», а не «акция»
К сожалению, не всех. И код приходится читать… хм… всякий.
А о «проблемах», уж не знаю, для кого это действительно проблема… Наверное для клавиатуры, снашивается всё-таки, можно было клацнуть один раз таб, а кликают 2 раза пробел. Двойная нагрузка как никак, баг ^^
Вопрос читабельности — так это вообще ничего не решает. На собственном опыте, отступ в 1-8 никак не сказывается, пробел это или таб, не важно. Куда страшнее, когда в кривом коде идёт всё без отступов, сплошные черезстрочные пропуски и переменные в алфавитном порядке.
Лично я ушёл с таба на пробел лет 5 назад, по мне так удобней, но как говорится, это дело личных предпочтений. Кстати, о том чтобы настраивать на каждой машине отдельно размер табуляции под свои предпочтения, что мешает:
а) заменить пробелы на табы (решение в 5 сек в любом редакторе кода)
б) клацнуть на выравнивание кода
Имхо, это раздутый на пустом месте спор.
в нормальных редакторах нажатие [Tab] вставляет нужное количество пробелов.
для удаления — либо backspace удаляет правильно, если это indent; либо Shift+Tab
1) Windows vs Linux
2) Apache vs Nginx
3) Firefox vs Opera
4) QIP vs Miranda IM
5) ICQ vs Jabber
6) iPod vs Cowon
7) Яйцо vs Курица
2. lighttpd
3. FF + Chrome
4. Skype
5. см. пункт 4
6. не слушаю музыку с портативных устройств, берегу уши
7. Выбираю глазунью и куриный биток
Мне так удобнее, любите запускать игры под вайном, ваше дело. Обожаете Оперу, ну что же, тоже нормальный браузер и т.д. А те кто с пеной у рта доказывают, что надо использовать только «это», просто не умеет выбирать сам.
Обычно не обращаю внимания на холивары какой браузер лучше, но меня удивляют товарищи, которые видя у меня например неработоспособность какого-то js, использующего фичи какого-то браузера, сразу констатируют «ну это же опера», при этом в аналогичной ситуации, но когда что-то не работает в «их» браузере, долго возмущаюся на код :)
Ну не знаю. Работаю в том браузере, который мне удобней и в которой по моим «сферам интересов» всё работает нормально, а других учить жить в этом отношении не лезу. Но и другими браузерами пользуюсь при необходимости. Какой смысл с пеной у рта доказывать что-то своё кому-то с противоположным мнением, если сам уверен в своём выборе и почти так же уверен, что оппоненту на твои аргументы
Можно даже процитириовать с сайта нжынкса:
— nginx [engine x] is a HTTP and reverse proxy server, as well as a mail proxy server.
Для интереса хотя бы посмотрели что это такое, на сайте очень развернутое описание. Если не умеете даже это гуглить, то вот, пользуйтесь → nginx.org/en/
Если попытаться корректно перевести на русский язык (с сохранением смысла), то получится что-то вроде «nginx — это HTTP- и прокси-сервер».
Т.е. он может работать и как HTTP server, и как reverse proxy server.
nginx [engine x] is a HTTP… server — это в первую очередь.
Реверсивный HTTP-прокси сервер из него не очень. HTTP 1.1 для бэкенда не поддерживает. Лучше уж какой-нибудь squid юзать.
1) MacOS X
2) Nginx
3) Safari/Chrome
4) Miranda IM^W Skype
5) Jabber
6) iPod
7) На завтрак глазунья, на ужин курочка.
2) Apache+Nginx
3) Chrome
4) Qutim
5) Skype
6) Cowon
7) Курица в маринаде :)
Холиварный ответ получился только на 2 вопроса )
Редактирую массу исходников на разных языках,
Это дело вкуса notepad ++ или gedit легко настраиваются…
Вот кому тяжко после этой статьи — программистам на White Space
en.wikipedia.org/wiki/Whitespace_%28programming_language%29
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Например, для PHP есть стандарт Zend/PEAR, где регламентируется ставить 4 пробела вместо табов для отступов — но хорошо, если его придерживается хотя бы 10% разработчиков. Поэтому я для PHP отступы предпочитаю делать табами.
Другое дело — Ruby, где за стандарт принято делать отступы двумя пробелами (и, кстати, самого стандарта я не читал — но сразу это понял по исходникам множества библиотек). И код, который не следует этому правилу выглядит просто чужеродно — я даже подозреваю, что такие библиотеки использовать почти никто не будет. Или будут, но только после того, как переделают табы в пробелы :)
P.S. Кстати, есть аналогичная статья от Дмитрия Котерова (широко известного в узких кругах PHP и JavaScript-гуру).
В Java, Python, и Ruby этой проблемы не существует — за игнорирование стандартов, как тут уже сказали, можно получить молотком по пальцам. :)
Ведь много людей, особенно на просторах бывшего ссср, в силу сложившихся обстоятельств занимаются одновременно разного вида работами и используют разные языки, и в таком случае использовать для каждого языка какой-то особенный стиль (рекомендуемый для данного языка) будет очень не удобно.
С JavaScript, увы, все не так радужно — возможно, есть стандарт кодирования ECMA, но если даже он есть — то его судя по всему мало кто придерживается.
в таком случае использовать для каждого языка какой-то особенный стиль (рекомендуемый для данного языка) будет очень не удобно.
Согласен, вполне возможно. Но лично я такой проблемы не вижу — пишу одновременно на Руби, Питоне, и PHP — и везде стараюсь соблюдать стандарты.
Иногда идет «поток мысли кода» и тут совсем не хочется думать о правильном оформлении оного.
Тут та же проблема, что и с грамотностью — есть ведь такая отмазка как «торопился и не думал об ошибках». :) Но грамотные люди пишут грамотно всегда, вне зависимости от того, торопятся они или нет.
Тут то же самое — писать код нужно всегда правильно и по принятому в языке/компании/проекте стандарту.
Ну и я говорил не про вас, а про людей, которые руководствуются принципом «всеравно пешу быстра, пра стондарты и грамматнасть можна ващще не думать» (согласитесь, такое читать не особо приятно? :) Вот по-моему то же самое и с кодом).
А на хрена об этом думать? Выставил настройки редактора — и пусть код хлещет хоть потоком, хоть водопадом.
Этот топик — обычный холивар, где слепо кричат: «даешь табуляцую!» и лишь изредка слышаться возгласы, что это не универсальный совет, как бы вам того ни хотелось.
Поверьте, я далеко не новичок в программировании, я занимаюсь этим делом уже 11 лет и могу показать примеры своего кода, там не то что вы, там комар носа не подточит. Я работаю в команде не первый год и понимаю, как это плохо делать что-то под себя не думая о других. Там может не будем хаять налево и направо?
Возможно, мои фразы кажутся разлагающими для новичков, которые могут увидеть за ними призыв к расхлябанности, но я все же надеялся, что уровень хабра много выше и люди понимают, что надо относиться к подобным советам осторожно, но и не отрицать однозначно.
Слепо? А по-моему автор всё разложил по полочкам, заранее ответив на любое возможное возражение. Вы сам топик-то читали, или только заголовок? ;)
Однако позиция «отступы табами» в топике изложена достаточно аргументировано (в отличие от позиции «отступы пробелами» из предыдущего топика).
Сам пользуюсь табами, но бывают случае что только пробелы спасают. К примеру: код построен с использованием табов и его надо показать кому-нибудь через сервис в стиле pastebin, то код с вложенность 5 и выше ужа начинает уходить за рамки т.к. сервис использует табы размером 8 пробелов.
fktrc.livejournal.com/630.html
Не только в отношении пробелов/табов, но и в прочем.
Кажется я начинаю понимать, откуда такое моё несогласие с миром.
Ваше несогласие с миром заключается в том, что «много слов — мало дела». Вот давайте посмотрим этот ваш комментарий. Никакого смысла, никаких аргументов, одни эмоции. Сначала выставили себя «борцом против мира», этакий герой.
И мне совершенно не интересны теоретические и идеологические обоснования почему табы лучше. Я практик.
Все мы практики. Но своим сообщением вы всех, кто использует табы обвинили в отсутсвии практики. Без веских оснований.
Когда я беру код и вижу, что он разъехался, так по мне пробелы в 100 раз лучше.
Опять же, никаких аргументов, можно заменить «пробелы» на «табы» и получится ровно тот же смысл:
Когда я беру код и вижу, что он разъехался, так по мне табы в 100 раз лучше.
Дело не в табах и не в пробелах, дело в профессионализме, отступы у новичка поедут что там что там.
Никто никогда не заворачивается, что такое indentation, alignment.
Аналогично. Пустой набор слов. Начнём с того, что он в корне неверен, так как ваше «Никто никогда» уже опровергает мой пример. Ну и даже если бы он был верен, то такое было бы применимо что к табам, что к пробелам.
Просто 5-10 лет назад натабили и пошли дальше.
Это вообще ни к селу ни к городу. «В огороде бузина, а в Киеве — дядька».
Просто у вас поток эмоций, мало информации и аргументов, потому многие люди вас не восприняли.
И еще — вы не поняли основную идею топика.
Начнём с того, что большинство людей (по крайней мере на Хабре) предпочитают табы.
средняя температура по больнице?
А еще дополнительно у пробелов есть такие недостатки, как невозможность быстрого перемещения стрелочками клавиатуры (щёлкает каждый пробел, а не через блок), возможность допустить ошибку (поставить в одном месте 3 пробела вместо 4, чем порушить дальнейшую структуру), увеличение размера файла и куча всего ещё.
Да ну? Вы какой IDE пользуетесь? У меня даже gedit с включенным умным отступом по пробелам в identation быстро переходит. Так же как и умеет если что кусок кода на n пробелов вправо-влево сдвинуть.
ИМХО вы привели единственный (впрочем, объективный) аргумент — возможность настроить отображение табуляции в любое кол-во пробелов. Только расписали в несколько параграфов разными словами.
Я лично вообще ни за то, ни за то. Когда пишу на PHP и C++ отбиваю табом. Когда пишу на Ruby, отбиваю пробелами. Зачем этот топик? Хабр недовыполняет недельную норму холиворов?
Она говорит, что людей, которые предпочитают табы на Хабре больше.
Какие этому причины — другой вопрос. Если появится язык, в котором отступы можно будет отбивать при помощи и все три его пользователя будут пользоваться именно этой возможностью, это не значит, что статистика — неверная.
Я просто не понимаю, зачем мне приписывать то, чего я не говорил. Я сказал, что «людей, которые предпочитают табы на Хабре больше». Где тут что-то про качество языка?
Я не понимаю, зачем вы используете эти грязные приёмы ведения дискуссии, они вас не красят.
вы используете количество проголосовавших за табы как аргумент о том, что они лучше
Нет, я привожу результаты опроса с выводом о том, что большинство людей предпочитает табы. Я нигде не сказал, что это как-то влияет на их качество.
а по части статистики, мне что-то подсказывает, что на хабре (да и в принципе) большая часть кода остаётся проприетарной. потому и табами большее кол-во человек пользуется. но это всё равно не аргумент за то, что табы чем-то принципиально лучше пробелов. как и наоборот.
просто можно договориться с коллегами о том, какого размера табы и т.п.
Я писал об этом в топике и назовите мне хотя бы одну причину повторятся об этом в комментариях, если это уже написано в топике?
По опыту с другими языками могу сказать что пробелы-табы — разницы никакой. Главное правильно настроить редактор и убедиться что в коде используются либо только пробелы либо только табы. Козёл может и в том и в другом огороде наследить.
Включите отображение табов/пробелов, иногда меняйте размер табуляции на другой и пробегайте глазами код, чтобы удостоверится, что у вас где-то не вставились пробелы вместо табов или табы вместо пробелов.Это, кстати, важно, что табы приходится проверять. С пробелами код всегда выглядит именно так, как есть на самом деле.
Java/JS/etc — табы, если, конечно до этого они и были. Бывало попадался код вперемешку — вот за такое точно надо казнить.
Полностью согласен с автором, дико неудобно читать\править код, где недостаточные отступы у блоков или наоборот, табуляции всегда можно «подкрутить» под себя.
![](https://habrastorage.org/storage/15535614/9d1ca849/8ea6811c/0c32d952.png)
По табу вставляется нужное количество пробелов, всегда устраивало)
function qwerty(){
for(...){
if(...){
$result = '<div><span>blablabla</span></div>';
}
}
}
Но одновременно хочется сделать нормальное форматирование готового html, т.е. получается что-то такое:
function qwerty(){
for(...){
if(...){
$result = '<div>
<span>
blablabla
</span>
</div>
';
}
}
}
* This source code was highlighted with Source Code Highlighter.
Получаем нечитабельный php :(
Как быть, когда хочется везде сохранить форматирование? Пытаться избегать таких случаев вообще?
ЗЫ Я только учусь, поэтому такой код у меня встречается сплошь и рядом.
$result = "<div>\r\n\t<span>\r\n\t\tblablabla\r\n\t</span>\r\n</div>\r\n";
$result = "" +
"<div>" +
" <span>" +
" blablabla" +
" </span>" +
"</div>";
Но лучше использовать шаблонизатор
function qwerty(){
for(...){
if(...){
$result = \
'<div>
<span>
blablabla
</span>
</div>';
}
}
}
иногда я пользуюсь утилитой indent на коде который мне надо отъиндентить в соответствии с нашим регламентом.
В любом случае ни вы не я вам не смогу ничего доказать, так что давайте перейдём непосредственно к оскорблениям… чего уж там…
M-x untabify
M-x delete-trailing-whitespaces
И так будет с каждым. ;)
Лично я за пробелы. Хотя бы просто потому, что величина отступа, на мой взгляд, наименьшая из проблем с переходом на новый «стандарт» форматирования, с которой может столкнуться программист в новом коллективе. Например, для Java различия между
public class Foo {
public void foo() {
return 0;
}
}
и
public class Foo
{
public void foo()
{
return 0;
}
}
для меня куда большая проблема с читабельностью, чем эти ваши табы.
Никаких проблем при использовании табов для indent'а и пробелов для выравнивания внутри строки. Размер таба каждый программист может настроить под себя сам, как ему удобно. В чем проблема у людей, которые «кричат» об использовании пробелов в качестве символов для отступа? Они хоть раз большие объемы текста форматировали для удобного чтения и работы с ним?
Но, как говорится: «На вкус и цвет — все фломастеры разные!» (с) услышал от друга, а первичного автора не знаю
Табами надо уметь пользоваться. Как заметил автор, что-то можно сделать табами, что-то пробелами. Идент надо делать табами, алайн пробелами, но откуда об этом знает Вася Пупкин? Он будет херачить табами внутри кода чтобы сделать «красивенько» (кстати в питоне делать так нельзя), а программист всегда пишет код для другого программиста. Всегда.
Если использовать пробелы, то точно знаешь — все отступы это пробелы. Табы же не видны глазом — сиди потом выковыривай.
Далее, обычно в закрытых проектах (опять же серьезных, о Васе Пупкине ни слова!), командой перед началом каких-либо работ по написанию кода, ставится серьезный вопрос о применяемых в данном проекте правил оформления.
Для open source проектов, в которые может писать пресловутый Вася, опять же можно использовать хуки, которые просто не позволят человеку закоммитить плохо оформленный код (плохой, но хорошо оформленный, конечно же позволят, тут уж не обесуддьте).
P.S. Ответ скорее не Вам лично, magic4x, а просто — общий взгляд на проблему с моей стороны.
P.P.S. Табы глазом не видны, да… Но зато хорошо прощупываются при наборе текста и перемещению по нему (так сказать — на ощупь).
Проблема как раз чаще всего встречается на «начальных» этапах развития разработчика. Ну и ходить стрелками туда-сюда тоже не хорошо, не будете же вы весь код проверять.
Поражаюсь способности устраивать холивар из любой мелочи! В команде — работаешь по командным стандартам, в одиночном режиме — так, как _тебе_ удобнее. Казалось бы, о чемм спорить…
Плюс недавно увидел как сделаны отступы в CSS типа
section { background: transparent; font-size: 1.1em; text-align: left; height: 100%; color: #545453; }
также сделанные табами.
Читается глазом просто великолепно, но на продакшене можно просто вырубать/сжимать
В статье же написано про alignment, и почему его нельзя делать табами. А вы тут же берёте и делаете, не слушая никаких аргументов.
section {
→background:→transparent;
→font-size:→1.1em;
→text-align:→left;
→height:→→100%;
→color:→→#545453;
}
Для выравнивания используется то однократный таб, то двукратный. Следовательно, едва размер табуляции окажется достаточно значительным (в этом примере — 6 пробелов), так двойной таб и начнёт переносить дальше, чем однократный таб:section {
background: transparent;
font-size: 1.1em;
text-align: left;
height: 100%;
color: #545453;
}
Если же размер таба окажется недостаточно значительным (в этом примере — 2 пробела), двойной таб будет недостаточно длинным:section {
background: transparent;
font-size: 1.1em;
text-align: left;
height: 100%;
color: #545453;
}
![](https://habrastorage.org/storage/88eda850/af5e36df/ba34a957/6bf34082.png)
То, что используется стиль с табами, не значит,
что теперь везде между переменными надо ставить табы вместо пробелов ;)
А вообще смешно — насколько же бывают эпичными баталии вокруг мелочей. Все время вспоминается Джонатан Свифт с его феерической враждой между тупоконечниками и остроконечниками.
Собственно проблема Andrey2008 — не пробелы или табы, а неорганизованность сторонних программистов и их исходников. Но была «придумана» ( поднята из недр всего и вся) причина этой проблемы — «во всем виноваты табы» и он начал эпохально и публично с ней сражаться. Это достаточно типично для большинства
Результат не заставил себя ждать — инста-драма на почти 300+ комментариев. И не думаю что призыв к миру и объяснения ее хотя бы затормозят. Но имхо скоро ожидается прилет НЛО ;), главное чтобы авторов не выпилили — будет обидно.
PS: на всякий случай — я табо
1. инструкция программиста в компании (кстати, у нас alignment строго запрещен, «декоративное оформительство» — зло)
2. умею настраивать рабочие инструменты ( не только IDE но и notepad++\notepad2)
3. видел оба подхода и выбрал для себя табы т.к. они настраиваемые, а пробелы нет.
PPS: извините за некоторый луркмоар — жду когда ребята оттуда допилят статью про хабр на тему этой драмы :)
кстати, у нас alignment строго запрещен, «декоративное оформительство» — зло
Ну хоть кто то озвучил эту прекрасную мысль.
Целый холивар развели, а все изза этого гребанного alignment. Всем холиварщикам советую почитать что думает по этому поводу Макконел.
Вот например:
$sample = array(
'dbSettings' => array(
'type' => 'mysql',
'host' => '127.0.0.1',
'password' => '',
'user' => 'root',
'port' => '',
'andSomeLongKey'=> 'foo',
),
'route' => array (
...
),
);
а теперь представьте что вам надо в подмассив 'dbSettings' добавить еще один параметр с очень длинным названием. Вам после этого придется пробежаться по остальным и доофрмить их чтобы все стало ровненько по вертикали. Такие казалось бы мелочи раздражают сильно, а вот читабельность от таких выкрутасов повышается незначительно. Мне например больше по душе вариант такой:
$sample = array(
'db' => array(
'type' => 'mysql',
'host' => '127.0.0.1',
'password' => '',
'user' => 'root',
'port' => '',
'andSomeLongKey' => 'foo',
),
'route' => array (
...
),
);
<.source>
$sample = array(
'db' => array(
'type' => 'mysql',
'port' => '',
'config' => 'smth else',
'hostname' => '127.0.0.1',
'password' => '',
'username' => 'root',
'andSomeLongKey' => 'foo',
),
'route' => array (
...
),
);
Особо актуально в css-свойствах:
$('#element').css({
color : 'red',
width : 100,
height: 100,
backgroundColor: 'white',
borderRadius : 15
});
Всем холиварщикам советую почитать, что думает по этому поводу Макконел.Который? (Надеюсь, не Кэмпбелл Макконел, автор «Экономикс»? Потому что нельзя же принципы его экономической школы без раздумья прилагать ко программированию?)
Для этой цели имеется спец софт и скрипты для его описывающие форматирование.
Т.е. ни кто не парится по поводу пробелов/табов, стиля расстановки скобок…
каждый пишет как хочет, — всё-равно потом надо будет жмякнуть F12 и код преобразуется к единому стандарту.
Затем, по желанию, можно будет жмякнуть, например, F10 — и едино-стандартизированный код переформатируется в тот вид, который удобен лично мне.
FmtPlus
это форматер SQL.
Но когда я баловался с Aptana находил похожие реализации (плагины) умеющие Ruby, Ruby on Rail, JS и css переформатировать по хот-кеям несколькими способами.
Аптана у меня не прижилась — перешёл на vim, так что даже название этого плагина я не упомню.
Сейчас сижу ищу подобное для Vim'а — уверен, что есть.
Плагин — это хорошо, но нужет обязательно скрипт — шоб повесить Хуком на пуш в репозиторий
Вопрос в том, прийдется ли для изменения форматирования писать полноценный анализатор кода для ЯП… или можно обойтись малой кровью?
нашёл хороший форматер js:
www.vim.org/scripts/script.php?script_id=2727
думаю, что по его принципам можно написать подобное для других языков, если не получится найти.
Первое можно делать и табами, и пробелами, но когда делаешь табами — каждый может подстроить ширину indent'а на свой вкус и ничего никуда не едет. А второе — строго пробелами.
Все равно не получится и рыбку съесть и… (ну вы знаете). Если отступы делать табами, а выравнивание пробелами, то, во-первых, задалбывает выравнивать пробелами, ибо в несколько раз больше нажатий на клавиши, во-вторых, есть соблазн жмакнуть таб по привычке, и тогда все поедет при другой ширине табов, ну и, конечно, то, что можно использовать в коде и то, и то (пусть и такими ясными оговорками) в реальной жизни скорее всего приведет к тому, что будет каша и табов и пробелов безо всякой системы.
Для питона pep8 настоятельно рекомендует использовать пробелы.
И для ruby рекомендуется использовать 2 пробела (1, 2).
Для javascript Крокфорд рекомендует избегать использования табов.
Понятно что многое из этого просто рекомендации, каждый сам должен для себя решить что использовать, но лично для меня все эти люди и организации являются авторитетными и я свой выбор сделал.
В Python, например, пробелы рекомендованы, а в Ruby и вовсе почти обязательны — кроме советов создателей есть такой эффект — при вставке кода с табами в интерактивную консоль сработает автодополнение.
Это будут использовать и в других языках — перенастраивать IDE для разных языков хочется не всем.
Посоветовал бы автору не навязывать такие вещи и указывать область применения (к примеру, конкретные языки или среды разработки).
Это не в укор стандартам с табами, просто я не пользовался ими, а в тех что мельком видел, прописывалась ширина таба.
Из последнего с чем я работал с опен сорсом — это Android. К нему очень хорошо всё описано — source.android.com/source/code-style.html и по этой доке легко настраивается профиль для Eclipse. В итоге у меня есть два профиля — один корпоративный, который полностью соответствует Java coding conventions и второй для Android с их поправками. Авто-форматирование срабатывает при каждом сохранении, я в него кроме этих конвенций добавил только удаление пробелов в конце строк.
А вообще не мой взгляд, это одна из тех вещей которые должна за программиста решать среда разработки. А именно:
1) Должна быть возможность выбора что используется для выравнивания
2) Должна быть возможность автоматической расстановки отступов в каждом открываемом файле/по некой комбинации клавиш/просто по клавише Tab. В случае когда отступы расставляются автоматом для всех открываемых файлов проекта (именно текущего проекта, то бишь с фильтрами, например не расставляя отступы во всех внешних открываемых заголовочных, текстовых и прочих файлов), программист не должен даже замечать что «тут что-то не так...».
И собственно всё! Любой нормальный *diff и так разберётся что не нужно замечать изменений в табуляции, если это не питон. В этом плане считаю наиболее продвинутым Qt Creator
Отступы (обоих типов) — это чисто проблема view, вводимые для этого символы — model, и вводить символы пробела, которые служат для разделения слов, но, в случае, если используется шрифт, у которого почему-то все символы имеют одинаковую ширину, в качестве сайд-эффекта от своего добавления позволяют делать отступы требуемой ширины, для отступов — это глупо и некрасиво.
Всё это форматирование пробелами полетит при смене шрифта на намного более читабельный пропорциональные. Скажу даже больше: уродливые моноширинные шрифты на данный момент требуются едва ли не исключительно из-за выравнивания пробелами. Люди, на дворе 21-ый век, после DOS-ового Лексикона уже вышло штук пятнадцать поколений Word-ов, а потом и опенофисы/гуглдоки, а вы до сих пор используете моноширинные шрифты!
На практике я, к сожалению, за пробелы. Потому что я пишу на языках, где активно использую и indentation, и alignment. При этом alignment с помощью tab-ов тоже можно было бы сделать, и это было бы достаточно красиво (разумеется, даже с пропорциональными шрифтами), но… пока ни одного IDE/редактора с возможностями tab-based alignment нет.
Мало того, для активного использования tab-based alignment нужно, чтобы если не все, то хотя бы подавляющее большинство IDE/редакторов их использовало.
То, что все символы шрифта имеют одинаковую ширину — это не «почему-то вдруг», это абсолютно осознанное решение, применяемое во всех известным мне средах разработки и всех книгах по программированию, обеспечивающее одинаково удобную читаемость как для любителей табов, так и для любителей пробелов.
Угу, именно. Прочитайте своё предложение ещё раз, убирая всё лишнее: моноширинные шрифты — это решение, обеспечивающее одинаково хорошую читаемость и при tab-based, и при space-based. А теперь ещё раз: моноширинные шрифты — это решение проблемы выравнивания при tab vs spaces. Правда, при грамотном использовании tab этой проблемы нет, так что…
Иначе говоря, итог: моноширинные шрифты нужны для space-based alignment/indentation. ASCII-арта. В 21-ом веке, угу.
И чем вам не нравится ASCII-арт? Судя по тому, что во всех средах разработки по умолчанию стоит моноширинный шрифт, даже в самых навороченных и современных, ему все-таки есть место в 21 веке, и весьма значительное.
Двадцать седьмого апреля две тысячи одиннадцатого года.
У экрана моего ноутбука 145 DPI, у современных планшеток и мобильников может быть и ещё больше. Монитор с экраном размером 1920x1080 пикселей стал чем-то вполне обыденным, и стали распространяться разрешения и выше. Аппаратную текстовую консоль лично я вижу только при загрузке линукса да при редких (с последними обновлениями иксов и драйвера Intel в Дебиане — почему-то частых) падениях иксов; сомневаюсь, что многие обсуждающие видят её чаще. Матричные принтеры ассоциируются разве что с кассовыми чеками. Надобность понятия знакоместо, из которого растёт необходимость моноширинного шрифта, как таковая исчезла полностью.
Почти полностью.
Потому что на двадцать седьмого апреля две тысячи одиннадцатого года, за неимением нормальных IDE для редактирования исходников, некоторые люди (и, как я уже сказал, к сожалению, я сам) выравнивают код пробелами.
Для чего необходимо, чтобы символ пробела имел точно такую же толщину, как и символ любой другой буквы.
И то, что на пятнадцать часов тридцать три минуты двадцать седьмого апреля две тысячи одиннадцатого года по московскому времени ни одна корпорация и не придумала такую IDE, которую вы бы могли назвать нормальной, описывает разве что ваше хитрое понятие «нормальности», а не нелогичность использования пробелов.
Какой вы предпочитаете размер indent-а? Я — 3.0 em.
Лично мне довольно часто приходится что-то искать в коде. при этом средства поиска в разных IDE обычно не блещут интеллектуальностью, нормально работает только поиск подстроки.
Да, есть во многих редакторах поиск по регэкспам, но честно говоря — мне лень вспоминать и отлаживать регэксп если мне просто нужно что-то найти.
так вот… если я хочу найти, например, строку:
someVariable = a + first + b; // <--- вот что я хочу найти anotherVariable = a + 100500 + second;
Я ввожу в поиске " first " (с пробелом спереди и сзади) и нихрена не нахожу, если для выравнивания после first стоит таб.
Может быть это не самый удачный пример… это просто то что пришло в голову. Но с такой фигнёй я реально сталкивался не раз, когда не можешь что-то найти в коде если после или перед переменной стоял tab. А поиск по подстроке «first» может давать 1000 ложных срабатываний.
Конечно, когда речь идёт именно об имени переменной — может спасти поиск использования этой переменной в коде средствами IDE. Но нахрен это надо, если можно просто использовать пробелы?.. :)
плюс, то что там люди негодуют от необходимости использовать backspace многократно. не могу прокомментировать на хабре, т.к. не зарегистрирован там. но звучит это как полный бред ленивого стажёра.
большую часть времени мы читаем уже написанный код. и лишь небольшую часть времени — правим и пишем новый. так не надо лениться оформлять код так чтоб его легко и удобно было читать. какая разница, сколько раз там придётся нажать backspace, если это делается раз в час? главное чтоб код был удобночитаем везде и всегда
большую часть времени мы читаем уже написанный код. и лишь небольшую часть времени — правим и пишем новый. так не надо лениться оформлять код так чтоб его легко и удобно было читать. какая разница, сколько раз там придётся нажать backspace, если это делается раз в час? главное чтоб код был удобночитаем везде и всегда
Глупость какая-то. Когда я открываю код — я загоняю его в свою «оперативную память» — проглядываю и запоминаю и работаю с ним уже из памяти (где на отступы наплевать), я код почти не читаю — помню все с чем работаю наизусть. Правда, стоит задать даже примитивный вопрос, как память вываливается.
Уж лучше научить всех правильно пользоваться табами, т. е. делать отступы ими, а выравнивание пробелами, как положено. Чему и посвящена данная статья.
![](https://habrastorage.org/getpro/habr/comment_images/208/677/df2/208677df2c014d1faa119fdc32810326.png)
Если умна, то да, ничего не мешает использовать табы в принципе. Только вот в блокноте уже не отредактируешь по-быстрому. Сам-то я не хочу задумываться в каждой строке: где тут отступ, где тут выравнивание…
> При первом переводе скопирует табы, далее выравниваешь
> пробелами как тебе необходимо и при следующим она уже
> копирует и табы (отступ) и пробелы (выравнивание)
Сдвиг, например, равен 4 таба + 1 пробел. Сдвиг второго аргумента = 17 символов, все смотрится хорошо.
Я на маленьком мониторе хочу воспользоваться огромным преимуществом табов и для более компактного отображение у меня установлен таб = 2 пробела. В итоге второй аргумент сдвинут на 9 символов.
В приведенном у Pilot34 фрагменте все три строчки внутри функции относятся к одному блоку кода, очевидно, с одинаковым отступом. Одинаковый отступ значит одинаковое число табов. И сколько бы вы не поставили размер таба, все строчки будут сохранять одинаковый отступ.
Вам в конце статьи автор даже пример привел. На одном и том же фрагменте кода изменял размер табов от 2 до 9, и ничего не поехало.
public IList<Employee> GetResponsibles()
{
→ return GetResponsibles(
→ → ResponsibleEmployee,
→ → ResponsibleDepartment,
→ → ResponsibleOnlyManagers
→ );
}
ну или
public IList<Employee> GetResponsibles()
{
→ return GetResponsibles(
→ → ResponsibleEmployee,
→ → ResponsibleDepartment,
→ → ResponsibleOnlyManagers);
}
Фарш невозможно провернуть назад.
И мясо из котлет не восстановишь.
)
А если вообще все — то с выравниванием лажа точно вылезет…
sed 's/^ /\t/g' from > to
Хотя конечно такое сработает только с хорошо отформатированными исходниками.
function () {
var foo = 123,
bar = 234,
function () {
if (foo < bar) {
var xxx = 'qux',
yyy = 'qwe';
alert( xxx + yyy );
}
}
}
Если делать табы невидимымы — можно получить невидимый баг.
Что выведет эта программа? 32 или 9?
void main() {
std::cout << (int)(" "[0]);
}
Прописываешь в первых N строчках файла настройки для данного файла, и vim сам использует принятый в данном коде формат.
Пример
# vim: set ts=4 sts=4 sw=4 et:
Не так важно, как оформлен код, табами или пробелами. В большом проекте всегда найдутся мудаки, которые не в состоянии оценить стиль файла и настроить редактор. Патчат исходники как попало, внося хаос. И кроме как indent'ом каким-нибудь к единому стилю уже не привести. Приходится иногда шерстить весь код, внося лишние диффы.
Конечно, когда все умные, как вы, проблема только проголосовать за какой-нибудь стиль.
Не нахожу, к сожалению.
Проблема надумана. Откройте для себя комбинацию клавиш ctrl+стрелочка.
Использую табы, в гуглокоде при просмотре кода через веб-интерфейс он растягивает их аж до 8 пробелов.
Переходить на пробелы, игнорировать?
PEP8 переучил :)
В тоже время в студии ширина таба по умолчанию 4 символа.
Мы решили эту проблему использованием 4-х пробелов вместо табов.
Разделение на indentation и alignment может быть и решило бы эту проблему, но как это контролировать?
Есть ли для этого что-нибудь в Visual Studio?
С пробелами такой фигни нет. Вообще не вижу, в чем проблема с пробелами. Ну да, чуть труднее стирать уровень интенданции, но лично я все равно руками этого никогда не делаю, format block и студия сама уберет все ненужные символы, что пробелы, что табы.
Преимущество того, что каждый может использовать таб своего размера — ну не знаю. Имхо в C# есть стандарт на 4 пробела, и это нужно фиксировать в код стайле. Не вижу большой пользы от того, чтобы каждый имел свой таб, кроме эстетического наслаждения. То есть это конечно прикольно, но проблема миксов табов и пробелов мне кажется существеннее.
промахнулся на пару пикселей
И попал или слева или справа от таба. Не понимаю, как могут появится пробелы.
Ткнул куда-то примерно в нужное место, промахнулся на пару пикселей и не заметил, выровнял все, написал код…
А вот с пробелами как раз такая проблема есть. Стоит пустая строка, где у тебя
function test() {
....var a, b;
....
....a = doSomeA();
....b = doSomeB();
}
Хочешь что-то дописать, нажимаешь, промахиваешься на пару пикселей и пишешь такое:
function test() {
....var a, b;
...doSomeC();.
....a = doSomeA();
....b = doSomeB();
}
Як, кстати, вот щас прям писал и попал со второго раза куда хотел.
function test() {
----doSomeC();
}
// =>
function test() {
---this.-doSomeC();
}
Полагаю если IDE всегда правильно определяет таб или интенданцию то такого не может произойти, но у меня на практике подобное возникало миллион раз
Я не могу понять, как такое может возникнуть? ТОЛЬКО с пробелами. Ибо не может курсор быть в середине символа таба. Или слева или справа, тут нечего определять.
Например, WebStorm позволяет поставить курсор посреди пробело-таба, но не позволяет посреди нормального пробела.
![](https://habrastorage.org/files/85b/1c3/c28/85b1c3c28b9b4576ad111b314f174744.png)
Запоздалый ответ:
1) В студии не всегда правильно работают смарт табы, и вставляет пробелы (или табы) не там, где надо. Вывод — всё едет
2) В нормальном проекте куча разработчиков, не всегда получается синхронизировать настройки инструментов. В таком случае пробелы — лучше.
Но я согласен, что лучше на уровне код-стайла команды зафиксировать один вид отступов (лучше — табы), и всегда им пользоваться. За прошедший год моё видение несколько изменилось
if(1) {
if(2) {
if(3) {
console.log('Yeah! It is third level!')
}
}
}
ЗЫ я знаю про тег <code>, но в чатах его нет. Для меня это главная причина использовать пробелы вместо табуляции.
if(1) {
if(2) {
if(3) {
console.log('Yeah! It is third level!')
}
}
}
Для HTML (например чат вКонтакте) не комильфо, но альтернатива — использовать неразрывные пробелы. Их браузер не схлопывает.
if(1) {
if(2) {
if(3) {
console.log('Yeah! It is third level!')
}
}
}
```
, проверил в телеграме и в дискорде. Если нету, то все-равно нету смысла код вставлять напрямую, а не через какой-то пастбинКуда проще убедить их, что на проекте у нас отступы в два пробела и в очередной раз, получив абзац в общий чат, не копировать код к себе в редактор, чтобы об него не сломались глаза.
Но это конечно мои личные переживания и если вас окружают исключительно дисциплинированные программисты и вам не приходится читать куски кода прямо в общих чатах, то ни коим образом не призываю, что то менять. Используйте — что удобно. Главное чтобы команда приняла это за стандарт.
ЗЫ отдельно хотелось бы рассказать о лайфхаке для
contenteditable
полей ввода. Например если в Gmail вставить кусок кода напрямую из редактора — форматирование сохранится. Тоже касается например Word или Google Docs![Демонстрация вставки кода напрямую в тело сообщения Gmail](https://habrastorage.org/webt/i3/gd/rj/i3gdrj5nnzxj0ag9qfujtv2ov04.png)
Похожие возможности полагаю и до чатов дойдут. Не знаю хорошо это или плохо. Разумеется изыски в темах оформления IDE тоже могут заставить глаза лить кровавые слёзы, но комментируя код автора можно быть ближе к тому, что видит он. В целом вижу здесь возможность для улучшения коммуникации.
А других людей убедить его использовать на постоянной основе — задача и вовсе нетривиальная.Ну с такими людьми вообще работать задача нетривиальная.
А вообще убедить очень просто — код, который не оформлен как код — считать просто мусором и просить, чтобы кинули его нормально. 3 раза кинут неправильно — потом нормально.
не приходится читать куски кода прямо в общих чатахКонечно приходится. Но я ведь работаю с программистами, а не бухгалтерами — а они знают, как вставить код правильно.
Интересно в 2021 Вы всё ещё считаете что табы лучше? Для алигмента 10 раз пробел жмакаете?
Я всё ещё считаю, что табы лучше. Алигмент делает за меня ИДЕ
А вы до сих пор в 2021 используете пробелы вместо табов?
Скажите, а какая IDE умеет делать такой алигмент (из статьи):
int some_variable = 0;
int v1 = 0;
Да, я нажимаю таб и IDE делает везде пробелы.
Пора завязывать использовать пробелы вместо табуляции в коде