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

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

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

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

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


当前回答

我的答案将基于函数被调用的频率。

如果它是一个只被调用一次的init函数,那么就让它占用10个parms或更多,谁在乎呢。

如果它每帧被调用一堆次,那么我倾向于创建一个结构,并只传递一个指针给它,因为这往往更快(假设你不是每次都重建结构)。

其他回答

我过去使用的一些代码使用全局变量,只是为了避免传递太多参数。

请不要这样做!

(通常)。

如果我在一个例程中有7-10个参数,我会考虑将它们捆绑到一个新类中,但如果这个类只是一堆带有getter和setter的字段,那么这个新类必须做一些其他的事情,而不是将值移进和移出。否则,我宁愿忍受很长的参数列表。

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

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

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

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

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

我的答案将基于函数被调用的频率。

如果它是一个只被调用一次的init函数,那么就让它占用10个parms或更多,谁在乎呢。

如果它每帧被调用一堆次,那么我倾向于创建一个结构,并只传递一个指针给它,因为这往往更快(假设你不是每次都重建结构)。