Это хорошо известный шаблон дизайна? Как это называется? - PullRequest
21 голосов
/ 14 апреля 2010

Я часто видел это в коде, но когда я говорю об этом, я не знаю названия для такого «шаблона»

У меня есть метод с 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 ]

35 голосов
/ 14 апреля 2010

На самом деле это больше, чем просто перегрузка метода (где обычно одно и то же имя метода имеет другой аргумент типы ), это конкретный шаблон - где перегрузки в основном являются одним и тем же методом, и более короткий вызывает более длинный со значением по умолчанию для эмуляции необязательных параметров - он называется телескопическим / телескопическим шаблоном, обычно видимым на конструкторах, но, конечно, обобщаемым для любого метода.


Для более авторитетной цитаты вот выдержка из Effective Java 2nd Edition , Элемент 2: Рассмотрите шаблон компоновщика при столкновении со многими параметрами конструктора ( выдержка онлайн )

Традиционно программисты использовали шаблон телескопического конструктора , в котором вы предоставляете конструктору только необходимые параметры, другой - с одним необязательным параметром, третий - с двумя дополнительными параметрами и т. Д. .

Опять же, обычно телескопический паттерн обсуждается в контексте конструкторов (где, например, у 2-аргументного конструктора будет одна строка this(arg1, arg2, ARG3_DEFAULT); для вызова 3-аргументного конструктора и т. Д.), Но я не понимаю, почему он не может быть обобщено и на другие методы.


Другая авторитетная цитата, к сожалению, без определения шаблона: Sun Developer Network: Как написать комментарии к документу для инструмента Javadoc :

Обратите внимание, что методы и конструкторы расположены в «телескопическом» порядке, что означает сначала форму «no arg», затем форму «1 arg», затем форму «2 arg» и т. Д.


И еще одна случайная цитата с более четким определением шаблона: Я перегружен методом ненависти (и вы тоже можете!) :

Методы телескопирования

У вас может быть функция, которая принимает некоторое количество аргументов. Последние несколько аргументов, возможно, не так уж важны, и большинство пользователей будут раздражены необходимостью выяснить, что в них передать. Таким образом, вы создаете еще несколько методов с тем же именем и меньшим количеством аргументов, которые обращаются к методу «master».

В этой последней цитате прямо предлагается, что языковая поддержка аргументов по умолчанию является гораздо лучшей альтернативой.

20 голосов
/ 14 апреля 2010

Название это перегрузка, и это не шаблон проектирования, а функция ООП

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

7 голосов
/ 14 апреля 2010

Нет, это не шаблон проектирования в банде четырех смыслов, но он распространен во многих языках, которые не допускают параметров по умолчанию.

На языке, подобном ruby, вы можете сделать что-то похожее следующим образом

  def dowork(name, phoneNumber, emailAddress = '')
    # code here
  end
5 голосов
/ 14 апреля 2010

Это пример вспомогательного метода. Люди-бродяги, не будучи в книге «Банды четырех», не перестают быть образцом. В конкретном случае, когда вспомогательный метод является общедоступным, а вспомогательный метод - закрытым, это пример инкапсуляции. Возможно, в этом случае слишком много инкапсуляции.

4 голосов
/ 14 апреля 2010

Я бы сказал, что это в значительной степени обходной путь c # <4 из-за отсутствия аргументов по умолчанию. если вы предписываете школу «паттерны отсутствуют языковые особенности», я думаю, вы могли бы сказать, что это паттерн, но не тот, который обычно называют. </p>

edit: хорошо, ваше обновление действительно меня смутило, я не вижу, что вы пытаетесь сделать с помощью открытого метода, вызывающего закрытый метод. Что касается общедоступного API, то вы можете просто переместить весь код закрытых методов в публичный метод и иметь локальную переменную для значения по умолчанию. или оба метода также вызываются из других мест в классе?

3 голосов
/ 14 апреля 2010

Это называется перегрузкой функции. В имени перегрузки функции имена функций одинаковы, но различаются по типу параметра или номеру параметра. Это также называют ложным полиморфизмом. Это не шаблон, это базовая концепция ООП.

3 голосов
/ 14 апреля 2010

Я предполагаю, что ваши DoWork методы должны называться CreateContact, или ваш вызов CreateContact должен быть DoWork ...

Но это не совсем паттерн. Это просто обычное использование перегрузки метода .

2 голосов
/ 15 апреля 2010

Я согласен с @polygenelubricants, но хотел бы отметить, что телескопическая схема может использоваться отдельно от перегрузки. Пример в Objective-C, где селекторы методов (подписи) должны быть уникальными и не могут быть перегружены.

- (id)init {
    return [self initWithParam:0];
}

- (id)initWithParam:(int)param {
    // Do real initialization here!
    return self;
}
...