LINUX.ORG.RU

Использовать пробелы для отступов

 , ,


1

1

Ищу хотя бы одну конструктивную причину для сабжа. Именно в плане отступов (indentation), а не выравнивания (alignment).

Навеяло гугловым cpplint.py, который панически засирает вывод предупреждениями о табах на каждую (!) строчку. Что такого ужасного?

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

ЗЫ. Про «не смешивать в одном проекте» знаю.

ЗЫЫ. Про whitespace знаю.

UPD: Заодно ищется причина необходимости (незаменимости) табов, если такие есть. Навскидку только Makefile приходит в голову.

UPD: как минимум одна причина найдена:

Dendy

- когда компилятор говорит, мол у тебя ошибка в такой-то колонке, начинается путаница, имелась в виду визуальное или реальное количество символов; проблема легко решается на уровне редакторов кода;

★★★

Последнее исправление: schizoid (всего исправлений: 2)

Ответ на: комментарий от lazyklimm

Скорее всего, ты имеешь в виду elastic tabs.

schizoid ★★★
() автор топика
Ответ на: комментарий от lazyklimm

де-то выше нить про выравнивание перенесённых на другую строку аргументов (в том числе)

Это будет испорченный телефон. Я знаю разные аргументы против табов, но ни один из них не связан с нарушением форматирования. Можете привести простой пример с нуля?

Dendy ★★★★★
()
Ответ на: комментарий от tailgunner

Смени текст в print просто.

x = 1
if x == 1:
^tprint "x is 1\n"
........print "y is unset\n"
Norgat ★★★★★
()
Ответ на: комментарий от Dendy

Можете привести простой пример с нуля?

всё уже выше было:

вот подобный код практически нельзя нормально отформатировать табами:

runAnotherFunction(arg1,
		   getSomeResult();
		   expression && other_expression);

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

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

учитывая разницу в 4 символа (8 vs 4) частенько могут быть случаи (особенно если уровней индентации достаточно много), что 1-2 буквами не обойдётся

Знаете почему эта проблема надумана? У тех, кто любит отступ 8 пробелов широкие мониторы и/или мелкие шрифты, иначе это было бы бессмысленно.

Dendy ★★★★★
()
Ответ на: комментарий от lazyklimm

вот подобный код практически нельзя нормально отформатировать табами

А с какого перепугу посимвольное выравнивание должно форматироваться табами? Табы для отступов.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

размер строки может быть ограничен code style, и никакой монитор не спасёт

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

в данном контексте - это отступы

В данном контексте это выравнивание.

Или ты предлагаешь мешать табы с пробелами?

Повторюсь: отступы только табами, выравнивание только пробелами. Никакой мешанины. Там ведь даже ссылку выше на документацию по виму кидали.

Dendy ★★★★★
()
Ответ на: комментарий от drBatty

вроде как-то настраивалось, не?
man tabs

это только в твоём терминале и не исключено что попортит вывод друхио программ.

sed 's/\t/ /g' | less

ну да, излишние телодвижения, но можно конечно алиас запилить.

invy ★★★★★
()
Ответ на: комментарий от lazyklimm

- меньшей негибкости

Аналитики ЛОРа как всегда на коне.

anonymous
()
Ответ на: комментарий от Dendy

В данном контексте это выравнивание.

не согласен, потому что в начале строки. Кстати, использование пробелов позволяет не вникать в эту разницу :)

на документацию по виму

тоже мне, Тора...

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

не согласен, потому что в начале строки

Выравнивание всегда начинается с начала предыдущей строки, вы знаете другие случаи?

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Прошу прощения за ввод в заблуждение. Лучше сказать — выравнивание всегда ориентируется на начало предыдущей строки. А какими символами оно делается и в каком порядке неважно, главное помнить, что табы в выравнивании присутствовать не могут.

Dendy ★★★★★
()

Если отступ идёт после выравнивания, то табы использовать нельзя, иначе всё разъедется.

#include <iostream>

int main (int argc, char **argv)
{
    auto hello = [](const char *s)
                 {
                     std::cout << "Hello, " << s << "!" << std::endl;
                 };
    hello(argc == 1? "World": argv[1]);
}

Может быть, в curly-bracket languages это не так популярно (слава б-гу), но в Haskell такое часто встречается.

scanl            :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs     =  q : (case xs of
                            []   -> []
                            x:xs -> scanl f (f q x) xs)
anonymous
()
Ответ на: комментарий от geekless

