Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用数组作为参数的缺点?_Javascript_Php - Fatal编程技术网

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

Javascript 使用数组作为参数的缺点?,javascript,php,Javascript,Php,每当我需要3个以上的参数时,我总是对一个函数使用一个数组参数 例如:考虑这样的函数调用。 processSecondStage($stepTitle、$round、$entryId、$formId、$stepType、$stepAfterApproved、$Assignees、$stageToMove) 我总是喜欢下面的那个 processSecondStage(数组( “stepTitle”=>$title, 'round'=>round美元, “stepAfterApproved”=>$st

每当我需要3个以上的参数时,我总是对一个函数使用一个数组参数

例如:考虑这样的函数调用。

processSecondStage($stepTitle、$round、$entryId、$formId、$stepType、$stepAfterApproved、$Assignees、$stageToMove)

我总是喜欢下面的那个

processSecondStage(数组(
“stepTitle”=>$title,
'round'=>round美元,
“stepAfterApproved”=>$stepAfterApproved,
'entryId'=>$\u entryId,
“Assignees”=>(数组)$\u POST['flow-asignee'],
'stageToMove'=>$currentStep,
'formId'=>$targetFormId,
“步骤类型”=>“批准”
));

优点(我可能错了):

a) 可以添加更多的参数

b) 可读性

c) 订单可以很容易地更改

d) 默认参数处理更容易

缺点:

a) 当参数少于3-4时,代码长度会增加

有谁能帮我了解使用数组参数的更多缺点吗

每当我更改其他开发人员代码时(就像我现在要做的),我都会觉得使用
array
作为参数有一些主要的缺点,因为如果不是这样的话,那么它应该是一种标准做法

虽然我已经给出了PHP的例子,但我发现在我工作的其他语言中也有这个例子


谢谢。

当您要传递的内容密切相关且没有意义时,数组作为参数非常有用。一个典型的例子是由
蓝色
绿色
红色
(可能还有
伽马
)定义的
颜色。将这些参数组合到一个数组(或javascript中的对象)中,可以轻松地将其交换出去

始终使用数组作为函数的单个参数会使您在IDE提供的参数列表中无所事事。对于阅读代码的人来说,弄清楚需要传递给函数的内容是相当困难的。它还为未来的爬行打开了大门(哦,这个功能只是给我煮咖啡,但如果我添加另一个可选参数,它也可以给我沏茶。哦,也许我可以让它给我做晚餐。为什么不添加功能来订购攻击直升机呢)

在常规参数列表中,您可以通过引用传递内容(
函数pushElement(array&$sortableArray,$element)
)。如果可能的话,这在常规数组中是不可能的

关于默认值的问题是一个没有实际意义的问题。正常参数列表允许类型提示和默认值:

function action(string $action = 'tickle', string $target = 'Polar bear') {
  print "I {$action} a {$target}";
}
作为数组的单个参数可能只有在通过某种静态配置时才会真正发光。您可以将某些东西的配置与使用它的实际代码分开,从而更容易修改配置。同时,您可以利用这样一个事实,即您不必按非常特定的顺序发送20个参数



在你的例子中,你给出的参数列表变化很大而且很长,这表明你的函数做得太多了。它的一部分可能应该移到构造函数中,另一部分可能应该移到某种形式的
类中。

这个主题的一部分非常固执己见

您描述的问题不仅仅是参数列表与参数序列。出现了几个问题(在您的示例中,两者都有)

  • 工具
  • 参数排序
  • 语义学
工具可能很明显:如果您只有数组作为参数,那么没有IDE会知道里面应该是什么。好吧,大多数IDE都不知道

参数的顺序通常由函数名和/或其语义决定。如果使用
drawLine
,参数的规范顺序为
($from,$to)
。如果没有规范顺序,代码可能还有其他错误。。。(见下文)

语义:如果您有3个以上的参数(特别是如果您有更多的参数),则很可能抽象是错误的。例如,假设您有一个函数
createShirt($size=“m”,int$red,int$blue,int$green,Image$logo,$material=“wool”)
:属性的顺序是任意的,生成的对象(衬衫)可能不需要所有这些参数,但您完全可以使用此抽象。我更喜欢builder模式,例如:

$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();
它绝对更详细,但很明显,您只需调用所需的函数,就可以在任何时候验证设置值(读取:function call)。build函数可以验证组合是否有效,Shirt对象本身甚至可以是不可变的

但是,阵列绝对有其位置和用途。但通常它是“提供一个相同类型的事物列表”。如果数组中只有来自非常小的域的字符串键,则可能需要一个对象

使用对象将引发诸如“哪些参数应属于此对象?”之类的问题。如果没有语义上的原因使真正的参数子集一起出现,则可能需要命令模式(命令对象)。IDE可能会提供使使用这些工具变得容易的所有奇迹

tl;博士:

使用数组保存异类参数列表可能是一种反模式(在某些场景/语言中可能是有保证的)


具有3个以上参数的函数/方法表明抽象太少(可能有原因)。使用适当的设计模式。

你会失去静态分析,不是吗?如果传递了一个坏键,它将在运行时而不是编译时失败。@Carcigenicate yes这是编译语言的一个有效点。我相信您可以在这里应用的两种编程模式是:命令模式,它反过来会向vali建议生成器模式