处理代码或模板中的未定义值?

时间:2010-05-24 04:40:25

标签: language-agnostic undefined

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

class Comment:
    user = ...
    # other stuff

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

class User:
    name = ...
    # other stuff

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

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

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

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

在编写这些系统的人们中,有哪些(或其他解决方案)是最好的?如果我走另一条路,我应该注意哪些陷阱?任何给出最佳解释的人都会获得勾选标记。

3 个答案:

答案 0 :(得分:1)

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

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

此外,数据模型应该与输出端无关。如果您想测试用户是否有姓名,您会在其余代码中做什么?每次检查== 'Anonymous'

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

答案 1 :(得分:1)

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

所以在你的情况下,制作一个基本值的默认指针听起来就像是最好的解决方案。

答案 2 :(得分:0)

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

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