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

Тема в разделе "Lotus - Программирование", создана пользователем lionk, 3 апр 2009.

  1. lionk

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    Ещё с школьных годов, когда на паскале програмил, вызубрил что использование безусловных преходов
    (меток и прыжков по средствам оператора GoTo) - это зло,
    и надо их избегать всеми возможными путями.

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

    label:

    if x<>y then goto label

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

    do
    if x<>y then exit do

    loop
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я частенько юзаю.
    Ничего плохого не вижу, если конечно не перегибать.
    Больше 2-х меток в одной процедуре у меня, кажись, никогда не было.
    Да и 2 очень редко.
    А вот одна - частенько.

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

    'Тра-ля-ля

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

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    ну против On Error Goto Errh я безсилен, он полюбому пресудствует.
    я имею в виду большого использования меток(штук 10-ть) в больших процедурах.
    и (тфу-тьфу-тфу) прыжков в цыклах?
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Если вовремя разбивать код на функции, то ничего страшного нет. Метку найти несложно.
    Сам не очень часто использую. В основном конструкцию типа If что-то Then Exit Sub.

    А не надо допускать больших процедур. Если код не влазит на страницу, то его надо разбивать на процедуры.

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Omh, ай-я-яй! :(
    что о тебе люди подумают, когда узнают, что ты пользуешься безусловными переходами! :)

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

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну я вот тока ща писал код:
    мне перед детачингом файла в папку надо проверить, нет ли там файла с таким же именем, и если есть, его переназвать.

    Я сделал это так:
    Код (Text):
    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 :(
     
  7. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    зато While займет на две строки кода меньше и не надо использовать переход :(

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

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    это на любителя, лично мне кажется что поцедуру надо создавать только если её прийдётся вызвать как минимум пару раз. сильно раздражет при разборе постоянно прыгать по какимто 5-ти строчным методам с их внутренними константами.

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    О! Akupaka , круто :(
    Значит не красивее.
    Как гриццо, не ошибается тока тот, кто ничё не делает.

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

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    О.о затрудняюсь ответить... у меня редко бывает обработчик на более чем двух метках (причем, две это необходимый минимум в корректном обработчике) про производительность я бы тут даже не стал говорить, т.к. производительность безусловного перехода заведомо выше условного :)

    на все четыре! :)

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

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

    не стоит сравнивать методы классов и процедуры, даже по количеству буков

    дык! это ее единственное теоретическое предназначение! ;)
    все остальное как я уже писал предпочтения
     
  11. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну тут можно пополемизировать :(
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    давай! :(

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

    Код (Text):
    On error goto errh

    ...

    eos:
    exit sub

    errh:
    actual_error_Handler

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

    ...

    eos:
    exit sub

    errh:
    actual_error_Handler
    resume eos

    корректный 2
    Код (Text):
    On error goto errh

    ...

    eos:
    exit sub

    errh:
    'rerise error
    error err, errmsg
     
  13. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну ещё процедуру можно создавать, если программерское предчувствие говорит "выноси нафик, пригодится" :(
    ---------------------------------------------------

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

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

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

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    можно, но редко пользуюсь...
    к сожалению, до сих пор не пришел к единому красивому обработчику, чтобы логирование там же красиво организовать... (

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

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

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

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

    а ошибка "No RESUME" тебе не знакома? О.о
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    полез, сёдня, в шаблон мэйл, помотреть - как оно там софтделит делает (по кнопке)...
    хотелось убить всех индусов в мире
    и менно из-за goto (пилять)
    запустил под отладчиком - получил малевича, плюнул...
    меня переполняют отрицательные эмоции :(
     
  16. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Ы!.. Не в ту степь мыслите.
    Переходы портят всю лафу оптимизирующим компиляторам. Код бъется на "линейные" участки - от перехода до перехода - которые оптимизируются независимо. Чем мельче участки, тем меньше эффективность оптимизации.

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    мыслю древними знаниями писания в асме О.о
     
  18. K-Fire

    K-Fire Гость

    В таком обработчике ошибок "No Resume" не возникает.
     
  19. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    опс, ты прав, я был не внимателен, и перепутал exit sub и end sub.
    в любом случае, я привык использовать конструкцию с resume :) либо с регенерацией ошибки
     
  20. azat20

    azat20 Well-Known Member

    Регистрация:
    22 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    Господа, предлагаю на суд одну мыслю, нехитрая реализация которой уже давно работает к меня. В общем представьте ситуацию, что агент работает по расписанию и начинает работать неверно,т.е. не работать (бывает к сожалению). Логично было бы предположить, что сразу можно, то бишь нужно оповестить об этом админа Лотус путем отправки ему письма. Не знаю, может есть стандартные механизмы этого, но сделал так :(

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

    ErrHand:
    тут формируем поля письма, записывая в тело описание ошибки, номер ошибки, название агента (иную всю инфу которую можно достать). и все это отправляем админам.
     
Загрузка...
Похожие Темы - Безусловные переходы
  1. Normann
    Ответов:
    0
    Просмотров:
    2.662

Поделиться этой страницей