django:胖模型和瘦控制器?

Posted

技术标签:

【中文标题】django:胖模型和瘦控制器?【英文标题】:django: Fat models and skinny controllers? 【发布时间】:2012-01-25 07:16:35 【问题描述】:

这是一个通用的架构问题。我在很多地方读到,在 MVC 框架中,(1) 模型应该是胖的,而控制器应该是瘦的。但我也读到(2)细节取决于你正在开发的框架。那么,如果你在 django 中开发呢?

我使用 django 的经验是,很多逻辑最终都会被放入视图和表单中。不是“业务逻辑”,而是处理请求、会话等的细节。就代码行数而言,这些细节往往超过操作模型对象的业务逻辑。我做错了什么,或者这就是 django 的工作方式?

【问题讨论】:

【参考方案1】:

MVC 不是一个通用的解决方案,而且大多数时候它都做错了,无法兑现承诺:实际上修改模型也需要修改控制器,因为它做错了。如果你真的想要模型和控制器之间的松散耦合 - 人们通常会忽略这一点 - 你必须使用service pattern (open as image)。几乎没有人真正做到这一点。

Django 没有在 php 世界中盲目地遵循 MVC 大惊小怪/伪模式,而是采用了pragmatic approach。因为在软件开发的共同现实中,开发者编写的东西是让用户看到的。然后用户(你的老板、客户、客户......)将“看到”你的工作,并最终给出他希望如何“看到”它的意见。通过使用 Django,开发人员可以采用更“面向视图”的开发模式并猜测是什么:它使截止日期更容易遵守,用户更满意。如果你仔细想想,它有其“nosql-ish”的想法,即视图(一般视图,而不是 django 视图)应该是幕后发生的事情的老板。

我要感谢 Django 没有做错 MVC,这与 99% 的 PHP MVC 实现不同。

另一方面,Django 是唯一允许在应用程序之间进行适当隔离的框架。每个应用程序可以有:

型号 观看次数 模板 网址 静态文件 测试 表格 可选插件(管理员、ajax 选择过滤器、django-authority 权限、django-notifications 通知等)

因此,即使您的模型/视图/模板将被捆绑,您的项目也可以相关地划分为小型(也称为:易于维护)和松散耦合的应用程序。只有相关模型/视图/模板/东西被捆绑在一起。在 Django 中,你不想要一个带有大视图和 url 脚本的大模型脚本。例如,你不希望ArticleFootballMatch 这样的两个模型类生活在一起,你想制作一个“文章”/“博客”应用程序和一个可以独立生活的“运动”应用程序。当然有时它们必须绑定,在这种情况下,在 90% 的情况下在项目级别是可行的(如果你碰巧需要绑定模型或模板标签,你会制作另一个应用程序,“blog_sport”)。

例如,在 Model 类中定义 get_absolute_url() 方法是一种超级常见的做法。是的,理论上必须只包含业务逻辑的模型类现在与您的 urls 定义相关联。这在实践中有多糟糕?!好吧,实际上它很棒,因为添加此方法需要两秒钟,然后您可以在使用模型的任何地方使用它:无论是在视图中还是在模板中。此外,其他应用程序(例如django.contrib.admin)也会使用它。

另一个稍微复杂的 Django 辉煌示例是查询是惰性求值的。这意味着,您的视图函数/类将定义一个类似blog_list = Blog.objects.all() 的查询,但如果它调用类似% for blog in blog_list % 的查询实际上将在模板中执行。因此,在这种情况下,业务逻辑发生在模板中,如果在呈现模板之前出现故障:您保存了一个查询。但这还不是全部,如果您的模板仅显示计数 blog_list.count ,则 select 查询将不会产生,只会执行计数查询。 “一般视图”决定需要什么业务逻辑。这与 MVC 的承诺相去甚远,但老实说:这有多实用?

我的观点是,您可以错误地应用理论,正确地应用(这会减少您选择喜欢 5 个包含所有语言的 web 框架),或者只是以优雅和立即以禅宗方式完成工作的实用方法:这是 Django 的选择。

【讨论】:

【参考方案2】:

这取决于您的应用程序的用途,但 Django 的美妙之处在于它不会强制您将逻辑​​代码放入视图或模型中,这是您的选择。

如果您认为某些逻辑与您的模型密切相关,那么您可以为其创建一个方法。规则(对我而言)是您的模型应该与环境无关(网络应用程序、运行管理命令的 Crontab 等)。

我的政策是尽量在我的模型中做到最低限度。

顺便说一句,你不打算在你的模型中处理requestsessions,不是吗? 是个坏主意。

【讨论】:

【参考方案3】:

我对 Django 最大的问题是它们似乎通过添加 Forms 层打破了 MVC 模式。大多数文档都要求您将验证逻辑放在表单中,而模型验证器仅由 form 调用这一事实只会加强这种约定。但在我看来,这是一个不好的约定,因为毕竟,验证的往往是要转换为模型的数据。

如果您考虑将传统的 Django 项目转换为使用 Django Rest Framework 和仅使用此 API 的单独前端客户端的以 API 为中心的项目,那么最好的例子就是。您不仅要保持模型完整并保留大量业务逻辑,还必须遍历表单并将所有逻辑移至序列化程序(不幸的是,Django Rest Framework 还遵循 Django 的破坏 MVC 模式并添加了一个额外的“序列化程序”层)。

我认为胖模型方法是要走的路。更多关于如何在 Django 中实现的信息here。

【讨论】:

我认为 Django 并没有破坏 MVC 模式,因为原则上 Django 并不遵循 MVC 模式。

以上是关于django:胖模型和瘦控制器?的主要内容,如果未能解决你的问题,请参考以下文章

[转]关于胖客户端和瘦客户端的理解

H3C胖AP和瘦AP互刷方法

胖模型、瘦控制器和 MVC 设计模式

胖模型/瘦控制器与服务层[关闭]

WLAN无线局域网技术基础无线侧组网概念,2.4GHz频段与5GHz频段区别和优缺点,胖AP架构和瘦AP架构的优缺点

Android应用程序如何使用Internet资源?