拥有大量参数的函数是不好的形式?有什么选择?

时间:2011-02-08 13:17:56

标签: php architecture function-parameter

我有一个查询数据库的搜索功能,有~15个可选参数。显然这不是很漂亮,并称它有点混乱。 PHP不允许重载方法,所以我刚刚创建了大量的函数签名。

在其他地方,我看到过诸如创建参数类的建议:Disadvantages of using a lot of parameters

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

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

6 个答案:

答案 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)

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

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

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