Является ли это хорошо известным шаблоном дизайна? Как это называется?

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

У меня есть метод с 2 аргументами, который вызывает перегруженный метод, который имеет 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
}

Причина, по которой я делаю это, - не дублировать код и разрешить существующим вызывающим абонентам по-прежнему вызывать метод с двумя параметрами.

Является ли это шаблоном и имеет ли оно имя?

Ответ 1

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


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

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

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


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

Обратите внимание, что методы и конструкторы находятся в "телескопическом" порядке, что означает сначала форму "без аргумента", затем форму "1 arg", затем форму "2 arg" и т.д.


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

Телескопические методы

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Я бы сказал, что это в значительной степени С# < 4 работают из-за отсутствия аргументов по умолчанию. если вы пропишитесь на тему "Модели отсутствуют языковые особенности", то я думаю, вы могли бы сказать ее образец, хотя и не тот, который обычно получает имя.

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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