使用数组作为参数的缺点?

时间:2018-05-05 11:56:57

标签: javascript php

每当我需要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的例子,但我发现其他语言也是我的工作。

谢谢。

2 个答案:

答案 0 :(得分:2)

当您要传递的内容密切相关且无法分开时,数组可用作参数。一个经典的例子是由Colorbluegreen(可能是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个以上参数的函数/方法建议抽象太少(可能有原因)。使用适当的设计模式。