Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.20;
Скачать: CL | DM;

Вниз

оператор goto   Найти похожие ветки 

 
Unknown555   (2011-07-19 11:52) [0]

кто-нибудь использует в своем коде оператор goto. почему пишут, что его не рекомендуется использовать. например мне нужно проверить существование поля в одной из таблиц базы данных и получить значение этого поля. вот 2 варианта (с goto и без).


Field := FindFieldInGroupXTable(FieldName, GroupIdField.AsInteger);
 if Field <> nil then
   FieldValue := Field.AsString
 else
 begin
   Field := FindFieldInGroupsXTable(FieldName, GROUP_0);
   if Field <> nil then
     FieldValue := Field.AsString
   else
   begin
     Field := FindFieldInGroupXTable(FieldName, GROUP_16384);
     if Field <> nil then
       FieldValue := Field.AsString
     else
     begin
       Field := FindFieldInCustomFieldsTable(FieldName);
       if Field <> nil then
         FieldValue := Field.AsString
       else
       begin
         Field := FindFieldInArrayFieldsTable(FieldName);
         if Field <> nil then
           FieldValue := F.AsString
         else
           raise Exeption.CreateResFmt(@ERROR_FIELD_NOT_FOUND, [FieldName]);
       end;
     end;
   end;
 end;



label
 GetFieldValue;
begin
 Field := FindFieldInGroupXTable(FieldName, GroupIdFied.AsInteger);
 if Field <> nil then
   GoTo GetFieldValue;
 Field := FindFieldInGroupXTable(FieldName, GROUP_16384);
 if Field <> nil then
   GoTo GetFieldValue;
 Field := FindFieldInGroupXTable(FieldName, GROUP_0);
 if Field <> nil then
   GoTo GetFieldValue;
 Field := FindFieldInCustomFieldTable(FieldName);
 if Field <> nil then
   GoTo GetFieldValue;
 Field := FindFieldInArrayFieldTable(FieldName);
 if Field <> nil then
   GoTo GetFieldValue;
 GetFieldValue:
   FieldVaule := Field.AsString;


чем плох вариант с goto. не надо городить кучу if..else.


 
Dimka Maslov ©   (2011-07-19 11:54) [1]

Это вопрос религии и воспитания. Делай так, как сам считаешь удобным. Несогласные идут прямо и немного направо.


 
palva ©   (2011-07-19 12:01) [2]

Я использую, когда считаю оправданным.

Обычно, когда не рекомендуют, то объясняют, почему. Непонятно объясняют?


 
RWolf ©   (2011-07-19 12:03) [3]


> Unknown555   (19.07.11 11:52) 

очевидный фикс:

Field := FindFieldInGroupXTable(FieldName, GroupIdFied.AsInteger);
if Field = nil then
 Field := FindFieldInGroupXTable(FieldName, GROUP_16384);
if Field = nil then
 Field := FindFieldInGroupXTable(FieldName, GROUP_0);
if Field = nil then
 Field := FindFieldInCustomFieldTable(FieldName);
if Field = nil then
 Field := FindFieldInArrayFieldTable(FieldName);
if Field = nil then
 raise Exception.Create(...);

FieldVaule := Field.AsString;


 
Игорь Шевченко ©   (2011-07-19 12:07) [4]

КГ/АМ


 
SQLEXPRESS   (2011-07-19 12:15) [5]

http://www.delphimaster.net/?s=%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80+goto+&pcount=50&forum=14&user=&order=&dir=asc&title=1&date_begin=&date_end=

http://www.delphimaster.net/?s=%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80+goto+&pcount=50&forum=15&user=&order=&dir=asc&title=1&date_begin=&date_end=


 
Сергей М. ©   (2011-07-19 12:19) [6]


> не надо городить кучу if..else


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


 
icWasya ©   (2011-07-19 13:09) [7]

А вот тоже самое, без GoTo
Field := FindFieldInGroupXTable(FieldName, GroupIdField.AsInteger);
if Field = nil then
 Field := FindFieldInGroupsXTable(FieldName, GROUP_0);
if Field = nil then
 Field := FindFieldInGroupXTable(FieldName, GROUP_16384);
if Field = nil then
 Field := FindFieldInCustomFieldsTable(FieldName);
if Field = nil then
 Field := FindFieldInArrayFieldsTable(FieldName);

if Field <> nil then
 FieldValue := F.AsString
else
 raise Exeption.CreateResFmt(@ERROR_FIELD_NOT_FOUND, [FieldName]);


 
tesseract ©   (2011-07-19 13:46) [8]

Даже у франчей такого извращения не встречал. Через массивы или хэши нельзя что ли ?


 
boriskb ©   (2011-07-19 14:56) [9]

