4

我有一个查询数据库的搜索功能,并且有大约 15 个可选参数。显然这并不漂亮,称它为有点乱。PHP 不允许重载方法,所以我一直在创建巨大的函数签名。

在其他地方,我看到了诸如创建参数类之类的建议:使用大量参数的缺点

但这似乎太重了。我可以传入一个关联数组,但是虽然这减少了参数的数量,但我相信它不太容易遵循,因为没有内置文档说明数组中应该存在哪些键。

有没有其他方法可以优雅地处理这个问题?通常在其他语言中,我会有一个非常丑陋的private方法,它最多需要十几个参数,然后创建public同名的方法,这些方法接受这些参数的子集并在内部调用私有方法。

4

6 回答 6

4

在 PHP 中,您可以使用关联数组:

someFunction(array(
    "a" => 3243,
    "b" => 2354,
    "c" => 33453,
    "d" => 324353,
    "e" => 321243,
    "f" => 321243,
    "g" => 312243,
    "h" => 321243,
))

或正在调用该函数的对象的属性(如果有意义的话)。PHPMailer 发送这样的邮件:

// instantiate the class
$mailer = new PHPMailer();

// Set the subject
$mailer->Subject = 'This is a test';

// Body
$mailer->Body = 'This is a test of my mail system!';

// Add an address to send to.
$mailer->AddAddress('foo@host.com', 'Eric Rosebrock');

if(!$mailer->Send())
{
    echo 'There was a problem sending this mail!';
}

它还有更多的可选参数。它也可以使用具有数百个参数的方法,但这更具可读性。

编辑:这些解决方案也更好地支持可选参数。在属性的情况下,它很简单,在关联数组的情况下,您可以将数组与默认值数组合并。

于 2011-02-08T13:19:46.477 回答
2

通常,长参数列表是代码中所谓的不良气味,可以通过称为 Introduce 参数对象的重构来删除。请参阅此内容以供参考。

干杯

于 2011-02-08T13:31:15.367 回答
1

是的,好的经验法则是不超过 3-4 个参数。如果您需要更多,那么通常您应该使用数组或对象作为参数之一。但在某些情况下,如果你认为你真的需要更多参数,那么当然,为什么不呢。如果它使您的代码易于理解和使用,那为什么不呢。

于 2011-02-08T13:27:35.683 回答
0

在我看来,“参数太多”的问题只是一个更深层次的问题的表现:糟糕的架构。如果一个函数真的需要所有这些参数值,那么很有可能它做的比它应该做的要多得多。

这应该是一个提醒“哦,嘿,让我们重新考虑不要使用过程 X 来做所有的事情,而是想想X真正应该做什么以及 Y 和 Z 应该做什么。

于 2011-02-08T13:48:17.673 回答
0

您可以创建一个将参数存储为属性的类,允许您根据需要设置每个属性,然后有一个使用这些属性来查询数据库的方法。构造函数可以为这些属性设置默认值。这只是让调用更容易一些。

$function = ClassFunction();
$function->arg1 = 'Some value.';
$function->arg2 = true;
$function->arg3 = 5;

$result = $function->call_method();    // This uses default values for any property not set.
于 2011-02-08T13:25:48.003 回答
0

将您的函数转换为类会很好。有两个主要优点:

  • 函数参数转换为属性并且可以注释

  • 我认为相当大的函数代码可以拆分为一组较小的私有方法

于 2011-02-08T17:49:28.687 回答