Re[2]: do { ... } while(false);
От: Qbit86 Кипр
Дата: 18.09.14 12:26
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>
N>            do {    // pseudo-cycle to destruct tempRasters BEFORE doc-switching & CloseDocument()
N>                KompasIteratorHolder tempApprox(CreateIterator(ALL_OBJ, 0));    // GetViewReference(0)));
N>                if(!tempApprox) break;
N>                elem = MoveIterator(tempApprox, 'F');
N>            } while (0);
N>


N>вот это что за цикл на одно действие?


Стандартная императивная конструкция, предоставляет блок (scope), из которого можно выйти по break. Также широко используется в препроцессорных дефайнах, если нужен блок, но { ... } использовать нежелательно.
Глаза у меня добрые, но рубашка — смирительная!
Re: Оцените качество кода на С++
От: Константин Россия  
Дата: 18.09.14 12:39
Оценка: +2 -1
Здравствуйте, GhostCoders, Вы писали:

GC>Данный код был написан моим сотрудником. Мне этот код не нравится, но он мне отвечает что я субъективен и его код неплох.


GC>
GC>    KompasObjectHolder(KompasObjectHolder& prev_holder) : m_reference(prev_holder.m_reference) { prev_holder.m_reference = 0; }
GC>    KompasObjectHolder& operator =(KompasObjectHolder& prev_holder) {
GC>        if (!m_reference) m_reference = prev_holder.m_reference, prev_holder.m_reference = 0; return *this; }
GC>


Если компилятор поддерживает C++11, то такое писать просто непростительно. Для старых компилятор код тоже "с душком".
Re[3]: do { ... } while(false);
От: -n1l-  
Дата: 18.09.14 12:41
Оценка:
Здравствуйте, Qbit86, Вы писали:
Q>Стандартная императивная конструкция, предоставляет блок (scope), из которого можно выйти по break. Также широко используется в препроцессорных дефайнах, если нужен блок, но { ... } использовать нежелательно.

Ну конкретно тут в чем плюс его использования?
Понимаю если бы там макросы были, а так...
Re[3]: do { ... } while(false);
От: Zhendos  
Дата: 18.09.14 12:44
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, -n1l-, Вы писали:


N>>
N>>            do {    // pseudo-cycle to destruct tempRasters BEFORE doc-switching & CloseDocument()
N>>                KompasIteratorHolder tempApprox(CreateIterator(ALL_OBJ, 0));    // GetViewReference(0)));
N>>                if(!tempApprox) break;
N>>                elem = MoveIterator(tempApprox, 'F');
N>>            } while (0);
N>>


N>>вот это что за цикл на одно действие?


Q>Стандартная императивная конструкция, предоставляет блок (scope), из которого можно выйти по break. Также широко используется в препроцессорных дефайнах, если нужен блок, но { ... } использовать нежелательно.


Но разве нельзя было написать так?
    {
        KompasIteratorHolder tempApprox(CreateIterator(ALL_OBJ, 0));
        if(tempApprox)
             elem = MoveIterator(tempApprox, 'F');
     }


Разве не намного проще?

И насчет стандартности я бы поспорил, да трюк do {} while (false) для макросов
это стандартная идиома,
но вот блок для которого можно выйти по "break",
редко встречающаяся.
Re[3]: Оцените качество кода на С++
От: -n1l-  
Дата: 18.09.14 12:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, -n1l-, Вы писали:


N>>
N>>            do {    // pseudo-cycle to destruct tempRasters BEFORE doc-switching & CloseDocument()
N>>                KompasIteratorHolder tempApprox(CreateIterator(ALL_OBJ, 0));    // GetViewReference(0)));
N>>                if(!tempApprox) break;
N>>                elem = MoveIterator(tempApprox, 'F');
N>>            } while (0);
N>>

N>>вот это что за цикл на одно действие?

К>Это прикольнейшая идиома. Это не цикл, а goto end. В роли goto используется break.


И типа if тут никак? Чем это хуже?


