每当我需要3个以上的参数时,我总是对函数使用一个数组参数。
示例:考虑这样的函数调用。
processSecondStage($stepTitle, $round, $entryId, $formId, $stepType, $stepAfterApproved, $assigneees, $stageToMove);
我总是喜欢下面的那个。
processSecondStage(array(
'stepTitle' => $title,
'round' => $round,
'stepAfterApproved' => $stepAfterApproved,
'entryId' => $_entryId,
'assigneees' => (array)$_POST['flow-asignee'],
'stageToMove' => $currentStep,
'formId' => $targetFormId,
'stepType' => 'approval'
));
优势(我可能错了):
a)可以添加更多参数
b)可读性
c)订单可以轻松更改
d)默认参数处理更容易
缺点:
a)如果我们有少于3-4个参数,则代码长度会增加。
任何人都可以帮助我了解使用数组参数的更多缺点吗?
每当我更改其他开发人员代码(就像我现在要做的那样)时,我觉得使用array
作为参数有一些主要的缺点,因为如果不是这样的话那么它应该是一个标准做法。
虽然我已经举了PHP的例子,但我发现其他语言也是我的工作。
谢谢。
答案 0 :(得分:2)
当您要传递的内容密切相关且无法分开时,数组可用作参数。一个经典的例子是由Color
,blue
,green
(可能是red
)定义的gamma
。将这些参数组合到一个数组(或javascript中的对象)中,您可以轻松地将它们交换出来。
始终使用数组作为函数的单个参数会使您在IDE可以提供的参数列表上松散。对于阅读代码的人来说,找出需要传递给函数的内容真是太神奇了。它也打开了未来蠕变的大门(哦,这个功能只能让我喝咖啡,但是如果我添加另一个可选参数,它也可以让我喝茶。哦,也许我可以让它让我吃晚饭。为什么不添加订购攻击直升机的功能也是如此。
在常规参数列表中,您可以通过引用(function pushElement(array &$sortableArray, $element)
)传递内容。如果可能的话,在常规数组中不会出现这种情况。
关于默认值的观点是一个有争议的问题。正常参数列表允许类型提示和默认值正常:
function action(string $action = 'tickle', string $target = 'Polar bear') {
print "I {$action} a {$target}";
}
作为数组的单个参数可能只在传递某种静态配置时才真正发光。您可以使用它来保持与实际代码分开的配置,从而更容易修改配置。与此同时,您可以利用以下事实:您不必按特定顺序发送20个参数。
在你的情况下,你给出的参数列表变化多端且很长,这表明你的函数做得太多了。部分内容应该移到构造函数中,其中一部分可能应该移动到某种Form
类。
答案 1 :(得分:1)
主题的部分内容非常自以为是......
您描述的问题不仅仅是参数列表与参数序列。发生了几个问题(在您的示例中都有)。
工具可能是显而易见的:如果你只有数组作为参数,那么IDE就不会知道里面应该是什么。好的,大多数 IDE都不知道。
参数的排序通常由函数名称和/或其语义决定。如果您drawLine
参数的规范顺序为($from, $to)
。如果没有规范顺序,代码可能还有其他问题......(见下文)
语义:如果你有3个以上的参数(特别是如果你有更多的参数),很可能,抽象是错误的。例如,让我们假设您有一个函数createShirt($size="m", int $red, int $blue, int $green, Image $logo, $material="wool")
:属性的顺序是任意的,生成的对象(衬衫)可能不需要所有这些参数,但您绝对可以使用此抽象。我更喜欢构建器模式,例如:
$shirt = ShirtBuilder::create("m") // verifies m is a size
->setColor(new Color($red,$green,$blue)) // has type-hint color
->setImage($logo) // has type-hint
->setMaterial($material)
->build();
它绝对更详细,但显然您只需要调用所需的函数,您可以在任何时候验证设置值(读取:函数调用)。构建函数可以验证组合是否有效,而Shirt对象本身甚至可以是不可变的。
然而,绝对做的数组有它们的位置和目的。但通常它是提供相同类型的东西的列表"。如果您的数组只包含来自非常小的域的字符串键,则可能需要一个对象。
使用对象会触发诸如"哪些参数应属于此对象?等问题?"。如果没有语义原因让真正的参数子集一起出现,您可能需要命令模式(命令对象)。和IDE可能提供使用这些简单
的所有奇迹TL; DR:
使用数组来保存异构参数列表可能是反模式(在某些场景/语言中可能是必要的)。
具有3个以上参数的函数/方法建议抽象太少(可能有原因)。使用适当的设计模式。