2

在一个类中,我有一个处理方法,它根据可用的 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 的用户输入解耦。在这样做时,也许还有一种方法可以将接口与实现分开。我很惊讶我已经找不到任何解决方案,这似乎是一个常见问题。

4

2 回答 2

1

我不确定您所描述的是否可以避免。

如果您的代码需要特定的参数 - 无论是包含某些值的数组形式还是其他形式 - 该函数将始终取决于正确填充的参数。

如果有function foo($a, $b, $c),我将始终必须填写参数。如果它们来自 POST,那么我需要从 POST 中获取它们。即使函数array('a' => ..., 'b' => ..., 'c' => ...)取而代之,也是如此。

但是,如果您想将表单与参数列表分离,您可以使用一个简单的函数将 POST 数组转换为您的处理函数之一所期望的格式。不过,我真的看不出有什么原因,因为如果你不需要,为什么要增加额外的复杂性呢?

如果您希望更好地定义您的处理程序需要什么样的数组,您可以考虑让它需要一个对象。这种方法有时称为参数对象

使用参数对象的好处是您可以轻松地在构造函数中设置必需的参数,并将设置器用于可选参数。任何使用您的代码的人都可以查看您对象的界面以查看需要哪些值。

如果您的处理程序使用的值实际上彼此相关,我会考虑创建一个实际的业务逻辑类型对象。使用 POST 中的数据创建它,并将处理值的代码移动到对象中的方法中。

于 2012-04-06T23:47:24.703 回答
0

解耦和自动化处理方法,也可能是缩小范围的痛苦方法。但是除了为所有事物创建处理程序之外,没有太多选择。但是,我想添加一些东西。允许默认值并支持变化

function handlePOST() {    }
function handleGET()  {    }
function handleArr()  {    }

现在,这些函数可以代表它们保存函数的变化。

然而,在内部,除了对所有处理程序进行编码之外,它们并不是更好的方法。但是开关缩短了它们并使用单独的功能进行处理。

switch($_POST['var1']) {
    case "value1": callPostValue1(); break;
    default: callPostDefaultHandler(); break;
}
于 2012-04-07T00:19:07.240 回答