По наводке Романа Ворушина почитал пост Дика Липтона о том, что в проектировании систем должны закладываться безопасные умолчания. И мне вспомнилась похожая штука из истории Джанго.
Когда-то давно у модели пользователя был метод is_anonymous()
, который предполагалось проверять в шаблонах для определения, что показывать незалогиненному пользователю:
{% if user.is_anonymous %} Login... {% else %} Hi, {{ user }} {% endif %}
А потом Гэри Вилсон справедливо заметил, что это может быть не очень безопасно: если в шаблоне не будет переменной user
или человек ошибётся в написании user.is_anonymous
, то по умолчанию отработает та часть шаблона, которая показывается залогиненному юзеру.
И с тех пор у юзера вместо is_anonymous
появился обратный метод — is_authenticated
, условие поменялось на обратное, и теперь в случае ошибок шаблон не вываливает всем подряд залогиновую информацию.
Комментарии: 10
А ещё есть опасные умолчания. Это когда ты полагаешься на действие по-умолчанию, не переопределяя его, а разработчики фреймворка/библиотеки и т.д. изменяют это действие/поведение на новое.
Еще пример навскидку - разрешительная система прав Unix (вместо запретительной, где по умолчанию все разрешено).
Дик Липтон привел очень удачные яркие примеры с поездами и лифтом - больше шансов помнить об этом принципе при проектировании систем.
Я на подобные грабли наступил довольно быстро после начала разработки. Было
И после первой же опечатки я огреб труднодиагностируемый глюк. После этого сделал
и стараюсь этот урок всегда держать в голове
Во-во, и в джанге есть подобное западло -
form.is_valid()
. Стоит забыть скобки, и иф проходит удачно. :(Кстати, да... Жаль, теперь просто не поменяешь из-за обратной совместимости.
Но ведь никто не запрещает использовать оба варианта... просто "неправильный" будет deprecated
Не кажется ли вам, что это проблема плохих языков, которые не обругают вас, когда вы используете не определенный ранее метод или переменную? =)
"Плохих языков"... Вы правда надеетесь на адекватный ответ на явный троллинг? "You must be new here..." ©
Плохой язык тот - с которым лично Вам некомфортно. Все остальные языки хорошие =)
Не безопасное умолчание :)
Потому лучше использовать отрицание с небезопасными: if not form.is_valid(): print "error" else: print "ok"
Правда так нарушается единообразие с ловлей исключений :(