OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 16 Апрель, 2024 11:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Среда, 22 Июль, 2009 12:54 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Цикл выполняющийся 1 раз написанный только ради брэков:
Код:
do
{
  if (условие1)
  {
    ...
    break;
  }
  ...
  if (условие2)
  {
    ...
    break;
  }
  ...
} while (false)

Сегодня на работе увидел в нашем коде, волосы встали дыбом. Нашёл человека написавшего этого крокодила. Он откровенно не понимает, что в этом плохого.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 13:34 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Когда-то я писал такое же :) .. на Билдере

В одном месте использовался несколько раз подряд макрос который разворачивался в
if (какое-то усл.) goto label;

Кривая оптимизация делала код не работающим. Помогла компилятору замена goto на цикл и брейками...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 22 Июль, 2009 14:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Обнаружен источник заразы: «Совершенный код» Макконел.
Вложение:
mc.png
mc.png [ 79.77 КБ | Просмотров: 10284 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 10:23 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Вот так доверять авторитетам.
И на принципы Вирта нужно смотреть критически.
:)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 23 Июль, 2009 10:41 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Уж не пустомелю-ли Макконела Вы авторитом назвали?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 09:56 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Губанов писал(а):
Уж не пустомелю-ли Макконела Вы авторитом назвали?

Да. В сишной среде он - авторитет.
Жаль, я не видел этого примера раньше - воткнул бы некоторым своим ученикам о доверии к авторитетам. Я уже спорил с ними по некоторым местам макконелла, но такого даже предположить не мог!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 10:26 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
А конструктивная критика будет?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 10:36 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Использовать конструкцию цикла вместо if - это абсолютный игнор читабельности.
Понятно, что и микроскоп можно вместо молотка использовать...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 10:52 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Валерий Лаптев писал(а):
Использовать конструкцию цикла вместо if - это абсолютный игнор читабельности.
Понятно, что и микроскоп можно вместо молотка использовать...


Да, да, даже я (Vlad) говорю: пример крайне хреновой читабельности :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 11:19 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Это очень распространненый код "опытных" програмеров.
Начинающие пишут так:
Цитата:
while (true){
...
if (...) break;
...
if (...) break;
...
break;
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 11:42 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Я вообще не понимаю, зачем цикл использовать. А для последнего варианта в КП есть LOOP.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 14:17 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Т.е. проблема лишь в несколько худшей читабельности?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 14:24 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
LOOP здесь ни причем, но вложенные if народу не нравятся.
Из "той же оперы":
Код:
try{
    if (...) throw something;
    ...
    if (...) throw something;
    ...
}catch (something){
    ...
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 15:20 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
а не лучше ли выделить код в процедуру и делать при определенных условиях return?
я так иногда делаю и вроде все и наглядно, правда немного времени больше тратится на вызов и возврат (если компилятор не поддерживает inline процедуры)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 15:28 

Зарегистрирован: Понедельник, 19 Март, 2007 09:40
Сообщения: 142
Откуда: USA, Israel, Belarus
Ну и какая разница break с середины или return?

Деление на процедуры и вложенные if позволяют все это разрулить.
Но C-шники не любят делить на функции.
Вложенных функций нет.
Не вложенную (даже private) -- вроде как нужно объявить в h-файле.
После этого придется перекомпилировать "бог знает что".
Да еще и source control мешает.

Короче легче наколбасить "такое".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 18:37 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Если кто-то вдруг что-то не сразу правильно понял, то на всякий случай скажу это явно...
Приведённый в первом сообщении этой ветки код всегда может (и должен) быть приведён к следующей цепочке:
Код:
ЕСЛИ ... ТОГДА
  ...
ИНАЧЕСЛИ ... ТОГДА
  ...
  ...
  ...
ИНАЧЕСЛИ ... ТОГДА
  ...
ИНАЧЕ
  ...
КОНЕЦ


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 19:19 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
slava писал(а):
Ну и какая разница break с середины или return?


Большая. С return код будет нагляднее кучи if/else'ов.

slava писал(а):
Деление на процедуры и вложенные if позволяют все это разрулить.


Вложенные if обфусцируют код не хуже "таких" циклов. Plain is better than nested - см. дао питона :) Ах да, философия питона вам неинтересна, насколько я помню...

slava писал(а):
Но C-шники не любят делить на функции.


Я вас умоляю... :)

slava писал(а):
Вложенных функций нет.
Не вложенную (даже private) -- вроде как нужно объявить в h-файле.


Вы заблуждаетесь.


Последний раз редактировалось Vlad Пятница, 24 Июль, 2009 19:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 19:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
Если кто-то вдруг что-то не сразу правильно понял, то на всякий случай скажу это явно...
Приведённый в первом сообщении этой ветки код всегда может (и должен) быть приведён к следующей цепочке:


Может, но не должен :) Давайте возродим ветку про return из середины :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 19:44 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Просто у народа логико-фобия. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Июль, 2009 21:44 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Return из середины процедуры, кстати, тоже всегда может (и должен) быть преобразован в цепочку ЕСЛИ-ИНАЧЕ-ЕСЛИ.

Сегодня на работе отрефакторил две процедуры говнокода (каждая была по несколько сотен строк и насыщенна под завязку return-ами из середины). Теперь каждая из этих процедур выглядит навроде следующего:
Код:
void F (...)
{
  ...
  if (a(...))
  {
    b(...);
  }
  else if (c(...))
  {
    d(...);
  }
  else if (e(...))
  {
    f(...);
  }
  else if (g(...))
  {
    h(...);
  }
}
Обратите внимание, что никаких вложенных if-ов здесь нету.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB