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

我经常在代码中看到这个,但是当我谈到它时,我不知道这种’模式’的名称

我有一个带有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个参数的方法。

这是一种模式,它有一个名字吗?

它实际上不仅仅是方法重载( 通常相同的方法名称具有不同的参数类型 ),这个特定的模式 – 其中重载基本上是相同的方法,而较短的一个调用较长的一个具有默认值来模拟可选参数 -被称为伸缩/伸缩模式,通常在建造者身上看到,但当然可以推广到任何方法。


有关更具权威性的报价,请参阅Effective Java 2nd Edition的摘录, 第2项:在面对许多构造函数参数时考虑构建器模式 ( 在线摘录 )

传统上,程序员使用了伸缩构造函数模式,其中您只为所需的参数提供构造函数,另一个使用单个可选参数,第三个具有两个可选参数,依此类推……

同样,通常在构造函数的上下文中讨论伸缩模式(例如,2-arg构造函数将有一行this(arg1, arg2, ARG3_DEFAULT);调用3-arg构造函数等),但我不这样做看看为什么它也不能推广到其他方法。


另一个权威性的引用,遗憾的是没有定义模式: Sun Developer Network:如何为Javadoc工具编写Doc注释 :

注意方法和构造函数是“伸缩”顺序,这意味着首先是“no arg”forms,然后是“1 arg”forms,然后是“2 arg”forms,依此类推。


另一个随机引用,更明确的模式定义: 我讨厌方法重载(你也可以!) :

伸缩方法

您可能拥有一个需要一些参数的函数。 最后几个论点可能并不那么重要,而且大多数用户都不得不弄清楚要传递给他们的内容。 因此,您创建了一些具有相同名称和更少参数的方法,这些方法调用“master”方法。

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

它的名称是重载,它不是设计模式,而是OOPfunction

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

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

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

  def dowork(name, phoneNumber, emailAddress = '') # code here end 

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

我会说这是因为缺少默认参数而非常适合#4。 如果你开出“模式缺少语言特征”的思想,我想你可以说它是一种模式,虽然不是通常被命名的模式。

编辑:确定你的更新真的抛出了我,我没有看到你正在尝试使用调用私有方法的公共方法。 就公共API而言,您可以将所有私有方法代码移动到公共方法中,并为“默认”值设置局部变量。 或者这两种方法也是从class级中的其他地方调用的?

我猜你的DoWork方法应该叫做CreateContact或者你对CreateContact的调用应该是DoWork

但这不是一种模式。 它只是方法重载的常见用法

它被称为函数重载。函数重载函数的名称是相同的,但它们在参数类型或参数数量上都不同。 它也被称为假多态。 它不是一种模式,它是一种基本的OOP概念。

我同意@polygenelubricants,但是我想指出伸缩模式可以用于超载。 一个例子是Objective-C,其中方法选择器(签名)必须是唯一的并且不能重载。

 - (id)init { return [self initWithParam:0]; } - (id)initWithParam:(int)param { // Do real initialization here! return self; }