"Правильный" стиль кодирования...

fedotxxl

Well-known member
09.11.2005
614
0
#1
Часто ли вы используете Exit sub? и правильно ли это?
Как бы вы поступили:
Код:
if nd is nothing then Exit Sub
или же
Код:
if not nd is nothing then...
?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
271
#3
ну вот конкретно в такой ситуевине - яб подумал об: Error CUSTOM_ERRCODE, CUSTOM_DESCRIPTION
тока On Error Goto 0 (возвратил бы обработчик)
все-таки nothing объекта это не совсем "штатно" :rolleyes:
а снаружи обработка

почему так - автоматом выйдет из ф-ции/процедуры (и не нужно знать - что это конкретно) и позволит вызывающему коду решить

0, null, Nothing, местами "" - это дефолтные инициализаторы и совпадение с ними может служить сигналом о нештатном поведении
 

Omh

Lotus team
04.07.2007
2 210
1
#5
На мой взгляд, множественные выходы из программы это нормально.
Особенно в начале процедуры при разлчиных проверках.
Потому что многоступенчатые if слабо читаемы.

Применительно к этому случаю, imho, вполне нормально выйти при несужествовании обьекта документа.
Я так частенько на QueryOpen формы пишу, ибо при открытии нового документа doc будет Nothing, а уже сущестующего - Thing :rolleyes:
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#6
все зависит от того, что мы хотим получить в каждом конкретном случае...
в любом случае, выход из процедуры не является "плохим" вариантом,
плохо будет работать потом, после исполнения процедуры...
объясню, процедуры могут быть определяющими дальнейшую обработку, либо не определяющими (это не стандарт, просто так назвал), т.е. если после исполнения процедуры нам важно работать с каким-либо результатом ее действий, то процедура должна быть определяющей.
для определяющих процедур лучше использовать функции, т.к. их результат легче обработать, но можно использовать процедуры, которые возвращают результат как параметр.
если процедура не определяющая, то свободно можно использовать выход из процедуры, в крайнем случае, нам потребуется дополнительное оповещение пользователя о неудачном выполнении процедуры:
Код:
if badCondition then
Messagebox "Bad condition"
exit sub
end if
если процедура определяющая, то придется добавить какой-то результат ее работы:
Код:
if badCondition then
error 1000, "Bad condition"
end if
Код:
if badCondition then
result = errCode
exit sub
end if
я бы рекомендовал все процедуры писать как определяющие, в таком случае это не приведет к необходимости ее исправления при надобности, а затраты почти нулевые, т.к. в любом случае в процедуры добавляются обработчики ошибок, а в обработчике это все дело легко реализуется... если вы не используете обработчики, я рекомендую начать :)
единственное, что иногда труднее определить как именно отображать ошибку наверх, т.е. тут два варианта:
1) сгенерировать исключение и передать его в вызывающую процедуру, которая в свою очередь должна будет обработать его;
2) просто вернуть флаг исключение, например result = false, а вызывающая процедура смотрит
Код:
if mysub() then
дальнейшая работа
else
обработка неудачной ситуации
end if