Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:
if (a == b) {
... }
Но это же чертовски неудобно, да еще когда повсюду разные "какашки", извините,
вроде doxygen-овских комментариев. По-моему, такое форматирование затрудняет восприятие кода.
Да что там "затрудняет" — вообще делает этот процесс кошмарным !
Почему-то встречаю такой код постоянно, в разработках самого разного уровня и объема.
Приведу реальный пример.
case EXTRA:
if (state->flags & 0x0400) {
copy = state->length;
if (copy > have) copy = have;
if (copy) {
if (state->head != Z_NULL &&
state->head->extra != Z_NULL) {
len = state->head->extra_len - state->length;
zmemcpy(state->head->extra + len, next,
len + copy > state->head->extra_max ?
state->head->extra_max - len : copy);
}
if (state->flags & 0x0200)
state->check = crc32(state->check, next, copy);
have -= copy;
next += copy;
state->length -= copy;
}
if (state->length) goto inf_leave;
}
state->length = 0;
state->mode = NAME;
Ужасно ! Тут же черт ногу сломит ! При виде закрывающей фигурной скобки хочется сразу отыскать ее
"старшую сестру", чтобы мысленно обозначить выделенный ими кусок кода, а для этого приходится бегать
глазами и выискивать конструкции типа if и while. А была бы она на том же горизонтальном уровне —
все было бы гораздо проще. Если кому-то показалось, что я утрирую — что ж, может быть.
А вам когда-нибудь приходилось по долгу службы разбираться в такой вот каше ?
Лично у меня уже после 20-30К строк от постоянных метаний уже реально болят глаза.
Этот код при просмотре хочется выкинуть и переписать заново, на большом белом листе, с "кислородом",
где логические и вложенные блоки были бы явно обозначены. Хотя бы так:
case EXTRA:
if (state->flags & 0x0400)
{
copy = state->length;
if (copy > have)
{
copy = have;
}
if (copy)
{
if (state->head != Z_NULL && state->head->extra != Z_NULL)
{
len = state->head->extra_len - state->length;
zmemcpy(state->head->extra + len, next,
len + copy > state->head->extra_max ?
state->head->extra_max - len : copy);
}
if (state->flags & 0x0200)
{
state->check = crc32(state->check, next, copy);
}
have -= copy;
next += copy;
state->length -= copy;
}
if (state->length) goto inf_leave;
}
state->length = 0;
state->mode = NAME;
Ну неужели я не прав, и первый вариант читается лучше ?
Или это какой-то всеобщий заговор, или code convention, которому следуют, не задумываясь ?
Здравствуйте, okman, Вы писали:
O>Ну неужели я не прав, и первый вариант читается лучше ? O>Или это какой-то всеобщий заговор, или code convention, которому следуют, не задумываясь ?
Обычно пишут так, как решил главный в проекте. Мне не нравится вариант с отступами перед скобками, кому-то не нравятся скобки на отдельных строчках, а пишем все равно в команде, и тут одинаковый стиль помогает.
Если так интересно — можете откопать холивар на эту тему (а может и не один), в этом же разделе.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, okman, Вы писали:
O>Ну неужели я не прав, и первый вариант читается лучше ?
Не прав. И, что самое смешное, аргументы я приведу те же самые:
O>Ужасно ! Тут же черт ногу сломит ! При виде закрывающей фигурной скобки хочется сразу отыскать ее O>"старшую сестру", чтобы мысленно обозначить выделенный ими кусок кода, а для этого приходится бегать O>глазами и выискивать конструкции типа if и while. А была бы она на том же горизонтальном уровне - O>все было бы гораздо проще. Если кому-то показалось, что я утрирую — что ж, может быть. O>А вам когда-нибудь приходилось по долгу службы разбираться в такой вот каше ? O>Лично у меня уже после 20-30К строк от постоянных метаний уже реально болят глаза. O>Этот код при просмотре хочется выкинуть и переписать заново, на большом белом листе, с "кислородом", O>где логические и вложенные блоки были бы явно обозначены. Хотя бы так:
Здравствуйте, okman, Вы писали: O>Приведу реальный пример.
Прогнал через автоформатирование и StyleCop.
На выходе
case EXTRA:
if (state->flags & 0x0400)
{
copy = state->length;
if (copy > have)
{
copy = have;
}
if (copy)
{
if (state->head != Z_NULL
&& state->head->extra != Z_NULL)
{
len = state->head->extra_len - state->length;
zmemcpy(
state->head->extra + len,
next,
(len + copy) > state->head->extra_max ?
state->head->extra_max - len :
copy);
}
if (state->flags & 0x0200)
{
state->check = crc32(state->check, next, copy);
}
have -= copy;
next += copy;
state->length -= copy;
}
if (state->length)
{
goto inf_leave;
}
}
state->length = 0;
state->mode = NAME;
Холиварить тут не о чем, у каждой команды свой стиль, никого не переубедишь.
Я бы постарался избавиться от goto, растащить часть кода по мелким методам и не так активно изменять state. Но это совсем не значит, что я правее вас
Здравствуйте, okman, Вы писали:
O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:
O>
O>if (a == b) {
O> ... }
O>
ага, за такое оформление я бы тоже руки отрывал стиль K&R, кстати, рулит, хотя я сам раньше очень защищал стиль Олмана. ничего, переучился. и даю слово, исходный код своего проекта с кучей Java/JS/CSS стало читать намного проще + действительно, экономия места + более компактный листинг
O>А была бы она на том же горизонтальном уровне - O>все было бы гораздо проще.
а я теперь не так по скобках определяю это, а скорее — по содержанию и его же отступах у меня всё
Здравствуйте, okman, Вы писали:
O>Приветствую всех !
O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:
O>
O>if (a == b) {
O> ... }
O>
O>Ну неужели я не прав, и первый вариант читается лучше ? O>Или это какой-то всеобщий заговор, или code convention, которому следуют, не задумываясь ?
Сколько людей, столько и мнений. Я привык к такому стилю. И так как он рекомендован Sun, то много кода на Java написано именно так. Но для C++ такой стиль меньше подходит из-за некоторых отличий в синтаксисе.
Лично я не люблю стиль вида
if (a == b)
{
...
}
Мне он кажется слишком разреженным. Получается принудительная пустая строка, а иногда это мешает.
Здравствуйте, telek1024, Вы писали: T>Лично я не люблю стиль вида T>Мне он кажется слишком разреженным. Получается принудительная пустая строка, а иногда это мешает.
А это зависит от стиля в целом. Я стараюсь разносить код по мелким методам — сильно помогает понять намерения писавшего код. В результате основной код выходит крайне лаконичным, но перенасыщенным Так что отступы, наоборот, помогают.
Чтоб понятней было, что имею в виду:
Скрытый текст
private static PathToken ParseToken(PathTokenInfo parsingToken)
{
PathToken result;
if (IsCurrentDirectoryToken(parsingToken))
{
result = CurrentDirectoryToken.Instance;
}
else if (IsParentDirectoryToken(parsingToken))
{
result = ParentDirectoryToken.Instance;
}
else
{
string tokenName = GetNormalizedTokenName(parsingToken);
if (parsingToken.SeparatorCount == 0)
{
result = new FileToken(tokenName);
}
else
{
result = new DirectoryToken(tokenName);
}
}
return result;
}
Я конечно могу сэкономить пару проверок, развернув код обратно в простыню на пару сотен строк, но как по мне — оно того не стоит.
Здравствуйте, okman, Вы писали:
O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:
O>
O>if (a == b) {
O> ... }
O>
O>Но это же чертовски неудобно
Да, кошмарный стиль.
Но у меня есть один проект где такой стиль принят изначально (до того как наша команда туда подключилась) и приходится писать в таком вот говностиле.
Без ассиста с подсветкой парных скобок и сворачивалки в режиме outline statements жить просто нельзя.
Здравствуйте, Ops, Вы писали:
Ops>Обычно пишут так, как решил главный в проекте. Мне не нравится вариант с отступами перед скобками, кому-то не нравятся скобки на отдельных строчках, а пишем все равно в команде, и тут одинаковый стиль помогает. Ops>Если так интересно — можете откопать холивар на эту тему (а может и не один), в этом же разделе.
Несмотря на то, что тема создана в разделе "КСВ", холивар я уж точно не собирался разводить.
Просто интересно — чем можно оправдать такую расстановку скобок, кроме того, что их
рекомендуют в Sun и ею пользуются разные авторитеты. Есть ли польза от нее, кроме компактности ?
Как по мне — так только вред.
К примеру, я могу обосновать почти каждый элемент своего стиля.
Например, даже самые маленькие вложенные конструкции я заключаю в фигурные скобки и переношу на
новую строку — так легче следить за выполнением кода под отладчиком и это спасает от всяких
возможных недоразумений, которые могут произойти после рефакторинга. Вообще, стараюсь вытягивать код
по вертикали, потому что так глаза при его просмотре двигаются только в одном направлении, а не
дергаются еще влево-вправо, то есть в итоге меньше устают. Про сами скобки уже было сказано — такая
расстановка позволяет более рельефно обозначить границы вложенного блока, на мой взгляд.
А хотя бы одного довода в пользу Sun-овской рекомендации (я буду так ее называть) я не услышал.
Кроме экономии пространства. Ну и кому нужна такая экономия ? Компилятору ?
Здравствуйте, Sinix, Вы писали:
S>Холиварить тут не о чем, у каждой команды свой стиль, никого не переубедишь. S>Я бы постарался избавиться от goto, растащить часть кода по мелким методам и не так активно изменять state. Но это совсем не значит, что я правее вас
Здравствуйте, okman, Вы писали:
O>Здравствуйте, minorlogic, Вы писали:
M>>Оба варианта страшные.
O>А Вы напишите не страшно. Нет, серъезно, без шуток. Просто любопытно.
Здравствуйте, CreatorCray, Вы писали: CC>[нудным голосом] Отступы маленькие, некошерные; разбивка на строки слишком частая.
да пжалста
private static PathToken ParseToken(PathTokenInfo parsingToken) {
PathToken result;
if (IsCurrentDirectoryToken(parsingToken))
result = CurrentDirectoryToken.Instance;
else if (IsParentDirectoryToken(parsingToken))
result = ParentDirectoryToken.Instance;
else {
string tokenName = GetNormalizedTokenName(parsingToken);
if (parsingToken.SeparatorCount == 0)
result = new FileToken(tokenName);
else
result = new DirectoryToken(tokenName);
}
return result;
}