3

我正在编写一个 Web 应用程序(在 Python 中,这并不重要)。功能之一是人们可以对事物发表评论。我有一个评论课,基本上是这样的:

class Comment:
    user = ...
    # other stuff

user另一个类的实例在哪里,

class User:
    name = ...
    # other stuff

当然,在我的模板中,我有

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

问题:假设我允许人们匿名发表评论。在那种情况下comment.userNone(未定义),当然访问comment.user.name会引发错误。处理它的最佳方法是什么?我看到了三种可能性:

  • 在模板中使用条件来测试这种情况并显示不同的内容。这是最通用的解决方案,因为我可以将匿名评论的显示方式更改为,例如“匿名发布”(而不是“发布者...”),但我经常被告知模板应该是无意识的显示机器而不包括这样的逻辑。此外,其他人可能最终会为同一个应用程序编写替代模板,我觉得我应该让模板编写者的事情尽可能简单。
  • user当真实用户未定义时,为 a 的属性实现一个访问器方法,该方法Comment返回一个虚拟用户对象。这个虚拟对象将具有user.name = 'Anonymous'或类似的东西,因此模板可以访问它并打印其名称而不会出错。
  • 在我的数据库中放入与用户user.name = Anonymous(或类似用户)相对应的实际记录,然后将该用户分配给没有人登录时发布的任何评论。我知道我见过一些以这种方式运行的真实系统。(phpBB?)

在编写这类系统的人中,是否存在一种普遍的智慧,即哪些(或其他解决方案)是最好的?如果我选择一种方式与另一种方式,我应该注意什么陷阱?谁给出了最好的解释,谁就会得到复选标记。

4

3 回答 3

1

我会选择第一个选项,使用if模板中的开关。

考虑本地化的情况:您可能对每种语言都有不同的模板。您可以轻松地在模板本身中本地化“匿名”案例。

此外,数据模型应该与输出端无关。如果你想测试一个用户是否有名字,你会在剩下的代码中做什么?== 'Anonymous'每次检查?

模板确实应该只关注输出数据,但这并不意味着它必须仅包含输出语句。if user is logged in, display "Logout", otherwise display "Register" and "Login"您通常在模板中有某种案例。避免这些几乎是不可能的。

于 2010-05-24T05:08:17.240 回答
1

就个人而言,我喜欢干净的代码,并且同意模板不应该有主要的逻辑。因此,在我的实现中,我确保所有值都具有“安全”默认值,通常是空白字符串、指向基类的指针或等价物。这允许对代码进行两项重大改进,首先您不必经常测试空值或缺失值,并且您可以在显示模板中输出默认值而无需太多逻辑。

因此,在您的情况下,将默认指针设为基值听起来是最好的解决方案。

于 2010-05-24T05:21:54.390 回答
0

您的第三个选项:创建一个User代表匿名用户的常规实体。

None出于数据库完整性的原因,我不喜欢。

于 2010-05-24T05:49:44.483 回答