Безусловные переходы

lionk

Well-known member
05.04.2007
310
2
#1
Ещё с школьных годов, когда на паскале програмил, вызубрил что использование безусловных преходов
(меток и прыжков по средствам оператора GoTo) - это зло,
и надо их избегать всеми возможными путями.

тут на днях натолкнулся на скрипт примера, где эти скачки используются в большом количестве вот и задумался может зря я метки не использую.
народ а вы часто пользуетесь конструкцией

label:

if x<>y then goto label

и стоит ли нею заменять всякие штуки типо

do
if x<>y then exit do

loop
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Я частенько юзаю.
Ничего плохого не вижу, если конечно не перегибать.
Больше 2-х меток в одной процедуре у меня, кажись, никогда не было.
Да и 2 очень редко.
А вот одна - частенько.

Ну это не считая ErrorHandler'a, который тоже меткой сделан:
Код:
On Error Goto Errh

'Тра-ля-ля

Exit Sub
Errh:
Call ErrHandler
Exit Sub
Мне кажется, что с метками код более читабелен (при условии разумного использования): меньше степеней вложенности кода.
 

lionk

Well-known member
05.04.2007
310
2
#3
ну против On Error Goto Errh я безсилен, он полюбому пресудствует.
я имею в виду большого использования меток(штук 10-ть) в больших процедурах.
и (тфу-тьфу-тфу) прыжков в цыклах?
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#4
Если вовремя разбивать код на функции, то ничего страшного нет. Метку найти несложно.
Сам не очень часто использую. В основном конструкцию типа If что-то Then Exit Sub.

я имею в виду большого использования меток(штук 10-ть) в больших процедурах.
А не надо допускать больших процедур. Если код не влазит на страницу, то его надо разбивать на процедуры.

Обычно меня раздражают каскадные If'ы и большой код. Ищи потом где очередной If заканчиватеся. Уж лучше Goto сделать. :(
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#5
Omh, ай-я-яй! :(
что о тебе люди подумают, когда узнают, что ты пользуешься безусловными переходами! :)

я бы рекомендовал последовать примеру Medevic.
переходы лучше делать условными, а "функциональных простыней" не допускать!
метки раньше использовали для реализации процедур, сейчас возможности языка позволяют обходится без них.

зы: читать код с метками никак не проще
а вот конструкции кода можно ими упростить, но, если этим увлечься, то код превратится в "миску спагетти", и придется долго искать путь его выполнения...

зы2: я до лотуса вообще метками не пользовался (сейчас на них обработчики ошибок приходится строить), поэтому сначала даже хотел возразить, что в Паскале меток нету :) на сколько для меня это несопоставимо! ;)
 

Omh

Lotus team
04.07.2007
2 210
1
#6
Ну я вот тока ща писал код:
мне перед детачингом файла в папку надо проверить, нет ли там файла с таким же именем, и если есть, его переназвать.

Я сделал это так:
Код:
Dim Counter As Integer
Dim OriginalFileName as string 'имя файла
Dim OriginalFileOnlyName as string 'имя без расширения
Dim OriginalFileOnlyExt as string 'расширение без имени

'тут вычилсяются OriginalFileOnlyName/OriginalFileOnlyExt из OriginalFileName

TryToExtract:				
If Dir$(BackupTo + OriginalFileName) <> "" Then 'File with same name exists
Counter = Counter + 1
OriginalFileName = OriginalFileOnlyName + "_" + Cstr(Counter) + "." + OriginalFileOnlyExt ' модифицирую имя под которым буду детачить
Goto TryToExtract
End If

'Ну а тут уже детачу под новым именем (OriginalFileName)
По моему, всё чики-пики.
Уж во всяком случае красивее, чем было бы с while :(
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#7
зато While займет на две строки кода меньше и не надо использовать переход :(

Код:
While (Dir$(BackupTo + OriginalFileName) <> "") Then 'File with same name exists
Counter = Counter + 1
OriginalFileName = OriginalFileOnlyName + "_" + Cstr(Counter) + "." + OriginalFileOnlyExt ' модифицирую имя под которым буду детачить
Wend
и что красивее, панове? :)
 

lionk

Well-known member
05.04.2007
310
2
#8
А не надо допускать больших процедур. Если код не влазит на страницу, то его надо разбивать на процедуры.
это на любителя, лично мне кажется что поцедуру надо создавать только если её прийдётся вызвать как минимум пару раз. сильно раздражет при разборе постоянно прыгать по какимто 5-ти строчным методам с их внутренними константами.

понтяно что наиболее выгодная область пременения меток и прыжков это обработка ошибок и проверка валидности данных.

(сейчас на них обработчики ошибок приходится строить)
и что, нет у тя негативных впечатлений от обработчика с кучей меток? глюки там всякие, понижение производительности?
 

Omh

Lotus team
04.07.2007
2 210
1
#9
О! Akupaka , круто :(
Значит не красивее.
Как гриццо, не ошибается тока тот, кто ничё не делает.

Я думаю проблема в том, что мой мозг не очень под циклы заточен. ;)

Ну и повторюсь, у меня если и есть метка, то обычно одна, не считая эррорхандлеровой :)
А прыжки в цикле по меткам - этож пипец.
Я такое сугубо не люблю :)
----------------------
Опозорился на всю страну :D
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#10
и что, нет у тя негативных впечатлений от обработчика с кучей меток? глюки там всякие, понижение производительности?
О.о затрудняюсь ответить... у меня редко бывает обработчик на более чем двух метках (причем, две это необходимый минимум в корректном обработчике) про производительность я бы тут даже не стал говорить, т.к. производительность безусловного перехода заведомо выше условного :)

