По наводке Романа Ворушина почитал пост Дика Липтона о том, что в проектировании систем должны закладываться безопасные умолчания. И мне вспомнилась похожая штука из истории Джанго.

Когда-то давно у модели пользователя был метод is_anonymous(), который предполагалось проверять в шаблонах для определения, что показывать незалогиненному пользователю:

{% if user.is_anonymous %} Login... {% else %} Hi, {{ user }} {% endif %}

А потом Гэри Вилсон справедливо заметил, что это может быть не очень безопасно: если в шаблоне не будет переменной user или человек ошибётся в написании user.is_anonymous, то по умолчанию отработает та часть шаблона, которая показывается залогиненному юзеру.

И с тех пор у юзера вместо is_anonymous появился обратный метод — is_authenticated, условие поменялось на обратное, и теперь в случае ошибок шаблон не вываливает всем подряд залогиновую информацию.

Комментарии: 10

  1. GiNeR

    А ещё есть опасные умолчания. Это когда ты полагаешься на действие по-умолчанию, не переопределяя его, а разработчики фреймворка/библиотеки и т.д. изменяют это действие/поведение на новое.

  2. vorushin

    Еще пример навскидку - разрешительная система прав Unix (вместо запретительной, где по умолчанию все разрешено).

    Дик Липтон привел очень удачные яркие примеры с поездами и лифтом - больше шансов помнить об этом принципе при проектировании систем.

  3. Loki

    Я на подобные грабли наступил довольно быстро после начала разработки. Было

    if (!$obj->is_error)...
    

    И после первой же опечатки я огреб труднодиагностируемый глюк. После этого сделал

    if ($obj->no_errors)...
    

    и стараюсь этот урок всегда держать в голове

  4. Александр Соловьёв

    Во-во, и в джанге есть подобное западло - form.is_valid(). Стоит забыть скобки, и иф проходит удачно. :(

  5. Ivan Sagalaev

    Кстати, да... Жаль, теперь просто не поменяешь из-за обратной совместимости.

  6. Loki

    Жаль, теперь просто не поменяешь из-за обратной совместимости.

    Но ведь никто не запрещает использовать оба варианта... просто "неправильный" будет deprecated

  7. Дима

    Не кажется ли вам, что это проблема плохих языков, которые не обругают вас, когда вы используете не определенный ранее метод или переменную? =)

  8. Ivan Sagalaev

    "Плохих языков"... Вы правда надеетесь на адекватный ответ на явный троллинг? "You must be new here..." ©

  9. ziro-on-ya

    Не кажется ли вам, что это проблема плохих языков, которые не обругают вас, когда вы используете не определенный ранее метод или переменную? =)

    Плохой язык тот - с которым лично Вам некомфортно. Все остальные языки хорошие =)

  10. VolCh

    Плохой язык тот - с которым лично Вам некомфортно. Все остальные языки хорошие =)

    Не безопасное умолчание :)

    Во-во, и в джанге есть подобное западло - form.is_valid(). Стоит забыть скобки, и иф проходит удачно. :(

    Потому лучше использовать отрицание с небезопасными: if not form.is_valid(): print "error" else: print "ok"

    Правда так нарушается единообразие с ловлей исключений :(

Добавить комментарий