代码之家  ›  专栏  ›  技术社区  ›  David Z

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

  •  3
  • David Z  · 技术社区  · 14 年前

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

    class Comment:
        user = ...
        # other stuff
    

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

    class User:
        name = ...
        # other stuff
    

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

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

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

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

    在写这些系统的人中,是否有一种普遍的智慧,关于这些系统(或其他解决方案)中哪一个是最好的?如果我走一条路还是另一条路,我应该注意什么陷阱?谁解释得最好,谁就得打勾。

    3 回复  |  直到 14 年前
        1
  •  1
  •   deceze    14 年前

    我会选择第一个选项,使用 if 切换模板。

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

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

    实际上,模板应该只关注输出数据,但这并不意味着它必须只包含输出语句。你通常有一些 if user is logged in, display "Logout", otherwise display "Register" and "Login" 模板中的大小写。要避免这些几乎是不可能的。

        2
  •  1
  •   LarryN    14 年前

    就个人而言,我喜欢干净的代码,并且同意模板不应该有主要的逻辑。所以在我的实现中,我要确保所有值都有“安全”的默认值,通常是一个空字符串、指向基类的指针或等效值。这使得代码有两个主要的改进,第一,您不必经常测试空值或丢失值,并且您可以输出默认值,而不必在显示模板中使用太多逻辑。

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

        3
  •  0
  •   Tony the Pony    14 年前

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

    我不喜欢 None 因为数据库完整性的原因。