2010-05-24 91 views
3

我正在编写一个web应用程序(在Python中,并不重要)。其中一个特点是人们可以对事情发表评论。我有意见的一类,基本上像这样:处理代码中或模板中的未定义值?

class Comment: 
    user = ... 
    # other stuff 

其中user是另一个类的实例,

class User: 
    name = ... 
    # other stuff 

当然,在我的模板,而且,我有

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

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

  • 在模板中使用条件来测试该情况并显示不同的内容。这是最通用的解决方案,因为我可以改变匿名评论的显示方式,比如“匿名发布”(而不是“发布者...”),但我经常被告知模板应该是无意识的显示机器,不包括这样的逻辑。另外,其他人可能会为同一个应用程序编写替代模板,我觉得我应该为模板编写者尽可能简化事情。
  • 实现针对Comment当真正的用户是未定义的,返回一个虚设用户对象的属性user存取方法。这个虚拟对象将有user.name = 'Anonymous'或类似的东西,所以模板可以访问它并打印它的名称没有错误。
  • 把一个实际的记录对应于用户与user.name = Anonymous(或类似的东西)我的数据库中,并指派该用户发布任何评论,当没有人在真实记录下来。我知道我已经看到了运行一些真实世界的系统这条路。 (phpBB?)

在写这些类型的系统的人中,是否有普遍的看法:哪些(或某种其他解决方案)最好?如果我以一种方式与另一种方式相比,我应该留意哪些缺陷?谁给出最好的解释会得到复选标记。

回答

1

我与第一个选项去,在模板中使用if开关。

考虑本地化的情况:您可能会为每种语言使用不同的模板。您可以轻松地将模板本身的“匿名”情况本地化。

此外,数据模型应该什么都没有做与输出端。如果你想测试用户是否有名字,你会在代码的其余部分做什么?每次检查== 'Anonymous'

模板确实应该只与输出数据关注,但是,这并不意味着它必须单独输出语句组成。您通常在模板中有某种if user is logged in, display "Logout", otherwise display "Register" and "Login"大小写。几乎不可能避免这些。

+0

本地化的好处,我没想到 – 2010-05-25 02:02:16

1

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

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

0

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

因为数据库完整性原因,我不是None的粉丝。