Найти - Пользователи
Полная версия: Антипаттерны
Начало » Флейм » Антипаттерны
1 2
Ferroman
О, интересно. Надо будет поковыряться.
И да, злоупотреблять значениями по умолчанию не стоит - я заметил, что могут появится неочевидные проблемы. Теперь использую только тогда, когда значение по умолчанию необходимо.

Но больше проблем у меня, из-за неумения писать тесты к программе :(
Я скорее не совсем понимаю подход, и как результат, не пишу их. В том виде, в котором я себе представляю их использование, мне они не кажутся сильно удобными или полезными.
crchemist
Ferroman
Я скорее не совсем понимаю подход, и как результат, не пишу их.
http://www.google.com.ua/search?hl=uk&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=aLB&q=%D0%9C%D0%B0%D0%B9%D0%B5%D1%80%D1%81+%D0%93.%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE+%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC&btnG=%D0%9F%D0%BE%D1%88%D1%83%D0%BA&meta=

прекрасна книжка на 200 сторінок. вчить як тестувати програми. дуже зрозуміло написана без всяких розумних слів.
j2a
Ferroman
Но больше проблем у меня, из-за неумения писать тесты к программе :(
Я скорее не совсем понимаю подход, и как результат, не пишу их. В том виде, в котором я себе представляю их использование, мне они не кажутся сильно удобными или полезными.
Свяжись со мной, попытаюсь привести примеры (у меня гталк часто онлайн). Если есть конкретные вопросы, то лучше в форуме.
Ferroman
crchemist
Дякую, почитаю.
j2a
Спасибо! Не люблю мучать людей абстрактными вопросами о вещах прикладного характера :) Сформулирую вопросы конкретнее, напишу на форуме - другим тоже будет что почитать, а может и сказать :)
ZAN
j2a
ну положим, там где ошибка значений – в тему ValueError/TypeError. AssertionError в этом случае не в кассу.
Соврешенно верно - архитектура приложения вполне может быть такой, что ValueError и AssertionError, что называется, “две большие разницы”
Идея заменить raise ValueError основывалась на предположение, что исключение выбрасывается чтобы заменить неочевидное исключение, которое неизбежно будет выброшенно в ходе дальнейшего выполнения программы (таким куском кода, как re.compile(None), например).
То есть, фактически, эта проверка делается для отладки (для этого assert и нужен), а по ее окончании необходимость проверки должна отпасть, в силу того, что отлаженный код никогда не допустит значения None для паттерна (да-да, выброс исключения - форс-мажор, в большинстве случаев после такой ситуации нужно только залогировать ошибку и прекратить выполнение программы либо в целом, либо упавшей ее части), но к этому мы еще вернемся.
Итак, вместо чуда инженерной мысли
def doQueryString(self,pattern=None):
if (self.CheckPolis(pattern)==False)or(pattern==None):
raise ValueError("I need not null object 'polis' !")
У нас появляется (как правильно заметил j2a, обязательно с пояснением!)
assert pattern, 'Pattern had to be a non-empty string, got %s instead' %pattern
или, в случае, если пустая строка в качестве шаблона все-таки разрешена
assert isinstance(pattern, basestring), 'Pattern had to be a string, got %s instead' %pattern
или какая-нибудь еще заковыристая проверка, если в ней есть необходимость.

Теперь assert, в случае, если что-то пойдет не так, добросовестно разъяснит, в чем же возникла проблема. Но! здесь всплывает главное отличие assert от raise AssertError - assert сработает, только если переменная __debug__ == True. Т.е. сработает в стандартном режиме запуска интерпретатора, но ни в случае, если питон запущен с оптимизацией!
В этом-то и проявляется сокральная отладочная сущность ассертов. Отсюда и их область применимости - их назначение только перехватить ошибку и вывести ее в более понятом представлении.
В принципе, ситуация схожа с warnings, когда превращая их в обычные исключения, можно сильно ускорить процесс разработки в отладочном режиме.
Ferroman
ZAN
Отличное пояснение, спасибо, интересно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB