假设这些参数都是相同的类型,那么对于方法的参数数量是否有一个经验法则?我只是想知道我应该在哪里画线,以及我的选择是什么(即界面,阵列等)。每种方法的参数数量是多少?
回答
我会说这真的取决于你的情况。你对整个集合做些什么?验证所有项目或汇总数据,例如?在这种情况下,我将传入一个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)
如果你能提供更多有关你的情况,不过,您要执行什么样的逻辑这些参数,可能会更容易看出它是否适合折叠或重构。
如果您将传递未知数量的参数,则应使用varargs或传递IEnumerable。当然,有时候您会传递相同类型的固定数量的项目。在后一种情况下,固定数字应该遵循方法的目的。
我尝试将其限制为4左右。有些人说更少,有些人说更多。
以吨参数另一种方法是创建一个操作类,如更换:
func(boo, far, lint, pizza, flags);
与
var action = new DoSomethingObject(boo, far, lint);
action.Food = pizza;
action.Go(flags);
这个拥有功能的一些优势:
- 如果某些参数是可选的,则可以将它们公开为属性(如上面的
pizza
)。 - 如果你的函数需要这么多参数,它很可能会被分解成更小的函数。课堂可以帮助你干净地做到这一点。
如果你的API有许多接受许多参数的方法会怎样?每个方法创建一个“数据容器”类似乎是合适的吗?这个类的唯一目的是在传递给它的匹配方法时使用,而不是别的。 – 2012-05-15 19:24:33
Steve McConnell在Code Complete中提到了这一点,理由是研究表明人们一次不能处理七个以上的信息,使得七个常识性的限制在任何实际的地方都是如此。
在该节(178页第二版)的最后一段中,他写道:
如果你发现自己一直 通过以上几个参数的更多,你的程序中 耦合太 紧...如果你传递相同的 数据到许多不同的例程,组 例程成一个类,并把 常用的数据作为类 数据。
此外,更大的通话现场的可读性,你可以使用一个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项目,参数语法会变得很难看。
- 1. 多种方法或参数?
- 2. 每种方法应该运行多少种测试方法?
- 3. java方法应该具有的参数的标准数量是多少?
- 4. 使用bca非参数方法完成引导的最小数量是多少
- 5. 验证少数方法参数的干净方法是什么?
- 6. 重载:用更少参数调用更多参数的方法
- 7. Python - 最好有多种方法或大量的可选参数?
- 8. Python类的方法的最大数量是多少?
- 9. 与BatchNormalization图层相关的参数数量是多少?
- 10. 测量的事件数量是多少?
- 11. 有没有一种方法可以找出定义的方法在该方法外有多少参数? (PHP)
- 12. 数组和多种方法
- 13. 使用一种方法与常量作为参数与几种方法
- 14. 何时使用 - 多种方法,多个参数或选项参数
- 15. jqgrid中flexigrid的参数是多少?
- 16. 有多少数据对象层是一种好的做法?
- 17. 多参数函数冗余的第一个参数的默认值是多少?
- 18. 超出方法中参数的数量
- 19. UNNotificationActions的最大数量是多少?
- 20. 每个sidekiq工人的多种方法
- 21. 具有未知数量参数的方法是否可以调用具有未知数量参数的另一种方法?
- 22. dot.Net代表有多少种方法?
- 23. 检查方法中的每个参数?
- 24. 具有多种接口限制的方法参数
- 25. 方法有很多参数
- 26. 每个函数/方法应该写多少个单元测试?
- 27. 是否可以减少样板函数中的参数数量?
- 28. 在另一种方法的参数列表中调用方法是否是Java中的一种良好做法?
- 29. 通过多种方法的java数组
- 30. 询问MethodInfo需要多少参数的最有效方法是什么?
我想采取这些参数,并将它们导出到一个XML文件。我的膝盖反应只是简单地把它们全部串起来,但在看了你的例子之后,我认为最好包括这个类型。这就是说,每个参数都会有所不同。 myCar(Seat bucket,Rims Spinners,Name Hoopdie)尽管可能有多个使用相同类型的参数。 – Ryan 2010-06-03 13:09:01
使用原生XML序列化器还是自定义?无论哪种方式,如果您使用本机串行器或IEnumerable,假设您有一个基本实体类(您的自定义序列化逻辑所在的位置)(我的经验是常见的),则可能采用IEnumerable
IXMLSerializer和谢谢你! – Ryan 2010-06-03 13:51:59