2009-01-21 62 views
73

我刚刚阅读了一个用银行类比解释MVC的blog post。我有一个使用MVC框架(CakePHP)的Web应用程序开发的几个月的经验,所以我了解了基础知识,但是我开始看到一个主题,这让我认为我采取了一种有缺陷的方法来放置我的逻辑:胖模型,瘦身控制器和MVC设计模式

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

在我的应用程序,模特厌食和控制器是肥胖。我拥有控制器中的所有业务逻辑,除了模型中的关联和验证规则外,没有其他任何内容

扫描通过我的控制器,我现在能够确定大量的逻辑,可能应该在一个模型:

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

现在我的问题:

  1. 有了上面我给了,我是在正确的轨道上在想,这些都是逻辑的情况下,目前在该模型中所属的控制器的例子吗?
  2. 什么是其他应用于模型的其他Web应用程序逻辑领域?
  3. 我确定发现这个问题,改变我的设计模式只是一场战斗,但即使我决定采用上面给出的那些例子并尝试将该逻辑移至模型,我也不知道从哪里开始。任何人都可以通过在这里发布一些代码或者链接到一些好的学习资源来指向正确的方向吗? CakePHP的具体帮助会很棒,但我确信任何MVC都足够了。
+0

听说过这一切:) – Marco 2013-04-12 13:34:22

回答

54

这是一个有点困难,给你“正确”的答案,因为他们中的一些处理框架的细节(无论您正在使用的那些的)。

至少在CakePHP的方面:

  1. 凡是与数据或数据处理协议应该是一个典范。在CakePHP方面,简单的find()方法呢? ......如果有可能会做一些“特殊”的事情(即回忆一些特定的“条件”),那么在别的地方可能需要这样做,这是一个很好的借口,可以用模型的方法来包装。

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

+2

很好地把。还有一个很好的博客文章。 – andyk 2009-01-25 19:17:37

19

我使用至少这两个“测试”,以检查是否我的逻辑是在正确的地方:

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

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

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

相关问题