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

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

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

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

Это шаблон, и у него есть имя?

8 ответов

Решение

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


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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- (id)initWithParam:(int)param {
    // Do real initialization here!
    return self;
}
Другие вопросы по тегам