C# 多个方法,还是多个参数?

C# 多个方法,还是多个参数?,c#,parameters,methods,C#,Parameters,Methods,好的,我在这里设计一个类,我有两个选择。我可以编写多个方法,也可以编写一个使用枚举的方法 我在想最好的办法 让我们举一个例子: public class myClass { ... public void DoStuff1() { ... Do Stuff ... } public void DoStuff2() { ... Do Stuff ... } public void DoStuff3() { ... Do Stuff ... } }

好的,我在这里设计一个类,我有两个选择。我可以编写多个方法,也可以编写一个使用枚举的方法

我在想最好的办法

让我们举一个例子:

public class myClass
{ ...
    public void DoStuff1()
    { ... Do Stuff ... }

    public void DoStuff2()
    { ... Do Stuff ... }

    public void DoStuff3()
    { ... Do Stuff ... }
}
好的,所有这些都是有意义的,现在另一种方法是:

public class myClass
{ ...

    public Enum Option
    {
        Option1,
        Option2,
        Option3
    }

    public void DoStuff(Option option)
    { ... Do Stuff ... }
}
就DRY而言,它们并没有那么糟糕,因为代码基本上都调用内部方法,所以它只是用户可以选择的


那么,您更喜欢哪一个“为什么”,并且已经有了相关的指导原则吗?

这取决于您的选项有多相似。从这个意义上说,如果您的算法/方法将根据选项发生剧烈变化,那么最好使用多种方法。如果它相对相似,那么就使用枚举。

我只会在方法中的大多数代码以某种方式相关时使用第二个选项(所以参数),而枚举选项只指定方法行为中的一个小变化。当该选项将彻底改变函数的效果时,最好使用单独的方法。它使代码更具可读性,而且您可能会在函数中使用某种case语句,从而使事情比需要的更复杂


我认为使用选项参数的一个很好的例子是“GetData”函数,其中选项参数只指定数据来自何处(即来自当前数据库或档案),但其余的机制对于这两种情况都是相同的。

是我自己还是我真的闻到了这里的味道?

对我来说是多种方法

  • 从开发人员的角度来看,我不必在DoStuff()中维护方法/命令代码的枚举和开关用例
  • 从客户的角度来看,我认为这没什么大不了的

更新:如果这个类不是在做实际的工作,更像是一个转发器/将工作委托给正确的对象,那么我会像这里有人正确指出的那样考虑实现。

您需要考虑每个执行路径的用途。选项1、2和3的行为是否非常相似,只是在一些小的方面发生了变化?或者这三种选择是否都不同,以更重要的方式变化?即使每个选项都是相似的,但如何更清晰地表示这些选项的操作?值为Option1、Option2和Option3的枚举非常有用

你也应该问问自己……我会在三个选项上停下来吗?未来需要超过三个的可能性有多大?你还需要更多吗?也许需要一种更面向对象的方法


有很多工具可以帮助您决定解决问题需要什么,并且可能有助于提供一些解决问题的燃料。

在第二种情况下,如果DoStuff看起来像这样的话

public void DoStuff(Option option)
{ 
  switch (option)
  {
     case Option1: /* Stuff 1 */ break;
     case Option2: /* Stuff 2 */ break;
     case Option3: /* Stuff 3 */ break;
  }
}
那可能不是个好主意。但最重要的方面是:对于使用该类的其他类,哪一个API更好?很难说,因为这是一个抽象的例子。如果第二个选项更有意义,您仍然可以实现第一个方法(使DoStuff1..DoStuff3私有或受保护),并实现DoStuff,如中所示

public void DoStuff(Option option)
{ 
  switch (option)
  {
     case Option1: DoStuff1(); break;
     case Option2: DoStuff2(); break;
     case Option3: DoStuff3(); break;
  }
}

如果DoStuffX()方法具有公共功能,我将使用枚举。如果没有共同点,那么我将使用单独的方法来避免If-else/switch stmts。

您是否介意为您的示例制作一个更具体的示例,尤其是选项和dostuf的性质?至少它消除了给你一个更好答案的猜测。