Является ли это хорошо известным шаблоном дизайна? Как это называется?
Я часто это видел в коде, но когда я говорю об этом, я не знаю названия для такого "шаблона"
У меня есть метод с 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".
В этой последней цитате прямо предлагается, что поддержка языка для аргументов по умолчанию является гораздо лучшей альтернативой.
Ответ 2
Имя, которое перегружает, и это не шаблон проектирования, а функция ООП
http://en.wikipedia.org/wiki/Method_overloading
Ответ 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;
}