Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];

Вниз

оператор 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.004 c
2-1312259634
Grimm
2011-08-02 08:33
2011.11.20
Как правильно написать условие if для StringList.IndexOf ?


15-1311830801
George
2011-07-28 09:26
2011.11.20
Сравнение текстов


2-1311843120
Александр160591
2011-07-28 12:52
2011.11.20
запарка с компонентами и их свойствами


8-1204086962
DoKi
2008-02-27 07:36
2011.11.20
opengl2 треугольники


15-1311079215
Leshiy_
2011-07-19 16:40
2011.11.20
Прерывание работы программиста





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский