我正在编写一个Web应用程序(在Python中,并不重要)。其中一个功能是人们可以对事物发表评论。我有一个评论课,基本上是这样的:
class Comment:
user = ...
# other stuff
其中user
是另一个类的实例,
class User:
name = ...
# other stuff
当然,在我的模板中,我有
<div>${comment.user.name}</div>
问题:假设我允许人们匿名发表评论。在这种情况下,comment.user
为None
(未定义),当然访问comment.user.name
会引发错误。处理这个问题的最佳方法是什么?我看到三种可能性:
user
的{{1}}属性实现一个访问器方法,该方法在未定义真实用户时返回虚拟用户对象。这个虚拟对象将具有Comment
或类似的东西,因此模板可以访问它并打印其名称而没有错误。user.name = 'Anonymous'
(或类似内容)的用户对应,并将该用户分配给任何人登录时发布的任何评论。我知道我已经看到了一些真实的以这种方式运作的世界系统。 (phpBB的?)在编写这些系统的人们中,有哪些(或其他解决方案)是最好的?如果我走另一条路,我应该注意哪些陷阱?任何给出最佳解释的人都会获得勾选标记。
答案 0 :(得分:1)
我会使用第一个选项,在模板中使用if
开关。
考虑本地化的情况:您可能会为每种语言使用不同的模板。您可以轻松地在模板中本地化“匿名”案例。
此外,数据模型应该与输出端无关。如果您想测试用户是否有姓名,您会在其余代码中做什么?每次检查== 'Anonymous'
?
模板确实应该只关注输出数据,但这并不意味着它必须仅由输出语句组成。您通常在模板中有某种if user is logged in, display "Logout", otherwise display "Register" and "Login"
个案例。几乎不可能避免这些。
答案 1 :(得分:1)
就个人而言,我喜欢干净的代码,并同意模板不应该有重要的逻辑。所以在我的实现中,我确保所有值都具有“安全”默认值,通常是空字符串,指向基类或等效的指针。这允许对代码进行两项重大改进,首先您不必经常测试空值或缺失值,并且您可以在显示模板中输出默认值而不需要太多逻辑。
所以在你的情况下,制作一个基本值的默认指针听起来就像是最好的解决方案。
答案 2 :(得分:0)
您的第3个选项:创建代表匿名用户的常规User
实体。
出于数据库完整性原因,我不是None
的粉丝。