Форум: "Прочее";
Текущий архив: 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