多种方法,还是多个参数?

3

好的,我在这里设计一个类,并且有两个选项。我可以编写多个方法或编写一个单一的方法,该方法接受枚举作为参数。

我正在尝试找出最好的方法。

让我们举一个例子:

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而言,它们并不那么糟糕,因为代码基本上调用内部方法,所以只有对用户可见的内容供他们选择。

那么你更喜欢哪一个,为什么?是否已经有相关的指导方针了?


您介意为您的示例提供更具体的例子吗?特别是Options和DoStuff的性质?这样至少可以消除猜测,以便更好地回答您的问题。 - Seh Hui Leong
7个回答

3

2

对我来说,有多种方法。

  • 从开发者的角度来看,我不必维护一个方法/命令代码的枚举和DoStuff()内部的switch case。
  • 从客户端的角度来看,我认为这并不重要。

更新:如果这个类并不是真正执行工作而是更像是一个转发器/将工作委托给正确的对象,则我会考虑实现Command Design Pattern,正如有人在这里正确指出的那样。


0
在第二种情况下,如果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设为私有或受保护),并按照

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

0

这取决于您的选项有多相似。如果您的算法/方法会根据选项而发生很大变化,那么最好使用多个方法。如果相对相似,则使用枚举。


0

当方法中的大部分代码与枚举选项(Option)只指定方法行为的小变化有关时,我只会使用第二个选项(即参数)。当选项会大大改变函数效果时,最好使用单独的方法。这使得代码更易读,并且您可能会在函数中使用某种情况语句,从而使事情比必要的复杂。

我认为使用选项参数的好例子是“GetData”函数,其中选项参数仅指定数据来自哪里(即来自当前数据库还是来自档案),但两种情况下的其余机制都相同。


0

你需要考虑每个执行路径的目的。选项1、2和3的行为非常相似,只有细微的差别吗?还是所有三个选项都不同,以更重要的方式改变?即使每个选项都很相似,表示这些选项的操作的更清晰的方法是什么?具有Option1、Option2和Option3值的枚举非常模糊。

你还应该问自己...我会停留在三个选项吗?未来需要超过三个的可能性是多少?你需要更多吗?也许需要更多面向对象的方法。

有许多工具可以帮助您决定解决问题所需的内容。 设计模式, 反模式,以及可能重构书籍可以提供一些解决问题的思路。


0
如果DoStuffX()方法有共同的功能,我会使用枚举。如果没有共同点,那么我会使用单独的方法来避免if-else/switch语句。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接