Блин...
Надо ссылку на архив xayam-а давать на самом верху самыми большими буквами.


 
Leshiy_   (2011-07-19 17:12) [10]

никогда не использовал, но в последнем проекте приненил.
не использовал потому-что "религия не позволяла" (с)
а потом плюнул....
нафиг десять лишних if-ов...
з.ы.
только один раз, чес слово


 
Anatoly Podgoretsky ©   (2011-07-19 19:09) [11]

> Leshiy_  (19.07.2011 17:12:10)  [10]

Вечное тебе призрение.


 
Rouse_ ©   (2011-07-19 20:25) [12]

Очень удачны бывают переходы в тело  цикла  Dо,  особенно  из  других модулей. Хотя трансляторы, как правило,  это  запрещают,  их  легко  можно обвести  вокруг  пальца,  пользуясь  переменными  типа метки.   Передача управления в вызываемую процедуру в обход заголовка  принесет  вам долгие
часы счастливых раздумий над кодом завершения 0хС5.

http://icf.bofh.ru/prikols/komp/gloping_programming.html


 
Сергей М. ©   (2011-07-19 20:25) [13]


> Anatoly Podgoretsky ©   (19.07.11 19:09) [11]


> Вечное тебе призрение


http://ru.wiktionary.org/wiki/%D0%BF%D1%80%D0%B8%D0%B7%D1%80%D0%B5%D1%82%D1%8C

И нахрен он кому упёрся - вечно прИзревать за ним ?)


 
Jeer ©   (2011-07-19 21:14) [14]

http://ru.wikipedia.org/wiki/GOTO


 
Jeer ©   (2011-07-19 21:14) [15]

http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B0%D0%B3%D0%B5%D1%82%D1%82%D0%B8-%D0%BA%D0%BE%D0%B4


 
Jeer ©   (2011-07-19 21:25) [16]

http://www.vspu.ac.ru/~chul/dijkstra/goto/goto.htm


 
Loginov Dmitry ©   (2011-07-19 22:22) [17]


> чем плох вариант с goto


Goto удобен на начальном этапе преподавания программирования, когда вводить термин "функция" еще рано (или лениво), а реализовывать каким-либо образом переход на требуемый участок кода уже пора.
Недостаток goto в том, что при злоупотреблении им происходит запутывание кода, причем сложность его распутывания при каждом новом goto растет по экспоненте. Разумеется, любой функционал прекрасно реализуется и без данного оператора.


 
tesseract ©   (2011-07-19 22:29) [18]


> Goto удобен на начальном этапе преподавания программирования,
>  когда вводить термин "функция" еще рано (или лениво),


Лучше бы шаблоны проектирования учили. Метод на операцию - это сложно что ли ?


 
Loginov Dmitry ©   (2011-07-19 22:38) [19]


> Метод на операцию - это сложно что ли ?


Не имею представления, что это за такое "метод на операцию", сложно ли это, кто этому должен учить и зачем.


 
Inovet ©   (2011-07-19 22:41) [20]

Пиши на ассемблере - там пофиг.:)


 
Игорь Шевченко ©   (2011-07-19 22:48) [21]

программу на Фортране можно написать на любом языке.


 
TUser ©   (2011-07-19 22:53) [22]

Удалено модератором


 
tesseract ©   (2011-07-19 22:55) [23]

Удалено модератором


 
Компромисс   (2011-07-20 12:32) [24]

Goto удобен на начальном этапе преподавания программирования, когда вводить термин "функция" еще рано (или лениво), а реализовывать каким-либо образом переход на требуемый участок кода уже пора.

Я считаю, надо сразу учить правильным конструкциям. А не объяснять потом: "То, как мы делали раньше, - абсолютно неправильно и так делать нельзя."


 
Компромисс   (2011-07-20 12:35) [25]

Кстати, из ссылки из Jeer ©   (19.07.11 21:14) [14] отлично видно, что именно java в данном случае отлично подходит как язык обучения, потому что оба "оправданных исключения" в java неоправданы (выход из вложенного цикла в java есть, как есть и try finally)


 
Омлет ©   (2011-07-20 13:46) [26]

Можно переделать так, чтобы функции FindFieldInXXX возвращали булевый результат успешности, а Field передавалось в них как out параметр. Тогда получится более читаемый код, и без goto:


{$BOOLEVAL OFF}
  Field := nil;
  if (FindFieldInGroupXTable(FieldName, GroupIdFied.AsInteger, Field) or
      FindFieldInGroupXTable(FieldName, GROUP_16384, Field) or
      FindFieldInGroupXTable(FieldName, GROUP_0, Field) or
      FindFieldInCustomFieldTable(FieldName, Field) or
      FindFieldInArrayFieldTable(FieldName, Field))
     and (Field <> nil)
  then FieldVaule := Field.AsString
  else raise Exeption.CreateResFmt(@ERROR_FIELD_NOT_FOUND, [FieldName]);


 
