Разобраться с неопределенными значениями в коде или в шаблоне? - PullRequest
3 голосов
/ 24 мая 2010

Я пишу веб-приложение (на Python это не так важно). Одной из особенностей является то, что люди могут оставлять комментарии к вещам. У меня есть класс для комментариев, в основном так:

class Comment:
    user = ...
    # other stuff

где user - это экземпляр другого класса,

class User:
    name = ...
    # other stuff

И, конечно, в моем шаблоне у меня есть

<div>${comment.user.name}</div>

Проблема: допустим, я разрешаю людям оставлять комментарии анонимно. В этом случае comment.user равен None (не определено), и, конечно, доступ к comment.user.name вызовет ошибку. Какой лучший способ справиться с этим? Я вижу три возможности:

  • Используйте условное выражение в шаблоне для проверки этого случая и отобразите что-то другое. Это наиболее универсальное решение, поскольку я могу изменить способ отображения анонимных комментариев, скажем, «Размещено анонимно» (вместо «Написано ...»), но мне часто говорили, что шаблоны должны отображаться бездумно машины и не включают в себя логику, как это. Кроме того, другие люди могли бы написать альтернативные шаблоны для того же приложения, и я чувствую, что должен максимально упростить процесс создания шаблонов.
  • Реализуйте метод доступа для свойства user Comment, которое возвращает фиктивный объект пользователя, когда реальный пользователь не определен. Этот фиктивный объект будет иметь user.name = 'Anonymous' или что-то подобное, и поэтому шаблон сможет получить к нему доступ и напечатать его имя без ошибок.
  • Поместите фактическую запись в мою базу данных, соответствующую пользователю с user.name = Anonymous (или что-то в этом роде), и просто назначьте этого пользователя любому комментарию, опубликованному, когда никто не вошел в систему. Я знаю, что видел некоторые реальные системы которые действуют таким образом. (PHPBB?)

Есть ли преобладающая мудрость среди людей, которые пишут такого рода системы, о том, какая из них (или какое-то другое решение) является лучшей? Любые подводные камни, которые я должен остерегаться, если я иду один путь против другого? Тот, кто дает лучшее объяснение, получает галочку.

Ответы [ 3 ]

1 голос
/ 24 мая 2010

Лично мне нравится чистый код, и я согласен, что шаблоны не должны иметь основную логику. Поэтому в моих реализациях я удостоверяюсь, что все значения имеют «безопасные» значения по умолчанию, обычно пустую строку, указатель на базовый класс или эквивалентный. Это позволяет сделать два основных улучшения кода: во-первых, вам не нужно постоянно проверять наличие нулевых или пропущенных значений, и вы можете выводить значения по умолчанию без слишком большой логики в шаблонах отображения.

Так что в вашей ситуации создание по умолчанию указателя на базовое значение звучит как лучшее решение.

1 голос
/ 24 мая 2010

Я бы выбрал первый вариант, используя переключатель if в шаблоне.

Рассмотрим случай локализации: у вас могут быть разные шаблоны для каждого языка. Вы можете легко локализовать «анонимный» случай в самом шаблоне.

Кроме того, модель данных не должна иметь ничего общего со стороной вывода. Что бы вы сделали в остальной части кода, если вы хотите проверить, есть ли у пользователя имя или нет? Проверять == 'Anonymous' каждый раз?

Шаблон действительно должен касаться только вывода данных, но это не значит, что он должен состоять исключительно из выходных операторов. У вас обычно есть какой-то if user is logged in, display "Logout", otherwise display "Register" and "Login" случай в шаблонах. Этого почти невозможно избежать.

0 голосов
/ 24 мая 2010

Ваш третий вариант: создайте обычный объект User, представляющий анонимного пользователя.

Я не фанат None по соображениям целостности базы данных.

...