在一个类中,我有一个处理方法,它根据可用的 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 表单元素的名称或获取 urls 中的变量(或者实际上是传入的任何数组)。
允许注入任何变量的数组使该方法变得灵活,这是必要的,因为它也是多态的。类继承此方法并使用它来调用它自己的操作。其结果是,从外部看,处理方法需要什么才能发挥作用并不明显。这意味着必须检查实现以找出它的作用(除非我将代码复制到 phpdoc 中,这将是愚蠢的)。
我不知道如何解决这个问题。将大量的 if/case 语句全部暴露在索引页面上(来自像这样的多个类)会导致代码非常混乱,因此最好将所有这些都封装在一个方法中。此外,将其作为类的方法来负责调用操作其自身状态的操作是有意义的(责任驱动设计)。我考虑过将每个变量作为方法的参数,但对于某些类,参数列表会非常大。这也意味着不能自动调用不同类的许多 handleAll() 方法,因为每次调用都需要显式注入所有参数,从而消除多态方面。
总而言之,我需要保持方法的多态性,但我需要某种方式将处理代码与来自 html 表单或 url 的用户输入解耦。在这样做时,也许还有一种方法可以将接口与实现分开。我很惊讶我已经找不到任何解决方案,这似乎是一个常见问题。