胖模型,瘦身控制器和MVCdevise模式
我刚刚阅读了一篇用银行类比解释MVC的博文 。 我有一个使用MVC框架(CakePHP)的Web应用程序开发的几个月的经验,所以我得到的基础知识,但我开始看到一个主题,让我觉得我采取了一个有缺陷的方法,我把我的逻辑:
- 胖的模型,瘦的控制器
- 在模型中尽可能多地保留业务逻辑
在我的应用程序,模型是厌食症和控制器肥胖。 我拥有控制器中的所有业务逻辑,除了模型中的关联和validation规则之外,
通过扫描我的控制器,我现在可以确定很多可能在模型中使用的逻辑:
- 该应用程序有列表,其中包含项目,并可以排列项目。 将列表按排列顺序排列的sorting逻辑在控制器中。
- 同样,项目(项目模型)也有图像(图像模型)。 每个项目可能有一个默认图像(由项目表中的image_id指定)。 当项目与其图像一起显示时,默认图像应该首先出现。 我有一个控制器做到这一点的逻辑。
- 当列表显示时,相关列表显示在边栏中。 确定哪些列表相关的逻辑在控制器中。
现在我的问题:
- 通过上面给出的例子,我是否正确地认为那些属于模型中的控制器的逻辑实例?
- Web应用程序常见的其他一些逻辑领域还有哪些应该纳入模型?
- 我确定要找出这个问题,改变我的devise模式只是争斗的一半,但即使我决定采取上面给出的例子,并试图将这个逻辑推广到模型,我也不知道从哪里开始。 任何人都可以通过在这里发布一些代码来指向正确的方向,或链接到一些好的学习资源? CakePHP的具体帮助将是伟大的,但我敢肯定任何MVC就足够了。
给你“正确的”答案有点难,因为有些答案处理框架的细节(不pipe你正在使用的是什么)。
至less在CakePHP方面:
-
是
-
处理数据或数据操作的任何事情都应该在模型中。 在CakePHP方面,一个简单的find()方法呢? ……如果有机会做一些“特殊”的事情(即回忆一些特定的“条件”),那么在别的地方可能需要这样做,那么这是一个很好的理由。
-
不幸的是,从来没有一个简单的答案,重构代码是一个自然的过程。 有时你只是醒来:“圣洁的通心粉……应该在模型中!” (也许你不这样做,但我有:))
我至less使用这两个“testing”来检查我的逻辑是否在正确的位置:
1)如果我写一个unit testing,很容易只创build一个“真实”的对象来做testing(=您在生产中使用的对象),除了可能有一些值对象外,不包含其他许多testing。 需要一个实际的模型对象和一个实际的控制器对象来做一个testing可能是你需要移动function的一个信号。
2)问自己这个问题:如果我添加了另一种方法来使用这些类,我需要以几乎复制粘贴的方式复制function? …这也可能是移动该function的一个很好的理由。
也有趣: http : //www.martinfowler.com/bliki/AnemicDomainModel.html