例程可以有参数,这不是新闻。您可以根据需要定义任意多的参数,但是过多的参数会使您的例程难以理解和维护。

当然,您可以使用结构化变量作为解决方法:将所有这些变量放在单个结构中并将其传递给例程。事实上,使用结构来简化参数列表是Steve McConnell在Code Complete中描述的技术之一。但正如他所说:

谨慎的程序员避免将数据捆绑在一起,除非逻辑上是必要的。

因此,如果你的例程有太多的参数,或者你使用一个结构体来掩盖一个大的参数列表,你可能做错了什么。也就是说,你没有保持耦合松散。

我的问题是,什么时候我可以认为一个参数列表太大?我认为5个以上的参数太多了。你怎么看?


当前回答

我同意3个是可以的,4个太多了。如果有3个以上的参数,你就不可避免地要做不止一个任务。一个以上的任务应该被分割成不同的方法。

然而,如果我查看我所从事的最新项目,例外情况比比皆是,大多数情况下很难归结为3个参数。

其他回答

这很大程度上取决于你工作的环境。以javascript为例。在javascript中,传递参数的最佳方式是使用带有键/值对的对象,这实际上意味着你只有一个参数。在其他系统中,最佳点将是3或4。

归根结底,这一切都取决于个人品味。

作为一般的经验法则,我停留在三个参数上。如果再多,就应该传递一个参数数组或配置对象,这也允许在不更改API的情况下添加未来的参数。

在最差的5个代码片段中,检查第二个,“这是一个构造函数吗”。它有37⋅4≈150个参数:

下面是一个程序员写的构造函数[…]你们中的一些人可能认为是的,它是一个很大的构造器,但他使用eclipse自动代码生成工具。NOO,在这个构造函数中,我发现了一个小错误,这让我得出结论,这个构造函数是手工编写的。(顺便说一下,这只是构造函数的顶部部分,它不是完整的)。

只有在某些参数是冗余的情况下,函数才可能有过多的参数。如果使用了所有参数,则函数必须具有正确的参数数量。以这个常用的函数为例:

HWND CreateWindowEx
(
  DWORD dwExStyle,
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName,
  DWORD dwStyle,
  int x,
  int y,
  int nWidth,
  int nHeight,
  HWND hWndParent,
  HMENU hMenu,
  HINSTANCE hInstance,
  LPVOID lpParam
);

这是12个参数(如果将x,y,w和h捆绑为一个矩形,则为9个),还有从类名派生的参数。你将如何减少这种情况?你想把数字减少到更精确的程度吗?

不要让参数的数量困扰你,只要确保它是合乎逻辑的,并有良好的文档记录,让智能感知*帮助你。

*其他编码助手可用!

根据我的说法,可能会有超过4个或某个固定数字的情况。 需要注意的事情可能是

你的方法做的太多了,你需要重构。 您可能需要考虑使用集合或某些数据结构。 重新考虑你的类设计,也许有些东西不需要传递。

从易于使用或易于阅读代码的角度来看,我认为当您需要对方法签名进行“换行”时,应该停下来思考,除非您感到无助,所有使签名更小的努力都没有结果。在过去和现在,一些非常好的图书馆使用超过4-5辆婴儿车。