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

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

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

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

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

Комментарии: 10 (feed)

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

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

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

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

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

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

    if ($obj->no_errors)...
    

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

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

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

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

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

  7. Дима

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

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

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

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

  10. VolCh

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

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

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

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

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

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

Текст через пустую строку превращается в отдельные абзацы, цитата отделяется символами > слева, список состоит из пунктов с дефисом слева, курсив выделяется * с каждой стороны, жирный - двойными **, блоки кода отступают слева на 4 пробела