Всеобщий заговор в отношении скобок...
От: okman Беларусь https://searchinform.ru/
Дата: 27.11.10 13:57
Оценка: 15 (8) +24 -15 :))) :))) :))) :))
Приветствую всех !

Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:

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, которому следуют, не задумываясь ?
Re: Всеобщий заговор в отношении скобок...
От: Ops Россия  
Дата: 27.11.10 14:09
Оценка:
Здравствуйте, okman, Вы писали:

O>Ну неужели я не прав, и первый вариант читается лучше ?

O>Или это какой-то всеобщий заговор, или code convention, которому следуют, не задумываясь ?

Обычно пишут так, как решил главный в проекте. Мне не нравится вариант с отступами перед скобками, кому-то не нравятся скобки на отдельных строчках, а пишем все равно в команде, и тут одинаковый стиль помогает.
Если так интересно — можете откопать холивар на эту тему (а может и не один), в этом же разделе.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Всеобщий заговор в отношении скобок...
От: dilmah США  
Дата: 27.11.10 14:13
Оценка: 1 (1) +2
O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:

O>
O>if (a == b) {
O>  ... }
O>



вообще-то ты привел пример другого стиля:


if (a == b) {
  ...
}



O> или code convention, которому следуют, не задумываясь ?


еще K&R использовали такой стиль
Re: Всеобщий заговор в отношении скобок...
От: iHateLogins  
Дата: 27.11.10 14:17
Оценка:
Прав.
Re: Всеобщий заговор в отношении скобок...
От: _Ursus_  
Дата: 27.11.10 14:25
Оценка: 1 (1) +2
Здравствуйте, okman, Вы писали:

O>Ну неужели я не прав, и первый вариант читается лучше ?


Не прав. И, что самое смешное, аргументы я приведу те же самые:

O>Ужасно ! Тут же черт ногу сломит ! При виде закрывающей фигурной скобки хочется сразу отыскать ее

O>"старшую сестру", чтобы мысленно обозначить выделенный ими кусок кода, а для этого приходится бегать
O>глазами и выискивать конструкции типа if и while. А была бы она на том же горизонтальном уровне -
O>все было бы гораздо проще. Если кому-то показалось, что я утрирую — что ж, может быть.
O>А вам когда-нибудь приходилось по долгу службы разбираться в такой вот каше ?
O>Лично у меня уже после 20-30К строк от постоянных метаний уже реально болят глаза.
O>Этот код при просмотре хочется выкинуть и переписать заново, на большом белом листе, с "кислородом",
O>где логические и вложенные блоки были бы явно обозначены. Хотя бы так:

Re: Всеобщий заговор в отношении скобок...
От: hattab  
Дата: 27.11.10 14:35
Оценка: 8 (4) :))) :)
Здравствуйте, okman, Вы писали:

Ты прав. Айда к нам. У нас вместо этих скобок пишут православные
Begin End
Есть за что глазу зацепиться
avalon 1.0rc3 rev 368, zlib 1.2.3
Re: Всеобщий заговор в отношении скобок...
От: Sinix  
Дата: 27.11.10 15:04
Оценка:
Здравствуйте, 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. Но это совсем не значит, что я правее вас
Re: Всеобщий заговор в отношении скобок...
От: Цыба Украина  
Дата: 27.11.10 15:47
Оценка:
Здравствуйте, okman, Вы писали:

O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:


O>
O>if (a == b) {
O>  ... }
O>


ага, за такое оформление я бы тоже руки отрывал стиль K&R, кстати, рулит, хотя я сам раньше очень защищал стиль Олмана. ничего, переучился. и даю слово, исходный код своего проекта с кучей Java/JS/CSS стало читать намного проще + действительно, экономия места + более компактный листинг

O>А была бы она на том же горизонтальном уровне -

O>все было бы гораздо проще.

а я теперь не так по скобках определяю это, а скорее — по содержанию и его же отступах у меня всё
Re: Всеобщий заговор в отношении скобок...
От: telek1024  
Дата: 27.11.10 17:09
Оценка:
Здравствуйте, okman, Вы писали:

O>Приветствую всех !


O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:


O>
O>if (a == b) {
O>  ... }
O>



O>Ну неужели я не прав, и первый вариант читается лучше ?

O>Или это какой-то всеобщий заговор, или code convention, которому следуют, не задумываясь ?

Сколько людей, столько и мнений. Я привык к такому стилю. И так как он рекомендован Sun, то много кода на Java написано именно так. Но для C++ такой стиль меньше подходит из-за некоторых отличий в синтаксисе.

Лично я не люблю стиль вида
if (a == b)
{
  ...
}


Мне он кажется слишком разреженным. Получается принудительная пустая строка, а иногда это мешает.
Re: Всеобщий заговор в отношении скобок...
От: minorlogic Украина  
Дата: 27.11.10 17:26
Оценка: 1 (1) +8
Оба варианта страшные.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Всеобщий заговор в отношении скобок...
От: Sinix  
Дата: 27.11.10 17:28
Оценка: 3 (3)
Здравствуйте, 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;
    }

