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


75

我刚刚读了一篇博客文章,用银行类比解释了MVC。我在使用MVC框架(CakePHP)进行Web应用程序开发方面有几个月的经验,因此我掌握了基础知识,但是我开始看到一个主题,使我认为我对方法的位置采用了错误的方法:

  • 胖模型,瘦控制器
  • 在模型中保留尽可能多的业务逻辑

在我的应用中,模型是厌食症,控制者肥胖。我在控制器中拥有所有业务逻辑,除了模型中的关联和验证规则之外,一无所有。

通过控制器的扫描,我现在可以确定模型中应该包含的许多逻辑:

  • 该应用程序具有包含项目的列表,并且可以对项目进行排名。将列表排序的排序逻辑在控制器中。
  • 同样,项目(项目模型)也具有图像(图像模型)。每个项目可能都有一个默认图像(在项目表中由image_id指定)。当显示带有图像的项目时,默认图像应首先出现。我有在控制器中执行此操作的逻辑。
  • 显示列表时,相关列表将显示在边栏中。确定哪些列表相关的逻辑在控制器中。

现在我的问题是:

  1. 通过上面给出的示例,我是否在正确的道路上认为这些是当前属于模型的控制器中的逻辑实例?
  2. Web应用程序应将其他逻辑领域的哪些内容纳入模型中?
  3. 我敢肯定,确定这个问题并改变我的设计模式是成功的一半,但是即使我决定采用我在上面给出的那些例子,并尝试将逻辑转移到模型中,我也不知道从哪里开始。任何人都可以通过在此处发布一些代码或链接到一些好的学习资源来为我指明正确的方向吗?CakePHP特定的帮助将非常有用,但是我相信任何MVC都可以满足要求。

之前听说过这一切:)
MeTitus

Answers:


55

给您“正确”的答案有点困难,因为其中一些涉及框架的细节(不管您使用的是什么)。

至少在CakePHP方面:

  1. 任何涉及数据或数据处理的内容都应该在模型中。用CakePHP来说,简单的find()方法怎么样?...如果有可能它会做“特殊的”事情(即,调用一组特定的“条件”),而您可能需要在其他地方做这件事,那么这是包装模型方法的一个很好的借口。

  2. 不幸的是,从来没有一个简单的答案,并且代码的重构是一个自然的过程。有时,您只是醒了一下:“通心粉……应该在模型中!” (嗯,也许你不这样做,但是我有:))


5
博客作者写获奖答案FTW!
Xeoncross

19

我至少使用以下两个“测试”来检查我的逻辑是否正确:

1)如果我编写一个单元测试,很容易只创建一个“真实”对象来进行测试(即您在生产中使用的对象),并且除了可能包含一些有价值的对象之外,不包括其他很多对象。同时需要一个实际的模型对象和一个实际的控制器对象来进行测试可能是您需要移动功能的信号。

2)问自己一个问题:如果我添加了使用这些类的另一种方法,我是否需要以几乎复制粘贴的方式复制功能?...这也可能是转移该功能的一个很好的理由。

也很有趣:http : //www.martinfowler.com/bliki/AnemicDomainModel.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.