OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 17 Июль, 2019 01:21

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Нормализация вложенных if
СообщениеДобавлено: Четверг, 11 Февраль, 2010 18:08 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Выделено: viewtopic.php?p=42438#p42438

Лет пять назад работали у нас трое математиков, с тех пор остались подобные образцы строчек по триста каждый, с кучей return из как можно более глубоких if-ов. Все они на поверку оказались линейным поиском. Большую часть из них я за несколько лет уже успел переколбасить до канонической формы if-else-if.

То есть было как то так
Код:
void f (...)
{
  ...
    ...
    if
        ... return;


     if
      ... return;

                 ... return;
 
   ...........
             if
             опять где-то глубоко-глубоко - return;
   ...........

   .. так несколько сотен строк...
}

после нормализации стало так:
Код:
void f (...)
{
  if (...)
  {
     a(...);
  }
  else if (...)
  {
     b(...);
  }
  else if (...)
  {
     c(...);
  }
  else if (...)
  {
     d(...);
  }
  else if (...)
  {
     e(...);
  }
}

исключений пока не было: любой if-овый код с глубоко вложенными return нормализуется до канонического if-else-if.


Последний раз редактировалось Сергей Губанов Понедельник, 15 Февраль, 2010 11:45, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Нормализация вложенных if
СообщениеДобавлено: Суббота, 13 Февраль, 2010 10:39 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Сергей Губанов писал(а):
после нормализации стало так:
Код:
void f (...)
{
  if (...)
  {
     a(...);
  }
  else if (...)
  {
     b(...);
  }
  else if (...)
  {
     c(...);
  }
  else if (...)
  {
     d(...);
  }
  else if (...)
  {
     e(...);
  }
}


Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then Exit(c(...);
  if (…) then Exit(d(...);
  Result := e(...);

Даже блондинко не запутается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Февраль, 2010 10:58 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
ain писал(а):
Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then Exit(c(...);
  if (…) then Exit(d(...);
  Result := e(...);

Даже блондинко не запутается.

Такой код нарушает целостность моего восприятия. Я запутаюсь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Февраль, 2010 12:25 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
ain писал(а):
Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then Exit(c(...);
  if (…) then Exit(d(...);
  Result := e(...);

Даже блондинко не запутается.


Я хочу видеть причинно-следственные связи и соотношения на данных для них, а не последовательность команд. Важнейший шаг роста программиста - перестать думать о последовательности команд и перестать гонять их в уме, имитируя процессор.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Февраль, 2010 13:25 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
Илья Ермаков писал(а):
ain писал(а):
Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then Exit(c(...);
  if (…) then Exit(d(...);
  Result := e(...);

Даже блондинко не запутается.


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


Вот посмотрите на это. Когда я вижу if...elsif..elsif..., я знаю, что эта конструкция обспечивает выполнение только одного своего подблока, какого - определяется первой истинной охраной. И это знаю даже не я, а мои автоматические ассоциации при чтении. Если же мы даём подблокам право на нелокальные действия, то я вообще ничего не могу сказать о свойствах общего собранного блока, без влезания в подблоки. Понимаете - НИ-ЧЕ-ГО! Какая, нафиг, абстракция, какие уровни детализации тогда остаются? Остаётся одна склёпанная заплатками портянка.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Февраль, 2010 17:01 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Axcel писал(а):
ain писал(а):
Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then Exit(c(...);
  if (…) then Exit(d(...);
  Result := e(...);

Даже блондинко не запутается.

Такой код нарушает целостность моего восприятия. Я запутаюсь.

Может профессию поменять?
:D Шутка.
Я написал так, как я пишу в подобных случаях.
Вы, само собой, будете писать так, как вам удобнее.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Февраль, 2010 17:12 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Илья Ермаков писал(а):
ain писал(а):
Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then Exit(c(...);
  if (…) then Exit(d(...);
  Result := e(...);

Даже блондинко не запутается.


Я хочу видеть причинно-следственные связи и соотношения на данных для них, а не последовательность команд.

Я их вижу и потому так пишу.
Или вы полагаете, что так может написать только тот, кто этих связей не видит?
А как он тогда вообще хоть что-то напишет?
Никак не напишет.
Так же, не вижу никаких преимуществ для себя вот в таком варианте.
Код:
  if (…) then a(...)
  else
    if (…) then b(...)
    else
      if (…) then c(...)
      else
        if (…) then d(...)
        else
          If (...) then e(...);


Илья Ермаков писал(а):
Важнейший шаг роста программиста - перестать думать о последовательности команд и перестать гонять их в уме, имитируя процессор.

Ну, что вы, какой процессор. Меньше всего я о нём думаю.
Если честно, вообще не думаю.
Мои задачи не критичны по времени, потому, пусть себе пашет.

Илья Ермаков писал(а):
Конструировать каждый блок, собирая его из уже сделанных раньше надёжных подблоков. Собирая так, чтобы сразу получать нужные свойства (т.е. проекцией из рассуждений). Как - было уже на форуме и в статьях смежных достаточно показано примеров. Если уж лень того же Гриса почитать.

Да кто-же спорит.
Только откуда вы увидели ненадежность в моем примере?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 13 Февраль, 2010 18:28 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Ну, лично я вижу не то чтобы ненадежность, а не сообразность что-ли. Т.е. делаем процедуру, а что собственно мы там делаем-то, если тут же выскакиваем? А если это не в отдельной процедуре? А если нужно делать что-то еще кроме выхода? Ваша схемы не то чтобы рассыпается, но перестает быть простой, а классическая работает по-прежнему .


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 06:44 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Александр Ильин писал(а):
ain писал(а):
Только откуда вы увидели ненадежность в моем примере?
Мне кажется, тут речь идёт о потенциальной проблеме забытого Exit. Аналогичной проблемой страдает Сишный switch: забыли break - "провалитесь" в следующий блок.


Именно потому я пишу выравнивая всё и вся.
В моей конструкции что-то забытое бросится немедленно в глаза.
Код:
  if (…) then Exita(...);
  if (…) then Exitb(...);
  if (…) then Exitc(...);
  if (…) then Exitd(...);
  Result := e(...);
Против
Код:
  if (…) then Exit(a(...);
  if (…) then Exit(b(...);
  if (…) then c(...);
  if (…) then Exitd(...);
  Result := e(...);


В вашей, запросто можно было бы упустить некоторое условие.
Приворжу исходный код Губанова:
Код:
void f (...)
{
  if (...)
  {
     a(...);
  }
  else if (...)
  {
     b(...);
  }
  else if (...)
  {
     c(...);
  }
  else if (...)
  {
     d(...);
  }
  else if (...)
  {
     e(...);
  }
}
против
Код:
void f (...)
{
  if (...)
  {
     a(...);
  }
  else if (...)
  {
     b(...);
  }
  else if (...)
  {
     c(...);
  }
  else if (...)
  {
     e(...);
  }
}

Вот и ищите, что же было упущено!!!

Кстати, кто-нибудь заметил, что в вашей (оппонентов) конструкции будет выполнен 0 или 1 блок?
Т.е. вы уже сделали ошибку. :lol:

Позволил себе сделать выделения в вашем тексте.
Илья Ермаков писал(а):
Когда я вижу if...elsif..elsif..., я знаю, что эта конструкция обспечивает выполнение только одного своего подблока, какого - определяется первой истинной охраной. И это знаю даже не я, а мои автоматические ассоциации при чтении.

Вы забыли поставить последнее else.
:lol:
Вот и все ваши автоматические ассоциации при чтении.

Александр Ильин писал(а):
Илья Ермаков писал(а):
Да, вот внезапно чётко понял, с примером, что меня раздражает в досрочном выходе. Концептуально.
Илья, респект! Жму руку. : ) Сам тоже обожаю такие прозрения, когда они у меня бывают.

Веселые вы ребята!
А что, подмену задачи никто не заметил?
Принципиальную подмену.
Вы стали обсуждать не то, что я написал.
И ошибку?

Оно и понятно, в глубоком лесу этих if ...else... if... else так легко заплутать. :mrgreen:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 07:05 

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Axcel писал(а):
Ну, лично я вижу не то чтобы ненадежность, а не сообразность что-ли. Т.е. делаем процедуру, а что собственно мы там делаем-то, если тут же выскакиваем? А если это не в отдельной процедуре? А если нужно делать что-то еще кроме выхода? Ваша схемы не то чтобы рассыпается, но перестает быть простой, а классическая работает по-прежнему .

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

Для меня режим скульптора именно тем интересен, что позволяет в явном виде отсекать лишнее.
Что приводит к сокращению объема текста и его упрощению.
Что у меня лично приводит к более понятному и безопасному коду.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нормализация вложенных if
СообщениеДобавлено: Понедельник, 15 Февраль, 2010 09:07 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
ain писал(а):
А когда если, то будет по другому

Вот она фишка-то :!:

Нет такой постановки задачи, чтобы БЫЛО как-то.
В смысле, она настолько элементарна, что ее и обсуждать не стоит. Тем более, гориться умением "сделать по-другому"
Не гордимся же мы, что знаем таблицу умножения, в самом-то деле

Постановка задачи в том, чтобы: когда если, тогда осталось бы по-прежнему.
А кто не умеет, вон Илья говорит - с работы увольняет :lol:

Ну я так понимаю, что ему как менеджеру - нафиг не нужен героизм по преодолению препятствий, самими же и созданными...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Нормализация вложенных if
СообщениеДобавлено: Воскресенье, 09 Февраль, 2014 18:26 

Зарегистрирован: Суббота, 02 Май, 2009 22:33
Сообщения: 4
Откуда: С-Пб
Цитируется «некая китайская энциклопедия», в которой говорится, что «животные подразделяются на:
а) принадлежащих Императору,
б) бальзамированных,
в) прирученных,
г) молочных поросят,
д) сирен,
е) сказочных,
ж) бродячих собак,
з) включенных в настоящую классификацию,
и) буйствующих как в безумии,
к) неисчислимых,
л) нарисованных очень тонкой кисточкой из верблюжьей шерсти,
м) и прочих,
н) только что разбивших кувшин,
о) издалека кажущихся мухами».
http://www.tinlib.ru/kompyutery_i_internet/kompyuternaja_lingvistika_dlja_vseh_mify_algoritmy_jazyk/p6.php

