这是重载方法的不好做法吗?

时间:2012-03-30 15:46:41

标签: c#

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

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

现在我为它添加了一个重载:

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

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

6 个答案:

答案 0 :(得分:28)

这绝对没问题 - 它会保留代码DRY并避免不必要的重复。

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


如果您使用的是C#4.0及更高版本(VS 2010+),则可以使用param5代替{{1}}而不是重载,正如Mikey Mouse在optional argument中提到的那样。

答案 1 :(得分:20)

好问题。

我会说不,这是正常的重载。但我会这样改变它(总是在具有大多数参数的那个中实现):

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();
}

答案 2 :(得分:7)

是的,我不是说它很糟糕,但是如果你使用的是C#4.0,我建议你选择最后一个参数。

你可以在这里阅读所有关于em的内容 http://msdn.microsoft.com/en-us/library/dd264739.aspx

答案 3 :(得分:4)

完全没有。这是完全可以接受的,但有两个问题。

  1. param5可能会作为Null传入 - 您可能想要编写一些代码来检查该条件并执行相应的操作。
  2. 这将阻止您稍后使用可选参数。但你可能不在乎。
  3. 顺便说一句,codereview.stackexchange.com可能是解决此类问题的更好地方。

答案 4 :(得分:2)

这也是为界面提供更易于使用的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...
}

答案 5 :(得分:1)

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

您是在更改DisplayOrerComments的功能或副作用,还是只是运行它的条件?如果您正在引入新的副作用,那么可能值得拥有,因为它自己的函数/名称然后调用DisplayOrderComments。