使用大量参数的缺点

时间:2011-01-31 19:58:29

标签: language-agnostic function overloading user-defined-functions

我正在重新编写一些代码来进行功能更改,我遇到的情况是我需要重载一个函数以容纳两种或三种类型的参数(但对它们执行几乎相同的操作)或者使用一个功能有很多参数。现在我将使用后一个选项,我只想知道使用具有大量参数的函数的具体缺点(如果有的话)(当我说很多时,我的意思是15)。

我正在寻找一般答案,没有特定语言,所以我在这里没有提到这种语言,但仅仅是为了获取信息,我正在使用C#。

由于 Rishi

4 个答案:

答案 0 :(得分:6)

许多参数存在的问题是,在您调用代码的地方,很难看出参数的含义:

// Uhh... what?
run(x, y, max_x, true, false, dx * 2, range_start, range_end, 0.01, true);

有些语言通过允许带有合理默认值的命名参数和可选参数来解决这个问题。

另一种方法是将您的参数放在具有命名成员的参数对象中,然后将该单个对象作为参数传递给您的函数。这是一个名为Introduce Parameter Object的重构appraoach。

您可能还会发现将一组相关参数组合在一起成为一个类,将另一组参数组合到另一个类中非常有用。

答案 1 :(得分:1)

您可以尝试将其视为将使用该方法的人。 最好是对每个论点进行可理解的使用。

如果并非在所有情况下都使用所有参数,您可以:

  • 使用可选参数(例如c#4支持)
  • 使用struct或class来保存参数,只填充必需的属性
  • 重构您的代码。我不知道你的代码是做什么的,但在我眼里似乎有很多参数

答案 2 :(得分:1)

如果您尝试编写代码“功能方式”,您可能会发现"Currying"有用,并创建有意义的仿函数对象,这些对象仅使用几个参数进行初始化。如果函数需要很多参数,那么它们的列表可能(或应该)通常被划分为有意义的块,而currying应该形成具有有意义意图的函数链。

而不是(this回答的例子):

run(x, y, max_x, true, false, dx * 2, range_start, range_end, 0.01, true);

你可以使用

// initialize functors
run_in_userbox = run(x, y, max_x);
run_with_bounds = run_in_userbox(true, false);
iterate_within_bounds = run_with_bounds(dx * 2, range_start, range_end, 0.01);

result = iterate(true); //computation only starts here

我不知道C#是否支持这个,但问题通常是在函数式语言中解决的。

答案 3 :(得分:0)

我通常处理这种方法的方法是为每个需要的签名设置非常小的单独方法,但让它们调用私有方法来完成实际工作,正如你所说的那样,用例之间几乎完全相同。