Иван Сагалаев

9.02.10 17:58

Проектирование, Django

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

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

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

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

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

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

  1. GiNeR

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

  2. vorushin

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

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

  3. Loki

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

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

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

    if ($obj->no_errors)...
    

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

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

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

  5. Иван Сагалаев

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

  6. Loki

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

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

  7. Дима

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

  8. Иван Сагалаев

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

  9. ziro-on-ya

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

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

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

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