Мне довелось ознакомится с вышеприведённой "китайской классификацией " в 90-е годы прошлого века по бумажной "методичке". Впечатлило. Вспомнилось лет 5 назад в процессе очередной попытки распределения "по папочкам" "нарытого" в интернете.
По Гуглу безчисленно ссылок на эту "китайскую энциклопедию". Просмотревши их несколько десятков, я убедился, что вышеприведённый опус играет роль либо весёлого прикола, либа в качестве серьёзного назидания "как нельзя" ("ненаучный метод клссификации"). Но тогда – лет 5 назад – меня одолела догадка (благо я не помнил весь текст), что сё не тупая ненаучность, но великая китайская мудрость ! Ибо:
а) если животное принадлежит Императору, то не ваше собачье дело его классифицировать, иначе ...
е) если это сказочное животное, то на них ведь не распространяются законы бродячих собак, иначе ...
н) если это животное [NB но оно ведь не принадлежит Имератору !] только что разбило кувшин, то к нему оправдано "особое отношение", иначе...

То есть, если рассматривать подобную классификацию не как одноуровневую, но как метод дихотомии (учитывающий очерёдность), то для целей классификации "нажитого непосильным трудом" подходит довольно неплохо:
a) информация актуальная по тому вопросу, который щас ищешь;
б) информация актуальная по текущему проекту;
в) то что когда-то искал, но не находил;
г) то, что может быть полезно для личных хобби;
д) не понял о чём, но статья/книга добротная;
е) фигня, но картинки классные;
ж) а вдруг пригодится.

Именно по такой схеме работает блок
Код:
if (…) then a(...)
  else
    if (…) then b(...)
    else
      if (…) then c(...)
      else
        if (…) then d(...)
        else
          If (...) then e(...);


Т.е. только такое форматирование отражет "порядкозависимость" (непереставимость) следования логических операторов. А если требуется классификация в "одном уровне", то такого рода метод выглядит нерациональным, ибо не использует [подразумеваемые] дезъюнктивные соотношения перебираемых логических выражений.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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


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

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


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

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