在一个类中,我有一个处理方法,它根据什么post/get变量可用来执行操作。下面是一个简单的例子:
public function handleAll(array $vars) {
if (isset($vars['var1'])) {
$this->doThisAction($vars['var1']);
} else if (isset($vars['var2'])) {
$this->doAnotherAction($vars['var2']);
}
}
所以在运行时的方法可以这样调用$handler->handleAll($_POST)
。 问题是存储在$ vars数组中的变量必须命名为“var1”&“var2”等。这意味着处理代码与html表单元素的名称相结合或者在url中获取变量(或者实际上键任何数组传入)。
允许注入任何变量的数组使得该方法具有灵活性,这是必要的,因为它也是多态的。类继承此方法并用它来调用它自己的操作。这样做的结果是,外部处理方法所需的功能并不明显。这意味着必须检查实现,找出它的功能(除非我将代码复制到phpdoc中,这很愚蠢)。
我不知道如何解决这个问题。索引页面(来自多个这样的类)暴露出巨大的if/case语句会导致非常混乱的代码,因此最好将所有这些封装在方法中。此外,将它作为负责调用操纵它自己状态的行为的类的一种方法是有意义的(责任驱动设计)。我想过把每个变量作为方法的一个参数,但是对于某些类来说,参数列表会非常大。同样,这意味着不同类的handleAll()方法不能自动调用,因为每次调用都需要显式注入所有参数,从而消除多态性方面。
总结我需要保持多态的方法,但我需要某种方式从HTML表单或网址的用户输入解耦处理代码。这样做也许有一种将接口与实现分开的方法。我很惊讶,我无法找到任何解决方案,这似乎是一个普遍的问题。
而不是'handleAll'处理所有事情,为什么你没有单独的方法处理他们期望的特定后期数据变量? – 2012-04-06 19:53:38
如果我要为每个方法提供post变量,那么我会在任何地方都获得大量的if/else代码。此外,多态性将被删除,这意味着每个类都需要显式调用每个类,这意味着许多对handleAll()的调用无法在循环中进行。如果我想使每种方法都能与特定的后置变量一起工作,所以不能注入依赖关系,那么耦合问题依然存在。 – Jonathan 2012-04-06 20:08:08
你不能使用很多MVC框架之一吗?他们默认提供你想要的。基本上你需要在应用程序中“分割”控制器,每个控制器都有自己的责任。国际海事组织目前的方法是多形态的。它更像是一个前端控制器。 – MikeSW 2012-04-06 20:55:14