Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制每个方法的参数数?_C#_Design Patterns_Parameters - Fatal编程技术网

C# 限制每个方法的参数数?

C# 限制每个方法的参数数?,c#,design-patterns,parameters,C#,Design Patterns,Parameters,假设参数都是相同的类型,对于一个方法的参数数量是否有经验法则?我只是想知道我应该在哪里划界,我的选择是什么(即接口、数组等)。如果要传递未知数量的参数,应该使用或传递IEnumerable。当然,有时您会传递固定数量的相同类型的项目。在后一种情况下,固定的数字应该遵循该方法的目的。我尝试将其限制为4左右。有人少说,有人多说 大量参数的替代方案是创建一个操作类,即替换: func(boo, far, lint, pizza, flags); 与 与功能相比,这有几个优点: 如果某些参数是可选的

假设参数都是相同的类型,对于一个方法的参数数量是否有经验法则?我只是想知道我应该在哪里划界,我的选择是什么(即接口、数组等)。

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

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

大量参数的替代方案是创建一个操作类,即替换:

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

与功能相比,这有几个优点:

  • 如果某些参数是可选的,则可以将其作为属性公开(如上面的
    pizza
  • 如果你的函数有那么多的参数,那么它很可能会做很多事情,并且可以分解成更小的函数。一个类可以帮助你干净利落地完成这项工作

    • 我想说这取决于你的情况。你在对整组人做什么?例如,验证所有项目或聚合数据?在这种情况下,我会将IEnumerable作为单个参数传入

      传入大量参数可能是关注点分离不良的一个好迹象(即,您的方法做得太多),但在这种情况下,您似乎传入了一组定义良好的项,以某种方式对它们进行迭代。考虑到C#3中的集合初始值设定项语法,我建议在几乎所有情况下都使用IEnumerable,而不是类似于
      类型a、类型b、类型C的参数列表。

      当然,如果你的参数实际上是不同的,那么分离它们是有意义的,但是我会考虑你在这种情况下所做的事情。我想到的一个简单例子是构建一个树数据结构,并具有构建节点子节点的功能。糟糕的语法可能是:

      Node BuildTree( Node parent, Node child1, Node child2...)
      
      我可能会追求更像:

      void ConstructChildren( this Node parent, IEnumerable<Node> children)
      
      void构造函数子节点(此节点父节点,IEnumerable子节点)
      

      但是,如果您能提供更多关于您的案例的信息,以及您对参数执行的逻辑类型,则可能更容易看出它是否适合进行折叠或重构。

      Steve McConnell在,引用一项研究表明,人们一次处理的信息不能超过七块,这使得七块信息在任何实际情况下都成为常识限制

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

      如果你发现自己始终如一 通过不止几个论点 你的日常工作之间的耦合也是很重要的 紧。。。如果你通过了同样的考试 将数据发送到许多不同的例程、组 将例程放入一个类并进行处理 作为类的常用数据 数据


      此外,为了提高调用站点的可读性,可以使用params参数列表(前面提到的varargs),因此

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

      但是,如果在children集合中使用的项目超过5-6-7项,则params语法会变得难看。

      我想获取这些参数并将其导出到XML文件。我下意识的反应是简单地把它们都变成一个字符串,但是在看了你的例子之后,我认为最好是包含这个类型。也就是说,每个参数都是不同的。myCar(Seat bucket,Rims Spinners,Name Hoopdie),尽管可能有多个参数使用同一类型。使用本机XML序列化程序还是自定义的?无论哪种方式,如果您使用的是本机序列化程序,我可能会选择IEnumerable,如果您有一个自定义序列化逻辑所在的基本实体类(在我的经验中很常见),我可能会选择IEnumerable。如果您的API有许多接受许多参数的方法,该怎么办?为每个方法创建一个“数据容器”类似乎合适吗?此类的唯一用途是在传递给其匹配方法时使用,而不是其他。
      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);