【问题标题】:One parameter or many一个或多个参数
【发布时间】:2011-08-04 11:29:51
【问题描述】:

我有两种方法:

BuildThing(Thing a);
BuildThings(IEnumerable<Thing> things);

从干净的代码的角度来看,这很好吗? 还是只使用 BuildThings 并仅通过一件事传递 IEnumerable 会更好?还是使用参数?

谢谢。

【问题讨论】:

    标签: c# methods parameters refactoring


    【解决方案1】:

    你可以做一件事:

    BuildThings(params Thing[] things);
    

    这使您可以使用:

    BuildThings(thing1, thing2, thing3, ...);
    

    【讨论】:

      【解决方案2】:

      个人喜好如下

      界面:

      void Build(Thing thing);
      void Build(IEnumerable<Thing> things);
      

      实现:

      void Build(Thing thing)
      {
          Build(new [] { thing });
      }
      
      void Build(IEnumerable<Thing> things)
      {
          //do stuff
      }
      

      我更喜欢使用此模式的原因是因为它确保您保持DRY,同时为您提供具有多个重载的灵活性,这与您必须转换任何非数组可枚举的params 方式不同到一个数组。

      【讨论】:

        【解决方案3】:

        params 对于您的方法来说不是一个好的解决方案。

        我认为只要你只有一个实现,就有 2 种或更多方法是可以的。

        public void BuildThing(Thing a)
        {
            this.BuildThings(new List<Thing>(){a});
        }
        

        【讨论】:

          【解决方案4】:

          您提供的方法似乎是一种很好的做法。当您只构建一个实例而不是多个实例时,您可能想做不同的事情。

          我不会使用params,因为这会迫使您创建一个数组,例如,如果您有一个列表。

          【讨论】:

            【解决方案5】:

            纯粹从“干净代码”的角度来看,这完全没问题。尽管从功能上讲,替代方案可能更适合您,也可能不适合您。例如,使用params 会强制在调用之前枚举集合,而不是在调用内部延迟枚举。

            【讨论】:

              【解决方案6】:

              我会考虑两种情况:

              1. 拥有这两种方法,但在BuildThing(Thing a) 中,我将使用BuildThings(IEnumerable&lt;Thing&gt; things) 并仅通过一件事传递 IEnumerable
              2. 仅使用params 创建一个方法 此选项有一个缺点 - 如果您想传递多个参数,则必须将每个 IEnumerable 转换为 Array(当然数组除外)。

              我可能会选择params 解决方案。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-07-12
                • 1970-01-01
                • 2015-05-08
                相关资源
                最近更新 更多