KompasIteratorHolder tempApprox(CreateIterator(ALL_OBJ, 0));
if(tempApprox){
 elem = MoveIterator(tempApprox, 'F');
}
Отредактировано 18.09.2014 12:46 -n1l- . Предыдущая версия .
Re[4]: do { ... } while(false);
От: Qbit86 Кипр
Дата: 18.09.14 12:52
Оценка: +1
Здравствуйте, Zhendos, Вы писали:

Z>Разве не намного проще?


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

Z>но вот блок для которого можно выйти по "break",

Z>редко встречающаяся.

Иногда встречается в длинных многошаговых инициализациях, где по break осуществляется фоллбэк, аналог goto-перехода к метке error.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: Оцените качество кода на С++
От: Кодт Россия  
Дата: 18.09.14 13:27
Оценка:
Здравствуйте, -n1l-, Вы писали:

К>>Это прикольнейшая идиома. Это не цикл, а goto end. В роли goto используется break.

N>И типа if тут никак? Чем это хуже?

Там эта идиома неоднократно встречается
do {
  init_x();
  if(x_is_bad) break;

  init_y();
  if(y_is_bad) break;

  init_z();
  if(z_is_dead) break;

  xyz();

} while(false);
cleanup_xyz();
Перекуём баги на фичи!
Re[4]: do { ... } while(false);
От: Andrew.W Worobow https://github.com/Worobow
Дата: 18.09.14 13:48
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Ну конкретно тут в чем плюс его использования?


Вообще по правильному ( в теории, но не на практике ) вместо такого while(1) {;;; break;} или do {}while(0); надо делать функцию в которой уже выходить на end просто по return.
Но на практике особенно там где код не оптимизируют ( ядро например ) но производительность требуется используют такой вот метод.

while (1){
   HANDLE h = open();
   if ( !h )
      break;
   while (1){
      s=write(h,"{");
      if ( !s )
         break;
      
      write(h,"abc,def,uuu");

      write(h,"}");
      break;
   }
   close(h); 
   break;
}


то есть это по уму, по идеализму надо заменять на функцию даже если она один раз вывывается, но еще не понятно что яснее — функция которая написана только для того чтобы брековаться по return вместо goto.

То есть есть такие операции которые требуют "операций скобок" — открыл -> надо закрыть, записал начало "{" надо записть и конец "}". И так делее.

В этом случае в конце кода действий возникает логика — а открыли мы или нет, и если открыли надо закрыть. И так далее.

Но если применять логику иную — типа создавать объект у которого есть свойсто "открыть" и есть констуктор и есть деструктор то тогда такая логика с проверкой а мы открыли или нет в том же деструкторе выглядит логично. Но если это просто небольшой код, и нет нужды городить обьекты и классы, ну как я уже сказал в ядре например. Где эфективность важнее красоты, а оптимизации от компилятора нет, то пишут вот так — ну не очень красиво, но по привыкнешь — нормально.


N>Понимаю если бы там макросы были, а так...
Не все кто уехал, предал Россию.
Отредактировано 18.09.2014 13:54 Andrew.W Worobow . Предыдущая версия .
Re[5]: Оцените качество кода на С++
От: -n1l-  
Дата: 18.09.14 13:55
Оценка:
Здравствуйте, Кодт, Вы писали:
Воу воу воу, сама то идиома причем? Ваш пример еще куда ни шло, но там неуместно, имхо.
Re[5]: do { ... } while(false);
От: -n1l-  
Дата: 18.09.14 13:56
Оценка: +1
Да я знаю о том, что еще и циклы можно размотать, но, не везде же их разматывать.
Ну серьезно. Ну не нужен там этот код.
Re[6]: Оцените качество кода на С++
От: uzhas Ниоткуда  
Дата: 18.09.14 14:15
Оценка: +3
Здравствуйте, -n1l-, Вы писали:

N>Воу воу воу, сама то идиома причем? Ваш пример еще куда ни шло, но там неуместно, имхо.


никуда не шло
эта "идиома" в плюсовом коде не нужна. в старом добром Си — на здоровье
Re[7]: Оцените качество кода на С++
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.09.14 14:31
Оценка:
Здравствуйте, uzhas, Вы писали:

U>эта "идиома" в плюсовом коде не нужна. в старом добром Си — на здоровье

