Answers:
可能不是最好的类比,但是,对控制器的思考方式与对蜘蛛网的思考方式相同。它的唯一工作是捕获苍蝇(请求)以使蜘蛛(底层)消化。该网可以捕获并容纳较小或较大的苍蝇(模型)。蜘蛛网的作用不是消化猎物,尽管它可以用于此目的。纤网越薄越干净,蜘蛛就越容易谋生。
您可以将某些相同的逻辑应用于您的MVC应用程序。您描述的庞大而讨厌的功能很可能是模型的行为,它们应该属于模型(请注意,模型不仅是在视图中显示的对象)。如果模型的行为发生变化,则应更改模型,而不是处理该模型的控制器。
同样,将它们作为私有方法保留在控制器中只会使它混乱,并且难以维护。这也为坏习惯铺平了道路,因为参与开发的其他人会很想这样做,因为他们之前在项目中已经看到过这样做。
我能给出的最佳答案是引用罗伯特·马丁(Robert Martin)的一本好书,即“清洁代码”,我强烈建议对此主题有兴趣的人:
功能的第一个规则是它们应该很小。第二条规则是它们应该小于该值。
不能说得更好。同一本书的另一篇引文也很适用:
函数应该做一件事。他们应该做好。他们只能这样做。
将代码拆分为更多函数时,必须为这些函数提供有意义的名称,从而可以大大提高代码的可读性。不用说,所有不打算在类外部使用的函数都应该是私有的,因此您可以通过继承轻松地重用代码。
如果您的控制器现在具有太多功能,则表明它可能执行了太多操作。然后,您可以将其拆分为几个独立的部分,或尝试将其他函数移至模型,如另一个答案中所述。同样,如果遵循非经典的MVC风格(允许视图具有某种逻辑),则可以在适合的地方放置一些函数。
在MVC中,我尝试确保控制器尽可能“薄”,并且我的模型也尽可能哑。
所需的逻辑和帮助程序功能将放入单独的独立帮助程序类中。这也使我的测试变得容易得多(您正在测试..正确吗?:D)测试控制器非常困难,每当您尝试创建控制器实例来进行测试时,您都必须考虑HTTP上下文和伪造http this and that,虽然很痛苦,但是故意造成痛苦。您需要所有这些东西,因为控制器是如此紧密地链接到HTTP和Web。它是您的Web应用程序的入口点。
逻辑和辅助功能与网络无关。它们完全与环境无关(或者应该是)。仅此而已就可以告诉您他们不在同一个地方。另外,如果您将所有应用程序逻辑紧密地与Web或特定的Web实施联系在一起,那么您永远都无法将其带走。
我们使用所有数据库实体(不是我们的mvc模型,我们实际的数据库实体),我们的存储,我们的帮助程序类以及我们单独的dll中的逻辑开发了MVC网站。我们只有每个人都有一个网站,但是无论如何我们都是这样做的。
几个月前,我们被要求创建一些与我们的边缘系统相关的桌面应用程序。这很容易完成,因为我们所有经过测试的代码都可以轻松地重复使用。如果我们将代码推送到我们的Web项目中或放入我们的控制器中,我们将永远无法做到这一点。
除了Dmitri Zaitsev和spaceman的出色答案之外,我不知道以下内容是否也适用于PHP:由于缺乏自动测试的可能性,您应尽量避免使用私有方法。
是的,您也可以使用元编程或依赖项注入来测试私有方法,但您不应该这样做,因为它会对代码的可读性产生巨大影响。
永远记住KISS原则:保持简单,愚蠢。