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

时间:2009-01-21 21:34:54

标签: model-view-controller cakephp model controller

我刚读了blog post,用一个银行类比来解释MVC。我有几个月使用MVC框架(CakePHP)进行Web应用程序开发的经验,所以我得到了基础知识,但我开始看到一个主题让我觉得我采用了一种有缺陷的方法来处理逻辑:

  • 脂肪模型,瘦小的控制器
  • 尽可能多地保持模型中的业务逻辑

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

通过我的控制器进行扫描,我现在可以识别出许多应该放在模型中的逻辑:

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

现在回答我的问题:

  1. 通过上面给出的示例,我是否正确地认为那些是属于模型的控制器中的逻辑实例?
  2. 网络应用程序常见的其他逻辑领域是什么?应该进入模型?
  3. 我确定发现这个问题并改变我的设计模式只是成功的一半,但即使我决定采用上面提到的那些例子并尝试将该逻辑移到模型中,我也不知道从哪里开始。任何人都可以通过在这里发布一些代码或链接到一些好的学习资源来指出我正确的方向吗? CakePHP特定的帮助会很棒,但我确信任何MVC都足够了。

2 个答案:

答案 0 :(得分:55)

给你“正确”答案有点困难,因为其中一些处理框架的细节(无论你使用的是什么)。

至少就CakePHP而言:

  1. 处理数据或数据操作的任何事情都应该在模型中。就CakePHP而言,简单的find()方法呢? ......如果它有可能会做一些“特殊的”(即回忆一组特定的'条件'),你可能需要在其他地方使用,这是一个很好的借口来包装模型的方法。

    < / LI>
  2. 不幸的是,从来没有一个简单的答案,重构代码是一个自然的过程。有时你只是醒来:“神圣的通心粉......这应该在模特中!” (也许你不这样做,但我有:))

答案 1 :(得分:19)

我至少使用这两个'测试'来检查我的逻辑是否在正确的位置:

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

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

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