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

时间:2010-04-14 12:25:22

标签: c# java design-patterns terminology overloading

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

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

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

8 个答案:

答案 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功能

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

答案 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;
}