这是一个众所周知的设计模式吗?它叫什么名字?

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"方法.

最后一句话直接提出对默认参数的语言支持是一个更好的选择.


Cla*_*edi 20

它的名称是重载,它不是一个设计模式,而是一个OOP功能

http://en.wikipedia.org/wiki/Method_overloading


Dan*_*iel 7

不,这不是四个帮派中的设计模式,但在许多语言中通常不允许默认参数.

在像ruby这样的语言中,你可以做类似的事情如下

  def dowork(name, phoneNumber, emailAddress = '')
    # code here
  end
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 5

这是辅助方法的一个例子.Sheesh人,不在四人帮书中并不能阻止它成为一种模式.在特定情况下,帮助器是公共的并且help方法是私有的,这是封装的一个例子.在这种情况下可能有点过多的封装.