Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-71942
Empleado
2003-09-01 16:31
2003.09.22
Вот тут это самое, как его ...


14-71845
DiamondShark
2003-09-01 14:35
2003.09.22
Поздравляю всех.


4-71999
artemkin
2003-07-17 19:10
2003.09.22
Мышь


1-71706
qwerty2
2003-09-10 17:55
2003.09.22
Некорректный импорт библиотеки типов


3-71553
nikkkk
2003-08-28 17:22
2003.09.22
Как работать с составными(expression) индексами ???





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