Главная страница
    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]
> код должен работать... остальное для эстетов

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


 
asail ©   (2011-07-21 02:10) [41]

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


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

Rouse_ ©   (20.07.11 21:14) [36]

Твой комментарий исключительно по теме и полезен


 
Германн ©   (2011-07-22 02:25) [43]

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


 
Kerk ©   (2011-07-22 10:20) [44]

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


 
Тимохов Д   (2011-07-23 17:16) [45]


> asail ©   (21.07.11 02:09) [40]
>
> > Дмитрий Тимохов   (20.07.11 22:59) [38]
> > код должен работать... остальное для эстетов
>
> Неправда ваша!


я крамолу скажу, видимо)))

знаете, я считаю, что любая программа на любом языке является компьютерным отражением реального процесса... попробую объяснить) вот математика... на самом деле математика имеет 2 направления - фундаментальное и прикладное. фундаментальное варится в само в себе и ... ищет, где бы найти результаты варки в практике. вот прикладное направление реально решает задачи. оба направления важны - второе вытекает из первого. так же и с программированием - если ты занимаешься теоретикой, то да, надо делать так, чтобы опыт создания программы давал новые качественные наработки. если же ты практик - нехай работает код: ВСЕ РАВНО прикладная область константна и если тебе надо будет разбираться в коде, то только полное Г даст тебе затруднения, а нормальный в целом код по изучению примерно одинаков по времени. и goto не является тем отягощяющим обстоятельством, которое делает код полным Г...

как-то так)))


 
TUser ©   (2011-07-23 22:37) [46]

Теперь буду использовать. Примерно так:

username, goto

Ведь материцца тут низя.


 
_Юрий   (2011-07-24 12:07) [47]


> и goto не является тем отягощяющим обстоятельством, которое
> делает код полным Г...


Теоретически не делает, а на практике я ни разу не видел когда с goto, который не был бы полным говном


 
TUser ©   (2011-07-24 20:39) [48]


> Тимохов Д   (23.07.11 17:16) [45]

Я могу ошибаться, но ... в "фундаментальном" программировании задача может меняться три раза в месяц, потому что заранее неизвестно, что собственно должно олучиться в оконцовке. Это ж творчество. То есть ситуация, когда надо вместо 12-этажного дома построить поселок, - это норма.

Я вот тут месяц угрохал - сначала решал задачу так, потом попроще, потом решил, что можно еще проще, в итоге сделал в 20-30 строк примитивного кода. Чутка параметры только вот подогнать, ага. Это хорошая ситуация. Бывает и так, что вдруг понимаешь, что вот тут надо вот эдак, а заранее этого никто не планировал, и делается это костылями. Ну или переписыванием с нуля, на что не всегда есть возможности.

А когда заранее спланированной архитектуры нет, разве может получиться неговнокод?


 
Тимохов Д   (2011-07-24 22:03) [49]

2TUser

Я сказал свое мнение - goto не является признаком говнокода.
Все))) Говнокод можно и без goto сделать.
Не могу обсуждать серьезно, я уже мысленно купаюсь в Черном Море )))
Вот, Маслов Серега писал с моря)) А я сейчас хвастаться начну))) Завидуйте))))

Но позволю себе сказать))
Я не зря сказал про константность области, лежащей под кодом. Все всегда кажется классно написанным, когда только что написал, и сделал это красиво. Но проходит время смотришь свой код, или чужой. Как бы он ни был написан, все равно надо ботать этот код, все равно надо разбираться, что лежит под этим кодом. Ну я уже повторяюсь))) Виноват)



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

Форум: "Прочее";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.005 c
8-1204086962
DoKi
2008-02-27 07:36
2011.11.20
opengl2 треугольники


15-1311199461
Делфиец
2011-07-21 02:04
2011.11.20
А есть ли в Питере?


2-1311757172
SQLEXPRESS
2011-07-27 12:59
2011.11.20
Работать с Word, не через буфер обмена


15-1311077706
>|<
2011-07-19 16:15
2011.11.20
Как назвать ТЗ?


2-1311651490
Девелопер
2011-07-26 07:38
2011.11.20
В bat-файле вывести результат команды в переменную





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский