2010-06-03 71 views
13

假设这些参数都是相同的类型,那么对于方法的参数数量是否有一个经验法则?我只是想知道我应该在哪里画线,以及我的选择是什么(即界面,阵列等)。每种方法的参数数量是多少?

回答

7

我会说这真的取决于你的情况。你对整个集合做些什么?验证所有项目或汇总数据,例如?在这种情况下,我将传入一个IEnumerable作为单个参数。

传入大量参数可能是问题分离不好的一个好兆头(即,您的方法做得太多),但听起来像在这种情况下,您传递了一组明确定义的项来迭代他们以某种方式。鉴于C#3中的集合初始值设定器语法,我会在几乎所有情况下推荐IEnumerable,而不是像参数Type a, Type b, Type c...那样。

当然,如果你的参数实际上被区别对待,那么将它们分开是有道理的,但我会考虑你在这种情况下做了什么。想到一个简单的例子就是构建一个树型数据结构并具有构建节点子项的功能。一个可怜的语法可能是:

Node BuildTree(Node parent, Node child1, Node child2...) 

我可能会追求更多的东西一样:

void ConstructChildren(this Node parent, IEnumerable<Node> children) 

如果你能提供更多有关你的情况,不过,您要执行什么样的逻辑这些参数,可能会更容易看出它是否适合折叠或重构。

+0

我想采取这些参数,并将它们导出到一个XML文件。我的膝盖反应只是简单地把它们全部串起来,但在看了你的例子之后,我认为最好包括这个类型。这就是说,每个参数都会有所不同。 myCar(Seat bucket,Rims Spinners,Name Hoopdie)尽管可能有多个使用相同类型的参数。 – Ryan 2010-06-03 13:09:01

+1

使用原生XML序列化器还是自定义?无论哪种方式,如果您使用本机串行器或IEnumerable ,假设您有一个基本实体类(您的自定义序列化逻辑所在的位置)(我的经验是常见的),则可能采用IEnumerable 。 – 2010-06-03 13:35:25

+0

IXMLSerializer和谢谢你! – Ryan 2010-06-03 13:51:59

2

如果您将传递未知数量的参数,则应使用varargs或传递IEnumerable。当然,有时候您会传递相同类型的固定数量的项目。在后一种情况下,固定数字应该遵循方法的目的。

3

我尝试将其限制为4左右。有些人说更少,有些人说更多。

以吨参数另一种方法是创建一个操作类,如更换:

func(boo, far, lint, pizza, flags); 

var action = new DoSomethingObject(boo, far, lint); 
action.Food = pizza; 
action.Go(flags); 

这个拥有功能的一些优势:

  • 如果某些参数是可选的,则可以将它们公开为属性(如上面的pizza)。
  • 如果你的函数需要这么多参数,它很可能会被分解成更小的函数。课堂可以帮助你干净地做到这一点。
+0

如果你的API有许多接受许多参数的方法会怎样?每个方法创建一个“数据容器”类似乎是合适的吗?这个类的唯一目的是在传递给它的匹配方法时使用,而不是别的。 – 2012-05-15 19:24:33

9

Steve McConnell在Code Complete中提到了这一点,理由是研究表明人们一次不能处理七个以上的信息,使得七个常识性的限制在任何实际的地方都是如此。

在该节(178页第二版)的最后一段中,他写道:

如果你发现自己一直 通过以上几个参数的更多,你的程序中 耦合太 紧...如果你传递相同的 数据到许多不同的例程,组 例程成一个类,并把 常用的数据作为类 数据。

1

此外,更大的通话现场的可读性,你可以使用一个PARAMS参数列表(前面提到的可变参数),所以不是

void ConstructChildren(Node parent, IEnumerable<Node> children) 
.... 
List<Node> children = new List<Node> {child1, child2, child3}; 
ConstructChildren(parent, children); 

我会用

void ConstructChildren(Node parent, params Node[] children) 
... 
ConstructChildren(parent, child1, child2, child3); 

然而,如果在子集合中使用更多的5-6-7项目,参数语法会变得很难看。

相关问题