我经常在代码中看到这个,但是当我说到它时,我不知道这种'模式'的名称
我有一个带有2个参数的方法,它调用一个有3个参数的重载方法,故意将第3个参数设置为空字符串。
public void DoWork(string name, string phoneNumber)
{
DoWork(name, phoneNumber, string.Empty)
}
private void DoWork(string name, string phoneNumber, string emailAddress)
{
//do the work
}
我这样做的原因是不重复代码,并允许现有的调用者仍然调用只有2个参数的方法。
这是一种模式吗?它有一个名字吗?
答案 0 :(得分:34)
它实际上不仅仅是方法重载(其中通常相同的方法名称具有不同的参数 types ),这个特定的模式 - 其中重载基本上是相同的方法,较短的一个用默认值调用较长的一个来模拟可选参数 - 被称为伸缩/伸缩模式,通常在构造函数上看到,但当然可以推广到任何方法。
有关更具权威性的引用,这里摘录自 Effective Java 2nd Edition ,第2项:面对许多构造函数参数时考虑构建器模式({{3} })
传统上,程序员使用 telescoping构造函数模式,在该模式中,您只提供构造函数所需的参数,另一个使用单个可选参数,第三个使用两个可选参数,依此类推。 ..
同样,通常在构造函数的上下文中讨论伸缩模式(例如,2-arg构造函数将有一行this(arg1, arg2, ARG3_DEFAULT);
来调用3-arg构造函数等),但我看不到为什么它也不能推广到其他方法。
另一个权威性的引用,遗憾的是没有对模式的定义:excerpt online:
注意方法和构造函数是“伸缩”顺序,这意味着首先是“no arg”形式,然后是“1 arg”形式,然后是“2 arg”形式,依此类推。
另一个随机引用,对模式有更明确的定义:Sun Developer Network: How to Write Doc Comments for the Javadoc Tool:
伸缩方法
您可能拥有一个需要一些参数的函数。最后几个论点可能并不那么重要,大多数用户都不得不弄清楚要传递给他们的内容。所以你创建了一些具有相同名称和更少参数的方法,这些方法调用了“master”方法。
最后一句话直接提出对默认参数的语言支持是一个更好的选择。
答案 1 :(得分:20)
它的名称是重载,它不是设计模式,而是OOP功能
答案 2 :(得分:7)
不,这不是四人帮中的设计模式,但在许多语言中不常见默认参数。
在像ruby这样的语言中,您可以执行以下类似的操作
def dowork(name, phoneNumber, emailAddress = '')
# code here
end
答案 3 :(得分:5)
这是辅助方法的一个例子。 Sheesh人,不在四人帮书中并不能阻止它成为一种模式。在特定情况下,帮助器是公共的并且help方法是私有的,这是封装的一个例子。在这种情况下可能有点过多的封装。
答案 4 :(得分:4)
我会说这几乎是一个c#< 4解决缺乏默认参数的问题。如果你开出“模式缺少语言特征”的思路,我想你可以说它是一种模式,虽然不是通常被命名的模式。
编辑:确定你的更新确实抛出了我,我没有看到你正在尝试使用调用私有方法的公共方法。就公共API而言,您可以将所有私有方法代码移动到公共方法中,并为“默认”值设置局部变量。或者这两种方法也是从类中的其他地方调用的?
答案 5 :(得分:3)
我猜你的DoWork
方法应该被调用CreateContact
,或者你对CreateContact
的调用应该是DoWork
......
但这不是真正的模式。这只是method overloading 的常见用法。
答案 6 :(得分:3)
它被称为函数重载。函数重载函数的名称是相同的,但它们在参数类型或参数数量上都不同。它也被称为假多态。它不是一种模式,它是一种基本的OOP概念。
答案 7 :(得分:2)
我同意@polygenelubricants,但我想指出,伸缩模式可以用于超载。一个例子是Objective-C,其中方法选择器(签名)必须是唯一的并且不能重载。
- (id)init {
return [self initWithParam:0];
}
- (id)initWithParam:(int)param {
// Do real initialization here!
return self;
}