Предложи наглядное решение на С++. Мне вот интересно.
Sic luceat lux!
Re[5]: Оцените качество кода на С++
От: PM  
Дата: 18.09.14 14:34
Оценка: +3
Здравствуйте, Кодт, Вы писали:

К>>>Это прикольнейшая идиома. Это не цикл, а goto end. В роли goto используется break.

N>>И типа if тут никак? Чем это хуже?

По-моему этой идиоме место только в коде на C и только для идеологических противников goto cleanup
Re[8]: Оцените качество кода на С++
От: Zhendos  
Дата: 18.09.14 14:39
Оценка:
Здравствуйте, Kernan, Вы писали:

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


U>>эта "идиома" в плюсовом коде не нужна. в старом добром Си — на здоровье



  init_x();
  if(x_is_bad) break;

  init_y();
  if(y_is_bad) break;

  init_z();
  if(z_is_dead) break;

  xyz();

} while(false);
cleanup_xyz();


K>Предложи наглядное решение на С++. Мне вот интересно.


X x;
Y y;
Z z;
xyz();
Re[6]: Оцените качество кода на С++
От: Кодт Россия  
Дата: 18.09.14 14:42
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Воу воу воу, сама то идиома причем? Ваш пример еще куда ни шло, но там неуместно, имхо.


Я указал на то, что человек её не единожды использовал. В конкретно том месте это была дань единообразию, я так думаю
Перекуём баги на фичи!
Re[9]: Оцените качество кода на С++
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.09.14 14:50
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>
Z>X x;
Z>Y y;
Z>Z z;
Z>xyz();
Z>

try-catch забыл. Я не особо смотрел на код, но вроде после do-while было что-то ещё.
Sic luceat lux!
Re: Оцените качество кода на С++
От: _Dreamer Россия  
Дата: 18.09.14 14:50
Оценка: +3
Здравствуйте, GhostCoders, Вы писали:

GC>Данный код был написан моим сотрудником. Мне этот код не нравится, но он мне отвечает что я субъективен и его код неплох.


Вы еще попробуйте код показать на http://codereview.stackexchange.com/
Я думаю, там будет устроен разнос.
На мой взгляд, код ужасен.
Чтобы не быть субъективным, нужно принять стандарт оформления кода и встроить линтер на прекоммит.
Тогда никто не сможет писать в одном месте "m_", "_" или просто "someMemberName".
Принять решение о написании тестов. Тогда никто не будет писать таких огромных классов.
Использовать VCS, их куча на выбор, тогда не будет никаких закомментированных участков кода.
Организовать код-ревью если не каждого коммита в master, то хотя бы важных фич.
Тогда Вы сможете аргументировать.

Я понимаю, что это может показаться сложным и довольно дорогим в смысле времени и денег.
Но представьте, сколько Вы готовы потратить на содержание сотрудников, которые пишут ужасный код, но разбираются в нем, и поэтому их не уволить?
На отладке, потому что нет тестов и все проверяется вручную?
На поддержке, потому что нужно по пеплу орла и кофейной гуще гадать что сломалось у клиента?
Re[10]: Оцените качество кода на С++
От: PM  
Дата: 18.09.14 14:54
Оценка:
Здравствуйте, Kernan, Вы писали:

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


Z>>
Z>>X x;
Z>>Y y;
Z>>Z z;
Z>>xyz();
Z>>

K>try-catch забыл. Я не особо смотрел на код, но вроде после do-while было что-то ещё.

try-catch здесь не нужен, т.к. в С++ коде X, Y, Z должны использовать идиому RAII
Re[10]: Оцените качество кода на С++
От: Zhendos  
Дата: 18.09.14 14:58
Оценка: +2
Здравствуйте, Kernan, Вы писали:

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


Z>>
Z>>X x;
Z>>Y y;
Z>>Z z;
Z>>xyz();
Z>>

K>try-catch забыл. Я не особо смотрел на код, но вроде после do-while было что-то ещё.

не забыл, а не поставил.
т.к. что и куда нужно возвращать из контекста не ясно,
то просто не ловим исключения, пусть они идут наверх
Re[7]: Оцените качество кода на С++
От: -n1l-  
Дата: 18.09.14 15:17
Оценка:
В принципе я тоже так считаю, для макросов норм, но так не очень.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.