【发布时间】:2012-04-20 08:41:44
【问题描述】:
在一个类中,我有一个处理方法,它根据可用的 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 表单或 url 的用户输入解耦。在这样做时,也许还有一种方法可以将接口与实现分开。我很惊讶我找不到任何解决方案,这似乎是一个常见问题。
【问题讨论】:
-
不是让
handleAll处理所有事情,为什么不让个别方法处理他们期望的特定发布数据变量? -
如果我要为每个方法输入 post 变量,那么我会到处得到大量的 if/else 代码。此外,多态性将被删除,这意味着需要为每个类显式调用每个方法,这意味着不能在循环中进行许多对 handleAll() 的调用。如果我让每个方法都使用特定的 post 变量,因此无法注入依赖项,那么耦合问题仍然存在。
-
你不能使用许多 MVC 框架之一吗?他们默认提供你想要的。基本上,您需要在控制器中“拆分”应用程序,每个控制器都有自己的责任。而 IMO 您目前拥有的方法绝不是多态的。它更像是一个前端控制器。
-
@MikeSW 我正在构建自己的。该方法是多态的,因为它是从超类型继承的,并且根据子类型其行为不同。实际上有一个前端控制器调用其他控制器(这反过来又可以调用其他控制器),想法是如果您封装一些控制代码,您可以避免一个巨大的长 ifelse/switch 语句。无论如何,这不是重点。这个问题与 MVC 无关,因为我的问题可能适用于任何类似的问题。
标签: php oop polymorphism encapsulation decoupling