OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 09 Август, 2020 12:11

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




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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9271
Откуда: Россия, Орёл
Ну дык, фактически, таблица решений.

Но см. выше - у народа логикофобия ))


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

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


Была ветка с кокретными примерами и аргументацией:
viewtopic.php?f=27&t=1606&start=0

Давайте вы ее прочтете и туда же чего-нибудь напишите. Если посчитаете нужным :) Чтобы не повторяться. Хотя ветка себя исчерпала - все свелось к вере и субъективному пониманию "читабельности".


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

Зарегистрирован: Понедельник, 25 Февраль, 2008 08:42
Сообщения: 125
Сергей Губанов писал(а):
Return из середины процедуры, кстати, тоже всегда может (и должен) быть преобразован в цепочку ЕСЛИ-ИНАЧЕ-ЕСЛИ.

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


Когда у меня больше четырех строк такого кода рождается, я всегда переходу на такой:
Код:
function F(...)…;
begin
  …
  if (a(...)) then exit(…);
  if (c(...)) then exit(…);
  if (e(...)) then exit(…);
  if (g(...)) then exit(…);
  Result := …;
end;


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

Зарегистрирован: Суббота, 29 Март, 2008 19:27
Сообщения: 1047
Откуда: Россия, Чебоксары
ain писал(а):
Когда у меня больше четырех строк такого кода рождается, я всегда переходу на такой:
Как уже говорилось много раз, на Драконе такая конструкция выглядит естественно и не напряжно :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Сентябрь, 2009 17:36 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Немного разверну изначальный пример:
Код:
do
{
  if (условие1)
  {
    expr11;
    expr12;
    ...;
    expr1n;
    break;
  }
  if (условие2)
  {
    expr21;
    expr22;
    ...
    expr2n;
    break;
  }
  expr1;
  expr2;
  ...;
  exprn;
} while (false)


Видно что тут очень много лишнего. Какие-то ду, какие-то вайлы, ифов опять же пачка.
Посему предлагаю следующее рационализаторское предложение -- оставить ровно один if! do..while тоже не нужны, как не нужны и else всякие, ибо это явное излишество. Итак:
Код:
if ( (условие1 and (
         expr11,
         expr12,
         ...,
         expr1n,
         true ) )
     or
     (условие2 and (
        expr21,
        expr22,
        ...,
        expr2n
        true) )
     or
     (  expr1,
        expr2,
        ...,
        exprn
        true) );


Пример использования на практике (это чистый C++, без всяких препроцессоров и прочих извратов. программа приводится целиком):
Код:
#include <iostream>

using namespace std;

void foo(int a)
{
    if ( (0==a and (
             cout << "a=zero",
             cout << endl,
             true ) )
         or
         (1==a and (
            cout << "a=one",
            cout << endl,
            true) )
         or
         (2==a and (
            cout << "a=two",
            cout << endl,
            true) ) );
}

int main()
{
    foo(0);
    foo(1);
    foo(2);
    foo(3);
    foo(5);

    return 0;
}


Ну, думаю всякому очевидно что результат работы программы таков:
Код:
a=zero
a=one
a=two


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Убираю LOOP'ы
СообщениеДобавлено: Четверг, 15 Апрель, 2010 07:19 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Перенесено из: viewtopic.php?p=45981#p45981
Сергей Губанов писал(а):
А ещё бывает вот такая колбаса:
Код:
do
{
  if (a)
  {
     A
     break;
  }
  if (b)
  {
     B
     break;
  }
}
while (false);
Ява? Такое ощущение, что пытались симитировать оператор GOTO в языке, в котором его нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Убираю LOOP'ы
СообщениеДобавлено: Четверг, 15 Апрель, 2010 08:46 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Сергей Губанов писал(а):
А ещё бывает вот такая колбаса:
Код:
do
{
  if (a)
  {
     A
     break;
  }
  if (b)
  {
     B
     break;
  }
}
while (false);
Ява? Такое ощущение, что пытались симитировать оператор GOTO в языке, в котором его нет.

Думаю что C#. :-)
Не используется goto, видимо потому, что goto это табу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Убираю LOOP'ы
СообщениеДобавлено: Четверг, 15 Апрель, 2010 08:50 

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

Дак этта.. Было же уже: viewtopic.php?f=27&t=1731&start=0


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Убираю LOOP'ы
СообщениеДобавлено: Четверг, 15 Апрель, 2010 13:15 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
Такое ощущение, что пытались симитировать оператор GOTO в языке, в котором его нет.

Известный приём для php/c/c++ и т.д. Часто авторы именно рекомендуют так писать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 15 Апрель, 2010 17:16 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Если честно, я так и не понял причём тут "народные ополченцы" (вернее почему). Ну, да ладно. Можно не объяснять.


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

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


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

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


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

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