Language agnostic 使用大量参数的缺点

Language agnostic 使用大量参数的缺点,language-agnostic,function,overloading,user-defined-functions,Language Agnostic,Function,Overloading,User Defined Functions,我正在重新编写一些代码来进行功能更改,我陷入了这样一种情况:要么我需要重载一个函数来容纳两到三种类型的参数(但对它们执行几乎相同的操作),要么使用一个函数和许多参数。现在我选择后一个选项,我只是想知道使用一个有很多参数的函数的具体缺点(如果有的话)(当我说lot时,我指的是15) 我在寻找一个一般性的答案,没有特定的语言,所以我在这里没有提到语言,只是为了提供信息,我在使用C# 谢谢 Rishi许多参数的问题在于,在调用代码的地方,很难看到参数的含义: // Uhh... what? run(x

我正在重新编写一些代码来进行功能更改,我陷入了这样一种情况:要么我需要重载一个函数来容纳两到三种类型的参数(但对它们执行几乎相同的操作),要么使用一个函数和许多参数。现在我选择后一个选项,我只是想知道使用一个有很多参数的函数的具体缺点(如果有的话)(当我说lot时,我指的是15)

我在寻找一个一般性的答案,没有特定的语言,所以我在这里没有提到语言,只是为了提供信息,我在使用C#

谢谢
Rishi

许多参数的问题在于,在调用代码的地方,很难看到参数的含义:

// Uhh... what?
run(x, y, max_x, true, false, dx * 2, range_start, range_end, 0.01, true);
一些语言通过允许命名参数和带有合理默认值的可选参数来解决这个问题

另一种方法是将参数放入具有命名成员的参数对象中,然后将单个对象作为参数传递给函数。这是一种称为的重构方法


您可能会发现,将一组相关参数放在一起放在一个类中,将另一组参数放在另一个类中也很有用。

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

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

  • 使用可选参数(例如c#4支持)
  • 使用struct或class保存参数并仅填充所需的属性
  • 重构代码。我不知道你的代码是做什么的,但在我看来,它似乎有大量的参数

我通常的处理方法是为每个需要的签名使用非常小的单独方法,但让它们调用私有方法来完成实际工作,正如您所说,这在不同的用例中几乎是相同的

如果您试图以“函数式方式”编写代码,您可能会发现这很有用,并且可以创建有意义的functor对象,这些对象只需几个参数即可初始化。如果一个函数包含很多参数,它们的列表可能(或应该)通常被划分为有意义的块,咖喱应该形成一个有意义的函数链

因此,代替(答案示例):

你可以用

// 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是否支持这一点,但函数式语言通常就是这样解决问题的。

这是一个很好的选择,但在我的情况下它不起作用。但是谢谢你提醒我,我不知道。我会投赞成票:)
// 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