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