Опозорился на всю страну biggrin.gif
на все четыре! :)

А прыжки в цикле по меткам - этож пипец.
к стати, если бы не do/do while то без прыжка из цикла не обойтись, т.к. для обычного while нет оператора выхода их цикла о.О

а вообще, то это все предпочтения конкретного разработчика или группы. если язык предоставляет возможность, то почему бы ее не использовать! :(

сильно раздражет при разборе постоянно прыгать по какимто 5-ти строчным методам с их внутренними константами.
не стоит сравнивать методы классов и процедуры, даже по количеству буков

лично мне кажется что поцедуру надо создавать только если её прийдётся вызвать как минимум пару раз
дык! это ее единственное теоретическое предназначение! ;)
все остальное как я уже писал предпочтения
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#12
Ну тут можно пополемизировать
давай! :(

некорректный обработчик

Код:
On error goto errh

...

eos:
exit sub

errh:
actual_error_Handler

корректный 1
Код:
On error goto errh

...

eos:
exit sub

errh:
actual_error_Handler
resume eos
корректный 2
Код:
On error goto errh

...

eos:
exit sub

errh:
'rerise error
error err, errmsg
 

Omh

Lotus team
04.07.2007
2 210
1
#13
Ну ещё процедуру можно создавать, если программерское предчувствие говорит "выноси нафик, пригодится" :(
---------------------------------------------------

Я вот это не понимаю:
Код:
eos:
exit sub

errh:
actual_error_Handler
resume eos
Почему бы после ошибки не выйти просто?

Код:
тра-ля-ля (в смысле код)
exit sub

errh:
actual_error_Handler
Exit Sub
Я на сёдня всё, всем хороших выходных.
/me пошёл тратить зарплату
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#14
Ну ещё процедуру можно создавать, если программерское предчувствие говорит "выноси нафик, пригодится" :(
можно, но редко пользуюсь...
к сожалению, до сих пор не пришел к единому красивому обработчику, чтобы логирование там же красиво организовать... (

обычно так пишу:

Код:
errh:
error err, error & " (" & cstr(erl) & ", SubName)"

errh:
Messagebox "Ошибка: " & error & " (" & cstr(erl) & ")"

и получаем в итоге стек вызовов, удобно для разраба/админа, но громоздко для юзера

Почему бы после ошибки не выйти просто?
а ошибка "No RESUME" тебе не знакома? О.о
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
276
#15
полез, сёдня, в шаблон мэйл, помотреть - как оно там софтделит делает (по кнопке)...
хотелось убить всех индусов в мире
и менно из-за goto (пилять)
запустил под отладчиком - получил малевича, плюнул...
меня переполняют отрицательные эмоции :(
 
30.05.2006
1 345
11
#16
про производительность я бы тут даже не стал говорить, т.к. производительность безусловного перехода заведомо выше условного :)
Ы!.. Не в ту степь мыслите.
Переходы портят всю лафу оптимизирующим компиляторам. Код бъется на "линейные" участки - от перехода до перехода - которые оптимизируются независимо. Чем мельче участки, тем меньше эффективность оптимизации.

PS: сомневаюсь, что LS - оптимизирующий :(
 

azat20

Well-known member
22.07.2008
244
0
#20
Господа, предлагаю на суд одну мыслю, нехитрая реализация которой уже давно работает к меня. В общем представьте ситуацию, что агент работает по расписанию и начинает работать неверно,т.е. не работать (бывает к сожалению). Логично было бы предположить, что сразу можно, то бишь нужно оповестить об этом админа Лотус путем отправки ему письма. Не знаю, может есть стандартные механизмы этого, но сделал так :(

У меня в таких агентах работает такая схема:
onerror goto ErrHand

ErrHand:
тут формируем поля письма, записывая в тело описание ошибки, номер ошибки, название агента (иную всю инфу которую можно достать). и все это отправляем админам.