我有一个查询数据库的搜索功能,有~15个可选参数。显然这不是很漂亮,并称它有点混乱。 PHP不允许重载方法,所以我刚刚创建了大量的函数签名。
在其他地方,我看到过诸如创建参数类的建议:Disadvantages of using a lot of parameters
但这似乎太重了。我可以传入一个关联数组,但是这会减少参数的数量,我认为它不太容易理解,因为没有内置的文档说明数组中应该存在哪些键。
还有其他方法可以优雅地处理这个问题吗?通常在其他语言中,我会使用一个非常丑陋的private
方法,该方法最多需要十几个参数,然后创建同名的public
方法,这些方法接受这些参数的子集并在内部调用私有方法。
答案 0 :(得分: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!';
}
它还有更多可选参数。它也可以使用具有100个参数的方法,但这更具可读性。
编辑:这些解决方案也更好地支持可选参数。对于属性,它很简单,在关联数组的情况下,您可以将数组与默认值数组合并。
答案 1 :(得分:2)
通常,长参数列表在代码中是一种所谓的难闻气味,可以通过名为Introduce parameter object的重构来删除。请参阅this以供参考。
Cheeres
答案 2 :(得分:1)
是的,好的经验法则是不超过3-4个参数。如果你需要更多,那么通常你应该使用数组或对象作为参数之一。但在某些情况下,如果你认为你真的需要更多的参数,那么肯定,为什么不呢。如果它使您的代码易于理解和使用,那么为什么不呢。
答案 3 :(得分:1)
在我看来,“太多参数”的问题只是一个更深层次的问题的表现:一个糟糕的架构。如果一个函数真的需要所有这些参数值,那么它很可能会比它应该做的更多。
这应该是一个提醒“哦,嘿,让我们重新考虑不使用程序X来做所有的事情,而是考虑X应该做什么真正以及Y和Z应该做什么。
答案 4 :(得分: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.
答案 5 :(得分:0)
将您的函数转换为类很好。有两个主要优点:
转换为属性的函数参数可以注释
我认为相当大的功能代码可以拆分成一组较小的私有方法