Я конечно могу сэкономить пару проверок, развернув код обратно в простыню на пару сотен строк, но как по мне — оно того не стоит.
Re: Всеобщий заговор в отношении скобок...
От: CreatorCray  
Дата: 27.11.10 17:40
Оценка: 2 (2) +2
Здравствуйте, okman, Вы писали:

O>Постоянно вижу код, в котором фигурные скобки расставляются в таком стиле:


O>
O>if (a == b) {
O>  ... }
O>


O>Но это же чертовски неудобно

Да, кошмарный стиль.
Но у меня есть один проект где такой стиль принят изначально (до того как наша команда туда подключилась) и приходится писать в таком вот говностиле.
Без ассиста с подсветкой парных скобок и сворачивалки в режиме outline statements жить просто нельзя.

Мне больше нравится так:
O>
O>case EXTRA:
O>    if (state->flags & 0x0400)
O>    {
O>        copy = state->length;
                
O>        if (copy > have)
O>            copy = have;
                    
O>        if (copy)
O>        {
O>            if (state->head != Z_NULL && state->head->extra != Z_NULL)
O>            {
O>               len = state->head->extra_len - state->length;
O>               zmemcpy(state->head->extra + len, next, (len + copy > state->head->extra_max) ? state->head->extra_max - len : copy);
O>            }
                        
O>            if (state->flags & 0x0200)
O>               state->check = crc32(state->check, next, copy);
                        
O>            have -= copy;
O>            next += copy;
O>            state->length -= copy;
O>        }
                    
O>        if (state->length) 
O>                        goto inf_leave;
O>    }
                
O>    state->length = 0;
O>    state->mode = NAME;
O>
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Всеобщий заговор в отношении скобок...
От: CreatorCray  
Дата: 27.11.10 17:40
Оценка: +5 :)
Здравствуйте, hattab, Вы писали:

H>Ты прав. Айда к нам. У нас вместо этих скобок пишут православные
Begin End
Есть за что глазу зацепиться

Ну, я к примеру паскаль освоил раньше чем С, и помню с каким облегчением избавился от опостылевших begin end.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Всеобщий заговор в отношении скобок...
От: CreatorCray  
Дата: 27.11.10 17:40
Оценка: :))
Здравствуйте, Sinix, Вы писали:

[нудным голосом] Отступы маленькие, некошерные; разбивка на строки слишком частая.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: Всеобщий заговор в отношении скобок...
От: okman Беларусь https://searchinform.ru/
Дата: 27.11.10 17:43
Оценка: 2 (1) +1
Здравствуйте, Ops, Вы писали:

Ops>Обычно пишут так, как решил главный в проекте. Мне не нравится вариант с отступами перед скобками, кому-то не нравятся скобки на отдельных строчках, а пишем все равно в команде, и тут одинаковый стиль помогает.

Ops>Если так интересно — можете откопать холивар на эту тему (а может и не один), в этом же разделе.

Несмотря на то, что тема создана в разделе "КСВ", холивар я уж точно не собирался разводить.
Просто интересно — чем можно оправдать такую расстановку скобок, кроме того, что их
рекомендуют в Sun и ею пользуются разные авторитеты. Есть ли польза от нее, кроме компактности ?
Как по мне — так только вред.

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

А хотя бы одного довода в пользу Sun-овской рекомендации (я буду так ее называть) я не услышал.
Кроме экономии пространства. Ну и кому нужна такая экономия ? Компилятору ?
Re[2]: Всеобщий заговор в отношении скобок...
От: okman Беларусь https://searchinform.ru/
Дата: 27.11.10 17:45
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Холиварить тут не о чем, у каждой команды свой стиль, никого не переубедишь.

S>Я бы постарался избавиться от goto, растащить часть кода по мелким методам и не так активно изменять state. Но это совсем не значит, что я правее вас

Код не мой. Я бы вообще по-другому писал.
Re[2]: Всеобщий заговор в отношении скобок...
От: okman Беларусь https://searchinform.ru/
Дата: 27.11.10 17:46
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Оба варианта страшные.


А Вы напишите не страшно. Нет, серъезно, без шуток. Просто любопытно.
Re[3]: Всеобщий заговор в отношении скобок...
От: minorlogic Украина  
Дата: 27.11.10 17:48
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, minorlogic, Вы писали:


M>>Оба варианта страшные.


O>А Вы напишите не страшно. Нет, серъезно, без шуток. Просто любопытно.


Sinix дал выше оформление получше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Всеобщий заговор в отношении скобок...
От: Antikrot  
Дата: 27.11.10 17:58
Оценка: 1 (1) +11
Здравствуйте, okman, Вы писали:

O>К примеру, я могу обосновать почти каждый элемент своего стиля.

объясни сдвиг скобки:
    if (state->flags & 0x0400)
        {


PS. а раз мы всё же в КСВ, я бы за такой сдвиг расстреливал
Re[3]: Всеобщий заговор в отношении скобок...
От: Sinix  
Дата: 27.11.10 18:05
Оценка: +1
Здравствуйте, 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;
        }

И как, легче читается?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.