Это хорошо известный шаблон дизайна? Как это называется?
Я часто видел это в коде, но когда я говорю об этом, я не знаю названия для такого "шаблона"
У меня есть метод с 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".
Эта последняя цитата прямо предполагает, что языковая поддержка аргументов по умолчанию является гораздо лучшей альтернативой.
Название это перегрузка, и это не шаблон проектирования, а функция ООП
Нет, это не шаблон проектирования в банде четырех смыслов, но он распространен во многих языках, которые не допускают параметров по умолчанию.
На таком языке, как 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;
}