Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Вниз2 варианта прерывания вложенного цикла. Какой правильнее? Найти похожие ветки
← →
AVK2 (2003-09-06 04:04) [0]Есть 2 варианта прерывания вложенного цикла.
Какой правильнее с точки зрения ОО языка и формируемого машинного кода?
bBreak := false;
for y := 0 to yMax do begin
for x := 0 to xMax do begin
if ... then begin
bBreak := true;
Break;
end;
end;
if bBreak then Break;
end;
if bBreak then begin
...
end
или
for y := 0 to yMax do
for x := 0 to xMax do
if ... then goto Label1;
goto Label2;
Label1:
...
Label2:
Мне ПОЧЕМУ-ТО больше нравится 2-й вариант. :)
С goto.
← →
Dlin (2003-09-06 06:32) [1]Как Вариант
For I:= 1 to NI
For J:= 1 to NJ
if F(I,J) THEN
BEGIN
...
BREAK;
END;
← →
cyborg (2003-09-06 08:22) [2]Бывыют случаи, что без ГОТО необойдёшси, есть у меня пара таких моментов в циклах. Бывают, но очень редко, когда без них уже просто тупик.
← →
Юрий Зотов (2003-09-06 08:29) [3]> AVK2 (06.09.03 04:04)
> Какой правильнее с точки зрения ОО языка ...
Без разницы, поскольку этот код не имеет к ООП никакого отношения.
> ... и формируемого машинного кода?
Тоже без разницы, поскольку в машинном коде Break и GoTo - это практически одно и тот же (JMP).
← →
SergP (2003-09-06 08:41) [4]
> Бывают, но очень редко, когда без них уже просто тупик.
Сомневаюсь... Хотя возможно с ними решение было бы лучше. Но ИМХО всегда можно без них обойтись.
← →
Юрий Зотов (2003-09-06 08:57) [5]> cyborg © (06.09.03 08:22) [2]
В теории ДОКАЗАНО, что без GoTO можно обойтись ВСЕГДА. Поэтому его использование и считается плохим стилем - с одной стороны, оператор избыточный, а с другой стороны, если GoTo много и они уводят в "дальние" места исходника, то алгоритм тяжело читается.
Но на практике иногда простой и "ближний" GoTo позволяет избавиться от лишнего кода и даже наоборот, улучшить читабельность программы. Поэтому в практических языках этот оператор все же поддерживается.
Continue, Break и т.п. - это компромиссы. Фактически, тот же самый GoTo, только не связанный с явной меткой.
← →
Всеволод Соловьёв (2003-09-06 09:20) [6][5] Юрий Зотов © (06.09.03 08:57)
целиком и полностью согласен :)
проверил на своем опыте :) обе аксиомы :) нащет гото можно избавиться и гото сокращает год
← →
y-soft (2003-09-06 09:24) [7]А почему только 2 способа?
...
3. Exit;//Вариант - Halt :)
4. Вызов исключения
Кто больше? :)
← →
Юрий Зотов (2003-09-06 09:31) [8]y-soft © (06.09.03 09:24) [7]
Все же это не совсем GoTo.
Exit - зависит от реализации. Может быть либо GoTo на код выхода, либо генерация кода выхода прямо в месте вызова.
Halt - ближе к TerminateProcess. С вытекающими фичами.
Вызов исключения - уход в стек обработки исключений.
← →
y-soft (2003-09-06 09:43) [9]>Юрий Зотов © (06.09.03 09:31) [8]
Да я имел в виду не внутреннюю реализацию, а способы выхода из цикла. Иногда такие методы оптимальнее/удобнее типовых - способ 3, когда циклы выносятся в отдельные процедуры, способ 4 - когда цикл оказывается внутри конструкций try...except/try...finally. Halt - скорее шутка...
← →
cyborg (2003-09-06 10:01) [10]>>В теории ДОКАЗАНО, что без GoTO можно обойтись ВСЕГДА.
Это да, но при этом нужно написать больше кода, бывают ситуации, когда например нужно перепрыгнуть часть кода в цикле и бреак или контине не всегда подходит
Как выйти например в этой ситуации:
For A:=1 to 5 do
begin
for B:=1 to 5 do
begin
For C:=1 to 5 do
begin
if ... then goto Jump;
end;
end;
Jump :
end;
← →
DarkGreen (2003-09-06 10:25) [11]Просто
For A:=1 to 5 do
begin
for B:=1 to 5 do
begin
For C:=1 to 5 do
begin
if ... then
begin
Flag := True;
break;
end;
end;
if Flag then
break;
end;
end;
← →
cyborg (2003-09-06 10:40) [12]А теперь добавим пару строк :)
For A:=1 to 5 do
begin
Jump1 :
for B:=1 to 5 do
begin
For C:=1 to 5 do
begin
if ... then goto Jump1;
if ... then goto Jump2;
end;
end;
Jump2 :
end;
Теперь просто так фиг вылезешь :)
К тому же лишние переменные заводить, обычно в таких циклах итак переменных хватает, а здесь достаточно описание прикрепить что это за метка и когда к ней переходит и всё станет ясно.
← →
y-soft (2003-09-06 10:54) [13]>cyborg © (06.09.03 10:40) [12]
Теперь просто так фиг вылезешь :)
Именно просто так и вылезешь. В прочем - дело вкуса:)
var
Reason : integer = 0;
...
if IsReason1 then
Reason := 1
else if IsReason2 then
Reason := 2
...
else if IsReasonN then
Reason := N;
...
if Reason = 0 then Continue;
...
case Reason of
1: DoReason1;
2: DoReason2;
...
else
DoReason0;
end;
...
← →
Юрий Зотов (2003-09-06 11:10) [14]> cyborg © (06.09.03 10:01) [10]
А почему бы было не прочитать ВСЕ сообщение, а не только его первый абзац?
"Но на практике иногда простой и "ближний" GoTo позволяет избавиться от лишнего кода и даже наоборот, улучшить читабельность программы".
В связи с этим Ваше "но" непонятно.
Сорри за самоцитату и спасибо за ее подтверждение.
:о)
← →
cyborg (2003-09-06 11:45) [15]Юрий Зотов © (06.09.03 11:10)
Я всё прочитал, просто хотелось привести пример где лучше использовать GOTO.
[13] y-soft © (06.09.03 10:54)
Это называется хороший тон? :)
Теперь тоже самое, только циклы покажи, а то непонятно ничего причём тут они ;)
← →
y-soft (2003-09-06 12:10) [16]>cyborg © (06.09.03 11:45) [15]
Это называется хороший тон? :)
Теперь тоже самое, только циклы покажи, а то непонятно ничего причём тут они ;)
Это просто один из бесчисленных вариантов - дополнительная переменная может ведь не обязательно быть булевской... Циклы подразумеваются. Никто против применения GoTo не выступает, но и не навязывает...
Я сам обычно выношу такие вложенные циклы в функции, которые возвращают причину выхода из цикла, а в функциях выхожу по exit - читабельность кода при этом не проигрывает. А на оптимизацию в нынешних условиях влияют гораздо больше другие факторы...
← →
cyborg (2003-09-06 12:40) [17]
[16] y-soft © (06.09.03 12:10)
Я сам обычно выношу такие вложенные циклы в функции, которые возвращают причину выхода из цикла, а в функциях выхожу по exit - читабельность кода при этом не проигрывает. А на оптимизацию в нынешних условиях влияют гораздо больше другие факторы...
Какие другие?
Теперь замени :=1 to 5 на :=1 to 50000 и скажи какие другие факторы влияют в нынешних условиях?
У тебя огромное кол-во времени уйдёт на CASE, чтение/запись памяти и вызов твоих функций с возвратом значений. Твой пример уже плохо читается даже без объявления функций.
← →
cyborg (2003-09-06 12:45) [18]>y-soft
Упс, посмотрел на дату рождения, прошу прощения, слово "ты" нужно заменить на "вы" :)
← →
y-soft (2003-09-06 13:02) [19]>cyborg © (06.09.03 12:40) [17]
1. "Обычно" <> "Всегда"
2. Гораздо эффективнее оптимизация на уровне архитектуры приложения, т.е. почти всегда можно избежать перебора в гигантских циклах или, по крайней мере, свести его к минимуму или вынести в отдельные потоки. В более-менее больших проектах ловля байтов/команд процессора приводит к многократному замедлению разработки и большому количеству ошибок. Если хотите такой оптимизации, то тогда откажитесь от ООП вообще - оно по определению избыточно... И вообще - что такое в Вашем понимании оптимизация? По времени выполнения, по использованию ресурсов, по скорости разработки? IMHO - это все-таки всегда компромисс, зависящий в первую очередь от задачи...
3. В конце концов пишите так, как Вам больше нравится :)
← →
y-soft (2003-09-06 13:05) [20]>y-soft © (06.09.03 13:02) [19]
Видимо мой ник выглядит недостаточно серьезно :))
← →
cyborg (2003-09-06 13:15) [21]От ООП отказываться не нужно, но в данном случае мы рассматриваем выгодность использования GOTO в неких случаях, поэтому не всегда верно мнение, что использование GOTO - дурной тон.
Вы показали пример, как можно обойти использования перехода путём создания нагромождений ввиду того, что по чьему-то мнению использование GOTO это дурной тон. От этого ваш код превращается в плохо читаемый и плохоразбираемый код. Из этого сделаем вывод, что использование GOTO в некоторых, а особенно в критических случаях очень выгодно как в скорости, так и в читабельности.
На том и порешим :).
В моём понимании оптимизация, это чтобы быстро работало и без ошибок.
← →
cyborg (2003-09-06 13:16) [22]>>Видимо мой ник выглядит недостаточно серьезно :))
Да :), аналагоия с различными васясофт и ко.
← →
y-soft (2003-09-06 13:20) [23]>cyborg © (06.09.03 13:16) [22]
Да :), аналагоия с различными васясофт и ко.
А менять уже поздновато :))
P.S. Так ведь не спорю я о GoTo - программирование процесс творческий, просто одну и ту же задачу всегда можно решить множеством способов...
← →
PVOzerski (2003-09-06 16:52) [24]Что до меня - у меня goto - только для выхода из вложенных циклов. Иначе еще худшие "огороды городить приходится" - с флагами, множеством break"ов... Кстати, о соотношении break/goto. Жаль, я не дизассемблировал в свое время эти конструкции после компиляции в TP7. Потому как заметил интересную вещь. А именно: использование break повышало требовательность программ к размерам стека, по сравнению с аналогами с goto.
← →
DeMoN_Astra (2003-09-07 22:23) [25]Народ, а ведь можно и без goto&break обойтись ...
и всего-то надо правильно юзать циклы с пред-, пост-условием + параметрические .. и это без ооп .. (причем тут вообще ооп? %)
← →
Юрий Зотов (2003-09-07 22:28) [26]> DeMoN_Astra (07.09.03 22:23) [25]
Циклы while и repeat выполняются медленнее, чем for с простым локальным счетчиком. Иногда это важно.
← →
AVK02 (2003-09-08 04:48) [27]> DeMoN_Astra (07.09.03 22:23) [25]
>/ ( причем тут вообще ооп? %)/
В ООП не рекомендуется использовать goto.
Только "приэтом" :)
Абсолютно согласен с Юрием Зотовым ([5]):
/Но на практике иногда простой и "ближний" GoTo позволяет избавиться от лишнего кода и даже наоборот, улучшить читабельность программы./
Кстати и машиный код покороче и попроще будет.
← →
имя (2003-09-08 08:52) [28]Удалено модератором
← →
Alexander Vasjuk (2003-09-08 15:56) [29]В исходниках от Борланд (знаете такую фирму?) нет goto.
Это что-то значит?
← →
Verg (2003-09-08 16:14) [30]
> Это что-то значит?
Это значит, что
В исходниках от Борланд нет goto и не более того.
В некоторых исходниках нет continue, в некоторых нет case
Некотрые не любят пользоваться for, некоторые repeat....
Я, например, терпеть не могу initialization/finalization :))
а так же threadvar и что?
← →
panov (2003-09-08 16:18) [31]Во всем надо исходить из принципа целесообразности...
← →
Palladin (2003-09-08 16:19) [32]Да, а я
Set of
терпеть не могу...
Это что то значит. :)
← →
Verg (2003-09-08 16:26) [33]Насчет выхода из вложенных циклов:
По мне goto для этого - самый корявый вариант.
Остальные все хороши.
Просто в коллекцию:
try
for ....
for ....
exit
finally
То, что после циклов
end;
end; конец процедуры
← →
Arm79 (2003-09-08 16:31) [34]Можно и goto использовать, можно и break. Дело вкуса. Я предпочитаю break/continue. Еxit только для процедур и функций. А насчет больших циклов, что это коряво, не согласен. Мне приходится сталкиваться с большими числами при моделировании.
← →
AVK02 (2003-09-08 17:35) [35]А вот насчёт Borland - это мысль!
Я посмотрел исходники Delphi 5.
В Source\Rtl\Sys\getmem.inc 5 раз встретилось "goto abort;"!
В Source\Decision Cube\mxdssqry.pas 2 раза "goto FastExit" - в процедурах
procedure TDSSQueryEditor.RemoveButtonClick(Sender: TObject);
procedure TDSSQueryEditor.RemoveAggClick(Sender: TObject);
Причём вместе с Break, try..except !!!
Это что-то значит? :)
2-я процедура весит 65 строк. Может стоит выложить? Или все сами посмотрят? :)
В принципе, в качестве примера - самое то, и не сложно, и достаточно кучеряво.
← →
афвуд (2003-09-11 15:40) [36]>исходники Delphi 5
Скорее всего это не исходники Delphi 5(кто их покажет), а VCL.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.15 c