Я обновляю макрос и мне нужна помощь с потоком управления. Я не программист по профессии, поэтому с потоком управления я раньше не сталкивался.
Текущая версия макроса работает следующим образом:
Текущая версия работает только в том случае, если присутствуют оба A и B, но мне нужно, чтобы она работала, если присутствует только A или B. Сначала я подумал, что могу копировать/вставлять соответствующие разделы и просто переходить к ним, используя операторы GoTo, но, похоже, это плохая практика.
Как мне ориентироваться в коде, обрабатывающем 4 возможных сценария? (А+В, ни то, ни другое, только А, только В). Для контекста я вызываю отдельную подпрограмму для создания и форматирования 2-й и 3-й книг.
Я рассматривал эти варианты, но не уверен, что больше подходит:
Я ищу тот метод, который является самым чистым, простым в обслуживании и более быстрым в работе (если различия не незначительны). Я склоняюсь к отдельным сабвуферам, но сначала хотел проверить здесь.
IF/ElseIF/Else — это один из вариантов. Лично (и это полностью личное дело), если бы у меня было больше пары ElseIf, я бы переключился на Select/Case. Goto
никогда не был бы вариантом, который я бы выбрал, за исключением маршрутизации захвата ошибок внутри подпрограммы.
Спасибо за быстрые ответы, я буду избегать GoTo, кроме ошибок.
Используйте 3 отдельных блока If и флаг (логический). Если набор данных A присутствует, извлеките его в массив, установите флаг = true. Если набор данных B присутствует, извлеките его в массив, установите флаг = true. Если flag = true, шаг 4-6.
Goto — разумный выбор, если вам нужно выйти из двух или более вложенных циклов, когда (например) Exit For
недостаточно.
ОТ: Доказано, что GoTo упрощает чтение кода и избавляет от путаницы, вместо того, чтобы иметь дополнительное «если» , которое для некоторых тоже не стоит . В конце концов, пока ваш код читаем, когда вы его объясняете, все должно быть в порядке. Единственное, о чем стоит беспокоиться при кодировании, — это утечки памяти, остальные мелочи — это просто стили кодирования. PS: Насчет того, когда использовать каждый, мое правило простое, слово это, IE: "в случае пожара: гидрант" "Если я поднимусь до 6 утра, то я"... и так далее. Что кажется более понятным по-человечески.
Множественные мнения, изложенные в комментариях, демонстрируют, почему этот вопрос следует закрыть как основанный на мнениях. "Лучший" субъективен.
Если бы я был вами, я бы создал переменную «сценарий» и присвоил бы ей значение в зависимости от случая, в котором вы находитесь. Пример: если сценарий = 1, затем вызовите (например, ваша процедура для случая A + B)
Elseif Scenario = 2, затем Call (ваша процедура только для случая A и т. д.). Я настоятельно рекомендую избегать процедур GoTo, которые, на мой взгляд, не очень эффективны.
GoTo
легко приводит к спагетти-коду, и, как вы заметили, его, как правило, следует избегать. Кроме того, похоже, что вы могли бы преобразовать это в несколько подпрограмм.