繁体   English   中英

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

[英]Is this a bad practice in overloading a method?

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

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

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

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

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

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

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


如果你使用的是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,我建议你选择最后一个参数。

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

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

  1. param5可能作为Null传入 - 您可能想要编写一些代码来检查该条件并执行相应的操作。
  2. 这将阻止您稍后使用可选参数。 但你可能不关心那个。

顺便说一句,codereview.stackexchange.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执行param.Foo(),那么绝对,如果没有,那么你正在做一些额外的事情,这可能值得它自己的名字。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM