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