我应该在哪里放置输出字段描述,控制器或模型?

时间:2012-01-13 16:17:06

标签: python model-view-controller

我注意到我的几个控制器位于顶部。他们往往看起来像这样:

def app_description(app):
    """ Dictionary describing an app. """
    return {'name': app.app,
            'id': app.id,
            'is_new': app.is_new(),
            'created_on': app.created_on.strftime("%m/%d/%Y"),
            'configured': app.configured }

我将在控制器中通过几个不同的操作来调用它,但通常不在控制器之外。它访问属性。它调用方法。它格式化不透明对象(如日期)。

我的问题是:这是控制器代码还是型号代码?

控制器的情况:

  • 它定义了我的API。
  • 目前仅用于该模块。
  • 这里似乎没有任何逻辑。

模型的案例:

  • 这似乎是数据的描述,模型应该负责。
  • 感觉我可能想在其他控制器中使用它。尚未到达那里,但这些功能仍然很新,所以他们可能。
  • 将函数附加到它明显属于的对象似乎比将其作为模块级函数更好。
  • 可以在模型上更简洁地定义。像顶级模型对象定义.description()的东西,子类只定义属性的黑/白名单,并覆盖方法本身来调用函数。我很确定代码行数会减少(因为它可以节省重复'name': app.name之类的内容),这似乎是一件好事。

2 个答案:

答案 0 :(得分:0)

不确定您使用的是哪个框架,但我建议在自己的类中创建此帮助程序功能并将其放在lib /

之类的共享文件夹中

或者,您可以拥有一个应用程序帮助程序模块,它只包含许多这些有用的应用程序范围的函数。

无论哪种方式,我都会远离模型和控制器。

答案 1 :(得分:0)

我最终决定的答案:

在短期内,控制器中使用这些方法很好。如果他们定义输出,那么,好吧,他们可以留在那里。它们仅用于模型中。

有几件值得注意的事情,这表明他们已经长大,需要去其他地方:

  • 在一种情况下,我需要访问对象的规范序列化。此时,它作为模型方法进入模型。
  • 在另一个案例中,我发现我正在格式化所有时间戳。我有一个标准的@ajaxify装饰器,可以执行诸如设置Content-Type标头,进行JSON编码等操作。在这种情况下,我将日期时间标准格式转移到那里 - 当JSON编码器到达日期时间时(以前不可序列化的,它总是对待它(自纪元以来的几秒钟,对我而言)。
  • 在第三种情况下,我意识到我在几个控制器中重复使用此功能。为此,我将其拉出到一个公共类(如建议的另一个答案)并用它来定义我的“Web API”。之前我曾使用过这种模式 - 将类似使用的数据(如时间序列数据或前N个列表)分组是有意义的。

我怀疑还有更多,但基本上,我认为没有像我原先认为的那样相似。我现在很高兴将它们视为我们(小型,新型)代码库中简单对象的约定,并且理解经过几次迭代后,可能会出现更好的解决方案。与此同时,他们留在控制器中并定义我的AJAXy-JSON专用接口。