gpt4 book ai didi

model-view-controller - 胖模型和瘦 Controller 听起来就像创造上帝模型

转载 作者:行者123 更新时间:2023-12-03 05:04:30 26 4
gpt4 key购买 nike

我读过很多提倡胖模型和瘦 Controller 方法的博客,尤其是。 Rails 阵营。因此,路由器基本上只是确定在哪个 Controller 上调用哪个方法,而所有 Controller 方法所做的就是调用模型上的相应方法,然后调出 View 。所以我这里有两个我不明白的问题:

  1. Controller 和路由器除了根据路由调用类似上帝的模型上的方法之外,实际上并没有执行太多不同的任务。
  2. 模特做得太多了。发送电子邮件、创建关系、删除和修改其他模型、排队任务等。基本上现在您拥有类似上帝的对象,它们应该执行可能或可能不涉及建模和处理数据的所有操作。

你在哪里划清界限?这不就是陷入神纹了吗?

最佳答案

It might not be the best idea to look at Rails as a staple of MVC design pattern. Said framework was made with some inherent shortcomings (I kinda elaborated on it in a different post) and the community only just now has begun addressing the fallout. You could look at DataMapper2 development as the first major step.

一些理论

提出该建议的人似乎受到了一个相当常见的误解的困扰。因此,让我首先澄清一下:在现代 MVC 设计模式中,模型不是类或对象。模型是一个层。

MVC模式背后的核心思想是Separation of Concerns其中第一步是表示层和模型层的划分。就像表示层分解为 Controller (实例,负责处理用户输入)、 View (实例,负责 UI 逻辑)和模板/布局一样,模型层也是如此。

模型层的主要部分包括:

  • Domain Objects

    也称为域实体、业务对象或模型对象(我不喜欢后一个名称,因为它只会增加困惑)。这些结构就是人们通常错误地称为“模型”的东西。他们负责包含业务规则(特定领域逻辑单元的所有数学和验证)。

  • 存储抽象:

    通常使用data mapper来实现模式(不要与 ORMs 混淆,它们滥用了这个名称)。这些实例通常负责从域对象中存储信息和检索信息。每个域对象可以有多个映射器,就像有多种存储形式(DB、缓存、 session 、cookies、/dev/null)一样。

  • 服务:

    负责应用程序逻辑的结构(即域对象之间的交互以及域对象与存储抽象之间的交互)。它们应该像“接口(interface)”一样,表示层通过它与模型层进行交互。这通常是类似 Rails 的代码最终出现在 Controller 中的内容。

这些组之间的空间中还可能存在多个结构:DAOs , units of workrepositories .

Oh ... and when we talk (in context of web) about a user that interacts with MVC application, it is not a human being. The "user" is actually your web browser.

那么神呢?

Controller 应该与服务交互,而不是使用一些可怕的单一模型。您将用户输入的数据传递到特定服务(例如 MailServiceRecognitionService)。通过这种方式, Controller 改变了模型层的状态,但它是通过使用清晰的 API 来完成的,并且不会弄乱内部结构(这会导致抽象泄漏)。

此类更改可能会引起一些立即 react ,或仅影响 View 实例从模型层请求的数据,或两者兼而有之。

每个服务都可以与任意数量(尽管通常只有少数)的域对象和存储抽象进行交互。例如,RecogitionService 不太关心文章的存储抽象。

结束语

通过这种方式,您可以获得一个可以在任何级别进行单元测试、低耦合(如果正确实现)并且具有清晰易懂的架构的应用程序。

不过,请记住:MVC 并不适合小型应用程序。如果您使用 MVC 模式编写留言簿页面,那么您就做错了。此模式旨在在大规模应用程序中执行法律和秩序

For people who are using PHP as primary language, this post might be relevant. It's a bit longer description of the model layer with a few snippets of code.

关于model-view-controller - 胖模型和瘦 Controller 听起来就像创造上帝模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com