Как у вас там живётся в начале 90-х?

а если сливаешь 3 файла в один? У тебя 4 файла тоже на экран влезают, или ты просто никогда сырцы не мержил?

drBatty ★★
()
Ответ на: комментарий от lazyklimm

У тебя же оба вызова выглядят по-разному. Один однострочник, а другой подпёрт тучей пробелов. Где единство то? Нет его. Было бы, ты бы оба в 1 строку написал или оба перенёс бы.

Код, вида

runSomeFunction(arg1);
runAnotherFunction(
	arg1,
	getSomeResult(),
	expression && other_expression
);
if(
	someConditionHere(
		"we", "have", "bazillion", "params"
	)
	&& more
) doSomething();
визуально понятен. Твой же при смешивании с другими блоками (условия с одной командой, например) выглядит как говно.

runSomeFunction(arg1);
runAnotherFunction(arg1, getSomeResult(),
		   expression && other_expression);
if(someConditionHere("we", "have", "bazillion",
                      "params") && more) doSomething();
// Или doSomething(); на следующей строке, что тоже не сахар.
anonymous
()
Ответ на: комментарий от vurdalak

А idea еще при слиянии показывает три версии файла рядом: исходная, новая и результирующая, которую ты можешь редактировать.

а что делать, если разработчиков больше одного? И у тебя _две_ новых версии?

drBatty ★★
()
Ответ на: комментарий от vurdalak

Был бы ССЗБ, если бы мне это доставляло проблемы. А так все устраивает, ибо правила большинства ЯП требуют ограничивать длину строки в 80 символов, и несогласные с оными мне не попадаются.

это что за ЯП такие? Закопай пожалуйста.

drBatty ★★
()
Ответ на: комментарий от Norgat

Python воспринимает блок кода исходя из количества пробельных символов.

дык это-то и плохо. Де факто принято, что один пробел эквивалентен любому числу любых пробельных символов(>0)

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

пистонопроблемы.

drBatty ★★
()
Ответ на: комментарий от Norgat

, getSomeResult()

так пишут *аки. На любом языке. Ну может на мордорском и можно.

drBatty ★★
()

Ширина табов может варьироваться как 2, 4 или 8 пробелов, а выравнивание кода корежится неимоверно при изменении ширины таба. Представь, ты используешь ширину в 4 пробела, а какой-нибудь GitHub, куда ты отсылаешь коммиты, - 8. Нафиг-нафиг.

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 1)
Ответ на: комментарий от Dendy

- когда компилятор говорит, мол у тебя ошибка в такой-то колонке, начинается путаница

IDE должна уметь решать этот вопрос. VIM решает. Ставит туда курсор. Если-бы ещё и компилятор мог-бы разобраться в моём былокоде, и искать ошибки - было-бы замечательно. Потому IRL не нужно. Ну хоть строку находит.

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

1. vim решает

2. «стандартный символ» есть - \t. В этом-то и багофича и предмет Священной Войны.

с пробелами везде одинаково выглядит: это явный минус, совместимость между пользователями должна определяться форматом, а не тем, какие инструмены используются для визуализации; на следующем этапе адепты пробелов расскажут какой вам выбрать шрифт, редактор и операционную систему;

VIM решает и этот вопрос. Рассказать как?

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

vim

Ну ты понял.

drBatty ★★
()
Ответ на: комментарий от Norgat

Но в редакторе получаем «ёлочку», которая слабо смахивает на один блок кода под if.

пистонопроблемы.

drBatty ★★
()
Ответ на: комментарий от invy

это только в твоём терминале и не исключено что попортит вывод друхио программ.

это не даёт тебе права говорить «всегда». Если ты фанат 6и пробельного таба, это тебе поможет. Мне пофиг, и 8 норм.

ну да, излишние телодвижения, но можно конечно алиас запилить.

holywar…

drBatty ★★
()
Ответ на: комментарий от drBatty

В смысле больше одного? Ты делаешь pull и получаешь две версии. Одна пришла с удаленного сервера, одна твоя.

vurdalak ★★★★★
()
Ответ на: комментарий от Dendy

- едет форматирование: как можно заметить в данном треде достаточно людей, не понимающих разницу между отступом и выравниванием, для них любые 4 (варианты: 2, 8) подряд идущих пробела потенциально можно заменить на табуляцию, чтобы потом жаловаться;

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

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 2)
Ответ на: комментарий от iVS

Представь, ты используешь ширину в 4 пробела, а какой-нибудь GitHub, куда ты отсылаешь коммиты, - 8

