Страницы: Пред. 1 2 3
RSS
О вредном GoTo
 
ИМХО, если использоваться ГоуТу для замены циклов с проверкой условия, то тут нет вообще никакой проблемы. Также, ИМХО, для языков, типа VBA, которые работают как макросы, исполняя код в реальном времени. А проблемы начинаются в других языках программирования, когда проходит этап компиляции программы. Тогда корректно и эффективно прописать выход из какого нибудь очередного цикла наружу, не представляется возможным. И возможно при этом нарушится логика программы и будет ошибка.
Если автоматизировать бардак, то получится автоматизированный бардак.
 
Есть еще тема про Application.GoTo: http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=41511
 
Не приходилось еще использовать Application.GoTo, но инфо интересная, спасибо!
«Бритва Оккама» или «Принцип Калашникова»?
 
Могу сказать, что лично я использую переходы по меткам, в первую очередь, чтобы выходить при ошибке/отмене с соответствующим сообщением. Дело в том, что, зачастую, просто невозможно предугадать заранее ВСЕ возможные косяки "пользователя" — как раз для таких случаев, лично у меня, предусмотрен вывод "экстренного" сообщения по любой ошибке. К тому же намного удобнее писать GoTo ex, чем каждый раз длинный MsgBox.Вот пример…
Код
Sub ВставитьСлеваИСправа()
Dim cl As Range
Dim iLeft$, iRight$
On Error GoTo ex
iLeft = Application.InputBox("Вставить слева:", "Введите текст", "труба до " & ChrW(216), Type:=2)
    If iLeft = "False" Then GoTo ex
iRight = Application.InputBox("Вставить справа:", "Введите текст", " мм", Type:=2)
    If iRight = "False" Then GoTo ex
    If iLeft = "" And iRight = "" Then GoTo ex
Application.ScreenUpdating = 0:On Error GoTo er
    For Each cl In Selection
        If Len(cl) > 0 Then cl.Value = iLeft & cl.Value & iRight
    Next cl
GoTo fin
er:MsgBox "КРИТИЧЕСКАЯ ОШИБКА!", vbCritical, "FATAL ERROR"
ex:MsgBox "Отмена выполнения…", vbInformation, "EXIT"
fin:Application.ScreenUpdating = 1
End Sub
а в целом: заставь дурака богу молиться - он себе лоб расшибёт. Любой инструмент/способ можно "испоганить" при неправильном/чрезмерном употреблении. Топик, с точки зрения обмена информацией - очень круто, а спорить о "полезности" не имеет смысла. Переход по меткам просто есть и всё  :D

[статья на хабре]
Изменено: Jack Famous - 23.09.2018 19:54:30 (Убрал лишние переносы в коде и добавил замечание по удобству использования GoTo для однотипных переходов)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Go To - наследие процедурных языков программирования) Ваш КЭП
Первый Бейсик с которым я имел дело,  на котором учился писать что-то отдаленно похожее на программы содержал всего один вид цикла For, и два вида переходов: Go To , Go Sub. Потом был Ассемблер, где тоже всего три варианта вызова/перехода: Jp (абсолютный), Jr (относительный) и Call. Далее лет 15 забвения всех поползновений в сторону программирования. И вдруг устраиваюсь в такое замечательное место, где есть САП (с которым раньше дел не имел, и которому прямо на рабочем месте меня обучал наш сапер аж целых полчаса) ,Excel и необходимость упорядочить хаос творившийся вокруг этими подручными средствами. Ну и понеслось. Разумеется GoTo встречается в моем коде довольно часто)
 
Цитата
vikttur написал:
Не всегда вижу..., как при необходимости выйти из внутреннего цикла за Next i, не применяя флаги или GoTo.
Как обычно.
Код
For i = 1 To 100
For j = 1 To 100
a(i, j) ......
Exit For
Next j
If j<101 Then Exit For
Next i

В цикле For флаги встроены изначально :)
Изменено: StoTisteg - 16.05.2018 22:26:49
 
А Вы внимательно все сообщения прочитали?
Цитата
StoTisteg написал: If j<101 Then Exit For
Это тоже костыль. Тот же флаг, но условием... А если вложенных циклов несколько, для выхода из внутреннего условие придется ставить в каждом. Так что проще - If/If/If или один раз одним оператором? Обсуждалось это.
 
родственная тема
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: Пред. 1 2 3
Наверх