这是重载方法的错误做法吗

本文关键字:错误 重载 方法 | 更新日期: 2023-09-27 18:29:37

我有一个这样的方法,它的消费者称之为:

static public void DisplayOrderComments(param1, param2, param3, param4)

现在我为它添加了一个过载,如下所示:

static public void DisplayOrderComments(param1, param2, param3, param4, param5)
{
    DisplayOrderComments(param1, param2, param3, param4);
    param5.Foo();
}

这是一种不好的做法吗?有更好的方法吗?

这是重载方法的错误做法吗

这绝对不错——它保持代码干燥,避免不必要的重复。

这不仅不是一种糟糕的做法,而且是一种好的做法。


如果您使用的是C#4.0及更高版本(VS 2010+),您可以为param5使用一个可选参数,而不是像Mikey Mouse在这个答案中提到的那样重载。

好问题。

我想说不是,这是正常的超载。但我会把它改成这样(总是在参数最多的中实现):

static public void DisplayOrderComments(param1, param2, param3, param4)
{
   DisplayOrderComments(param1, param2, param3, param4, null);
}
static public void DisplayOrderComments(param1, param2, param3, param4, param5)
{
  ... // do the work
  if(param5!=null)
     param5.Foo();
}

是的,我不会说这很糟糕,但如果您使用的是C#4.0,我建议您将最后一个参数设置为可选参数。

你可以在这里阅读所有关于他们的信息http://msdn.microsoft.com/en-us/library/dd264739.aspx

一点也不。这是完全可以接受的,但有两个问题。

  1. param5可能以Null形式传入-您可能需要编写一些代码来检查该条件并执行适当的操作
  2. 这将阻止您以后使用可选参数。但你可能不在乎

顺便说一句,codereview.stackeexchange.com可能是解决这类问题的更好地方。

这也是为接口提供更易于使用的API的常用做法。使用具有多个参数的方法保持接口较小,但使用多个扩展方法(有时使用相同名称),这些方法提供了更容易使用的API,而不会污染接口:

interface ILog
{
   void Log(string message, int someNumber, float anotherParam, object moreParams);
}
public static class LogExtensions
{
   public void Log(ILog this log, message)
   {
      log.Log(message, 42, 0, null); 
   }
// more methods using ILog.Log like LogFormat that takes format string...
}

我认为这取决于DisplayOrderComments和param5.Foo()的作用。如果它确实参数。对于参数1到4,Foo(),那么绝对是这样,如果它没有,那么你正在做一些额外的事情,这可能值得它自己的名字。

您是否正在更改DisplayOrerComments的作用或副作用,或者只是更改其运行条件?如果你正在引入新的副作用,这可能是值得拥有的,因为它自己的函数/名称会调用DisplayOrderComments。