这是重载方法的错误做法吗
本文关键字:错误 重载 方法 | 更新日期: 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
一点也不。这是完全可以接受的,但有两个问题。
- param5可能以Null形式传入-您可能需要编写一些代码来检查该条件并执行适当的操作
- 这将阻止您以后使用可选参数。但你可能不在乎
顺便说一句,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。