Расскажи, что ужасного произойдет.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Ты не умеешь пользоваться табами. Не программируй больше.

Ну и табы, это верх мастерства программиста? я не фапаю на табы.

iVS ★★★★★
()
Ответ на: комментарий от vurdalak

А так все устраивает, ибо правила большинства ЯП требуют ограничивать длину строки в 80 символов, и несогласные с оными мне не попадаются.

Вот за что не нравится HTML, что нет разрыва строки и приходится городить все в одну строку.

iVS ★★★★★
()
Ответ на: комментарий от anonymous

Что?

А то! Если не знаешь, что перевод строки и отступ в HTML интерпретируются браузерами минимум как один пробел, то молчи уж.

iVS ★★★★★
()
Ответ на: комментарий от AlexCones

По моему ничего не значащему мнению ТАБы просто экономят время - вместо 3-4х нажатий на пробел можно не задумываясь жмакнуть по TAB.

Я жму один раз TAB и добавляется столько пробелов, сколько нужно для выравнивания кода. ЧЯДНТ?

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 1)
Ответ на: комментарий от iVS
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8"/>
	<title>Матчать</title>
</head>
<body>
<p>
	<a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.
</p>
</body>
</html>

Таки ты знаешь не всё, малыш.

anonymous
()
Ответ на: комментарий от iVS

Я жму один раз TAB и добавляется столько пробелов, сколько нужно для выравнивания кода. ЧЯДНТ?

Никогда не удаляешь оступы и никогда по ним не перемещаешься.

schizoid ★★★
() автор топика
Ответ на: комментарий от anonymous

А теперь сравни это

<p>
	<a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.
	<a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.
</p>
и это
<p>
	<a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.<a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.
</p>
В первом случае браузер показывает пробел между ссылками, во втором - нет. И теперь возьми нормальные языки. Даже в LaTeX в конце строки можно поставить %, чтобы не было лишнего пробела.

iVS ★★★★★
()
Ответ на: комментарий от schizoid

Никогда не удаляешь оступы

Зачем в коде самостоятельно удалять отступы? жму TAB, и удалится, сколько нужно.

и никогда по ним не перемещаешься.

Навскидку, просто нажал бы TAB, и переместился бы на первое слово в строке. Работает во всех программных модах в Emacs.

iVS ★★★★★
()
Ответ на: комментарий от iVS

Как я понял, у тебя в коде мешанина из табов и пробелов: первые - для отступов, другие - для выравнивания. Нафига две сущности, и забивать этим голову?

Ещё у меня в коде мешанина из букв нижнего/верхнего регистров, цифр, скобок, кавычек и прочих спецсимволов. Я верно понимаю, что можно заменить 52 символа латинского алфавита одним: a + (aa*aaaa)/aaa, чем повышу читабельность ровно в 52 раза за счёт колоссального ликвидирования лишних сущностей?

Dendy ★★★★★
()
Ответ на: комментарий от iVS

А, ты об этом… Что-то туплю. Могу предложить костыль :)

<p>
	<a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.<!--
	--><a href="/">Глупый пингвин робко прячет тело жирное в утёсах</a>.
</p>
anonymous
()
Ответ на: комментарий от vurdalak

В смысле больше одного? Ты делаешь pull и получаешь две версии. Одна пришла с удаленного сервера, одна твоя.

одна пришла от Алисы, одну написал Боб, одна была на сервере(учти, Алиса про новую версию Боба не в курсе, она на основе старой писала. Как и Боб не знает про Алисин код). Ну и четвёртая - что у тебя получилось в итоге.

drBatty ★★
()
Ответ на: комментарий от Dendy

Ещё у меня в коде мешанина из букв нижнего/верхнего регистров, цифр, скобок, кавычек и прочих спецсимволов.

И я, и ты их можем различить на глаз, в отличие от табов/пробелов. Да, где-то можно настроить, чтобы были видны маленькие серенькие точки на месте табов и пробелов, чтобы хоть как-то их различать. Но это добавляет больше неудобств, чем преимуществ.

iVS ★★★★★
()
Ответ на: комментарий от vurdalak

Окей, пойду закопаю все си-подобные, питон и скорее всего лисп.

Да? А я вот только-что скомпиллил gcc программу из одной строчки на c в 490 байт, и никаких предупреждений, даже с -Wall (не считая того, что printf мне лень было описывать и хидер вставлять).

Т.ч. C можешь раскопать.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.