Gen*_*c35 21 c# java design-patterns overloading terminology
我经常在代码中看到这个,但是当我说到它时,我不知道这种'模式'的名称
我有一个带有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
}
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是不重复代码,并允许现有的调用者仍然调用只有2个参数的方法.
这是一种模式,它有一个名字吗?
pol*_*nts 35
它实际上不仅仅是方法重载(通常相同的方法名称具有不同的参数类型),这个特定的模式 - 其中重载基本上是相同的方法,而较短的一个调用较长的一个具有默认值来模拟可选参数 -被称为伸缩/伸缩模式,通常在建造者身上看到,但当然可以推广到任何方法.
有关更具权威性的报价,请参阅Effective Java 2nd Edition的摘录,第2项:在面对许多构造函数参数时考虑构建器模式(在线摘录)
传统上,程序员使用了伸缩构造函数模式,其中您只为所需的参数提供构造函数,另一个使用单个可选参数,第三个具有两个可选参数,依此类推......
同样,通常在构造函数的上下文中讨论伸缩模式(例如,2-arg构造函数将有一行this(arg1, arg2, ARG3_DEFAULT);来调用3-arg构造函数等),但我不明白为什么它不能推广到其他方法也是如此.
另一个权威性的引用,遗憾的是没有定义模式:Sun Developer Network:如何为Javadoc工具编写Doc注释:
注意方法和构造函数是"伸缩"顺序,这意味着首先是"no arg"形式,然后是"1 arg"形式,然后是"2 arg"形式,依此类推.
另一个随机引用,更明确的模式定义:我讨厌方法重载(你也可以!):
伸缩方法
您可能拥有一个需要一些参数的函数.最后几个论点可能并不那么重要,大多数用户都不得不弄清楚要传递给他们的内容.因此,您创建了一些具有相同名称和更少参数的方法,这些方法调用"master"方法.
最后一句话直接提出对默认参数的语言支持是一个更好的选择.
不,这不是四个帮派中的设计模式,但在许多语言中通常不允许默认参数.
在像ruby这样的语言中,你可以做类似的事情如下
def dowork(name, phoneNumber, emailAddress = '')
# code here
end
Run Code Online (Sandbox Code Playgroud)
这是辅助方法的一个例子.Sheesh人,不在四人帮书中并不能阻止它成为一种模式.在特定情况下,帮助器是公共的并且help方法是私有的,这是封装的一个例子.在这种情况下可能有点过多的封装.