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

76
我刚读了一篇博客文章,用银行类比解释了MVC。我有几个月使用MVC框架(CakePHP)进行Web应用程序开发的经验,所以我理解基本概念,但我开始看到一个主题,让我觉得我在处理我的逻辑时采取了有缺陷的方法:
  • 模型要肥,控制器要瘦
  • 尽可能将业务逻辑放在模型中

在我的应用程序中,模型很苗条,控制器很肥胖。我把所有业务逻辑都放在控制器中,除了关联和验证规则之外,模型里什么也没有。

浏览我的控制器,现在我可以确定很多逻辑应该放在模型中:

  • 应用程序有列表,其中包含项目,并且项目可以排名。将列表放入排名顺序的排序逻辑位于控制器中。
  • 同样,项目(Item 模型)也有图像(Image 模型)。每个项目可能有一个默认图像(在items表中由image_id指定)。当显示带有其图像的项目时,默认图像应首先出现。我在控制器中编写了此逻辑。
  • 显示列表时,相关列表会在侧边栏中显示。确定相关列表的逻辑位于控制器中。

现在是我的问题:

  1. 根据我上面提供的例子,我是否正确地认为这些是当前在控制器中的逻辑实例,应该放在模型中?
  2. 还有哪些与Web应用程序常见的逻辑领域应该放在模型中?
  3. 我确定识别这个问题并改变我的设计模式是解决问题的一半,但即使我决定将上述示例中的逻辑移动到模型中,我也不知道从何开始。 有人可以通过在此处发布一些代码或链接到一些好的学习资源来指引我吗? CakePHP特定的帮助很棒,但我相信任何MVC都足够。

之前都听过了 :) - MeTitus
2个回答

55

由于一些答案涉及到框架的具体细节(无论你使用的是哪一个),因此很难给出“正确”的答案。

至少在CakePHP方面:

  1. 是的

  2. 任何与数据或数据操作有关的东西都应该放在模型中。就CakePHP而言,一个简单的find()方法如何?......如果它可能会做一些“特殊”的事情(即调用特定的“条件”集合),而你在其他地方也可能需要它,那么把它包装在模型的方法中就是个好借口。

  3. 不幸的是,这永远没有简单的答案,代码重构是一个自然的过程。有时你只是突然想到:“天啊……那应该在模型中!”(也许你不会这样想,但我会 :))


5
博客作者写下了获胜答案 FTW! - Xeoncross

19

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

1)如果我编写一个单元测试,那么只需创建一个“真实”的对象进行测试即可(即您在生产中使用的对象),而不包括许多其他对象,除了一些值对象。需要一个实际的模型对象和实际的控制器对象来执行测试可能是您需要移动功能的信号。

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

还有有趣的内容:http://www.martinfowler.com/bliki/AnemicDomainModel.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接