Игорь Шевченко ©   (2011-07-20 14:31) [27]


> Тогда получится более читаемый код


не получился


 
Омлет ©   (2011-07-20 14:39) [28]

> Игорь Шевченко ©   (20.07.11 14:31) [27]

Вы прямо блещете ценными комментариями.


 
RWolf ©   (2011-07-20 15:03) [29]


> Омлет ©   (20.07.11 13:46) [26]

строчку and (Field <> nil) можно и убрать — если до неё дошло управление, то Field уже не ноль.


 
Омлет ©   (2011-07-20 16:07) [30]

> RWolf ©   (20.07.11 15:03) [29]
> строчку and (Field <> nil) можно и убрать — если до неё дошло управление, то Field уже не ноль.


Мало ли как там отработали эти функции поиска. К примеру, одна из них вернула true, а Field не присвоила.
Такая проверка не лишняя, по-моему, - не люблю AV.


 
Kerk ©   (2011-07-20 16:11) [31]


> Мало ли как там отработали эти функции поиска. К примеру,
>  одна из них вернула true, а Field не присвоила.

Ужас :)


> Такая проверка не лишняя, по-моему, - не люблю AV.

Намного надежнее так :)

try
 DoAction;
except
end;


 
Омлет ©   (2011-07-20 16:17) [32]

> Ужас

Ok )

  Field := nil;
  if FindFieldInGroupXTable(FieldName, GroupIdFied.AsInteger, Field) or
     FindFieldInGroupXTable(FieldName, GROUP_16384, Field) or
     FindFieldInGroupXTable(FieldName, GROUP_0, Field) or
     FindFieldInCustomFieldTable(FieldName, Field) or
     FindFieldInArrayFieldTable(FieldName, Field) then
  begin
    if Field <> nil then    
      FieldVaule := Field.AsString
    else
      raise WTFExeption.Create("One of FindFieldInXXX function has bag.");
  end
  else
    raise Exeption.CreateResFmt(@ERROR_FIELD_NOT_FOUND, [FieldName]);


 
Игорь Шевченко ©   (2011-07-20 17:11) [33]

Омлет ©   (20.07.11 16:17) [32]

Расстрелять из ржавого пистолета


 
sniknik ©   (2011-07-20 17:36) [34]

> Ok )
так нужно...
  Field := FindInGroup(FieldName, [GroupIdFied.AsInteger, GROUP_16384, GROUP_0]);
  if Field <> nil then
    then FieldVaule := Field.AsString
    else raise Exeption.CreateResFmt(@ERROR_FIELD_NOT_FOUND, [FieldName]);

и переписать реализацию FindInGroup с поиском в цикле со значением из массива. нашел внутри FindInGroup в цикле делаешь exit; и никаких goto.


 
Игорь Шевченко ©   (2011-07-20 18:48) [35]

sniknik ©   (20.07.11 17:36) [34]

Удивляюсь я стремлению посыпать сахаром чужое дерьмо. Странные перверсии.


 
Rouse_ ©   (2011-07-20 21:14) [36]


> Игорь Шевченко ©   (20.07.11 18:48) [35]
> Удивляюсь я стремлению посыпать сахаром чужое дерьмо. Странные
> перверсии.

Ты прям Шарку начал уподобляться, пара/тройка неудачных комментариев и ноль реального смысла.
Собственные варианты-то будут, или так и будешь КГ/АМ отписывать, чисто пофлудить? ;)


 
_65535   (2011-07-20 21:49) [37]


> Rouse_ ©   (20.07.11 21:14) [36]


+1.


 
Дмитрий Тимохов   (2011-07-20 22:59) [38]

код должен работать... остальное для эстетов


 
Германн ©   (2011-07-21 01:49) [39]

Удалено модератором
Примечание: Offtopic


 
asail ©   (2011-07-21 02:09) [40]


> Дмитрий Тимохов   (20.07.11 22:59) [38]
> код должен работать... остальное для эстетов

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



Страницы: 1 2 вся ветка

Текущий архив: 2011.11.20;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.01 c
1-1273995745
:-\
2010-05-16 11:42
2011.11.20
Загрузка Projector flash в delhi


15-1311362178
Dimka Maslov
2011-07-22 23:16
2011.11.20
Кто нибудь знает


3-1266393561
tomkat
2010-02-17 10:59
2011.11.20
Медленная вставка через TIBScript


10-1175837272
Лу
2007-04-06 09:27
2011.11.20
DHTMLEdit.DOM.ExecScript - Отказано в доступе. ( D7 XP )


15-1311252880
Дмитрий С
2011-07-21 16:54
2011.11.20
Как можно так стремно делать программы в 21 веке?