Действительно ли это - известный шаблон разработки? Каково его имя?

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

У меня есть метод с 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 параметра.

Действительно ли это - шаблон, и он имеет имя?

21
задан polygenelubricants 20 May 2010 в 14:04
поделиться

8 ответов

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


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

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

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


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

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


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

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

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

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

35
ответ дан 29 November 2019 в 06:16
поделиться

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

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

4
ответ дан 29 November 2019 в 06:16
поделиться

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

5
ответ дан 29 November 2019 в 06:16
поделиться

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

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

20
ответ дан 29 November 2019 в 06:16
поделиться

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

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

  def dowork(name, phoneNumber, emailAddress = '')
    # code here
  end
7
ответ дан 29 November 2019 в 06:16
поделиться

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

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

3
ответ дан 29 November 2019 в 06:16
поделиться

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

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

- (id)initWithParam:(int)param {
    // Do real initialization here!
    return self;
}
2
ответ дан 29 November 2019 в 06:16
поделиться

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

3
ответ дан 29 November 2019 в 06:16
поделиться