首页 文章

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

提问于
浏览
74

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

  • 胖子模特,瘦小的控制器

  • 尽可能多地保留模型中的业务逻辑

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

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

  • 应用程序包含列表,其中包含项目,可以对项目进行排名 . 将列表按排名顺序排列的排序逻辑位于控制器中 .

  • 同样,项目(项目模型)也有图像(图像模型) . 每个项目可能有一个默认图像(由items表中的image_id指定) . 当项目与其图像一起显示时,应首先显示默认图像 . 我有一个在控制器中执行此操作的逻辑 .

  • 显示列表时,相关列表显示在侧栏中 . 确定哪些列表相关的逻辑在控制器中 .

现在问我的问题:

  • 通过上面给出的例子,我是否正确地认为那些是属于模型的控制器中的逻辑实例?

  • 应该进入模型的网络应用程序常见的其他逻辑领域是什么?

  • 我'm sure identifying this problem and changing my design pattern is half the battle, but even if I decide to take those examples I gave above and try to move that logic to a model, I wouldn'知道从哪里开始 . 任何人都可以通过在这里发布一些代码或链接到一些好的学习资源来指出我正确的方向吗? CakePHP特定的帮助会很棒,但我确信任何MVC都足够了 .

2 回答

  • 55

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

    至少在CakePHP方面:

    • 是的

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

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

  • 19

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

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

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

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

相关问题