【发布时间】:2013-09-19 08:58:13
【问题描述】:
编辑:
我添加了 [MVC] 和 [design-patterns] 标签来扩大这个问题的受众,因为它更像是一个通用编程问题,而不是与 Python 或 SQLalchemy 直接相关的问题。它适用于所有具有业务逻辑和 ORM 的应用程序。
基本问题是将业务逻辑保留在单独的模块中,还是将其添加到我们的 ORM 提供的类中更好:
我们有一个烧瓶/sqlalchemy 项目,我们必须为它设置一个结构来工作。关于如何设置有两种有效的意见,在项目真正开始之前,我们想下定决心在其中一个上。
如果你们中的任何人能给我们一些见解,说明两者中哪一个更有意义,为什么,以及优点/缺点是什么,将不胜感激。
我的示例是需要批量发送和/或显示给单个用户的 HTML 信件。这封信可以包含显示发票和/或收件人的用户的文章列表的部分。
方法一:
将代码分成 3 层 - 第 1 层:Web 界面,第 2 层:处理字母,第 3 层:来自 ORM (sqlalchemy) 的模型。
该网站将在第二层的一个类中调用服务器端方法,第二层将遍历需要获取此信函的用户,并且它将具有生成 HTML 并替换信函中的一些通用字段的内部方法,当前用户的信息。它还具有生成发票或要放在信中的文章列表的内部方法。
在这个方法中,第 3 层仅用于从数据库中获取数据,可能还有一些与数据库相关的逻辑,例如从用户的名字和姓氏生成全名。第二层执行大部分工作。
方法二: 将代码拆分为相同的三层,但仅通过第二层中的用户集合执行循环。
生成 HTML、发票和文章列表的方法都作为方法添加到 ORM 提供的第 3 层中的模型定义中。第二层执行循环,但实际功能包含在第三层的模型类中。
我们得出的结论是,这两种方法都行得通,并且各有利弊:
方法一:
- 将业务逻辑与数据库访问完全分离
- 防止导入 ORM 模型同时导入许多我们可能不需要的方法/功能,同时使模型类的代码更紧凑。
- 在模拟 ORM 模型进行测试时可能更易于使用
方法二:
- 似乎符合 Django 在 Python 中做事的方式
- 允许对方法的简单访问:当模型实例存在时,它的任何函数 perform 可以立即被调用。 (在我的例子中:当我有一个可用的字母实例时,我可以直接在其上调用一个方法来生成该字母的 HTML)
- 您可以传递实例,手头有所有适当的方法。
【问题讨论】:
标签: python design-patterns model-view-controller orm sqlalchemy