Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.025 c
1-71651
P0tia
2003-09-08 21:19
2003.09.22
Как сделать, чтобы иконка показывалась только около часов?


1-71635
Шустрый
2003-09-09 11:17
2003.09.22
Третье по счёту число из пятизначного числа


14-71873
bl_wizard
2003-09-02 18:54
2003.09.22
Примерная стоимость разработки БД


1-71731
Марат
2003-09-10 14:04
2003.09.22
Календарь


3-71510
konst
2003-09-01 09:35
2003.09.22
Ув. мастера помогите разобраться с MDI формами