Я видел это часто в коде, но когда я говорю о нем, я не знаю название такого 'шаблона'
У меня есть метод с 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 параметра.
Действительно ли это - шаблон, и он имеет имя?
На самом деле это больше, чем просто перегрузка метода (где обычно одно и то же имя метода имеет разные аргументы типы ), этот конкретный шаблон - где перегрузки - это в основном один и тот же метод, а более короткий вызывает более длинный со значением по умолчанию для имитации необязательных параметров - называется шаблоном телескопической / телескопической, обычно видимым на конструкторах, но, конечно, можно обобщить на любой метод.
Для более авторитетной цитаты, вот выдержка из Effective Java 2nd Edition , Пункт 2: Рассмотрите шаблон построителя, когда сталкиваетесь со многими параметрами конструктора ( отрывок онлайн )
Традиционно программисты использовали шаблон телескопический конструктор , в котором вы предоставляете конструктор только с обязательными параметрами, другой - с одним необязательным параметром, третий - с двумя необязательными параметрами и т. Д. on ...
Опять же, обычно телескопический узор обсуждается в контексте конструкторов (где, например, конструктор с двумя аргументами будет иметь одну строку this (arg1, arg2, ARG3_DEFAULT);
для вызова Конструктор с 3 аргументами и т. Д.), Но я не понимаю, почему его нельзя обобщить и на другие методы.
Еще одна авторитетная цитата, к сожалению, без определения шаблона: Sun Developer Network: Как писать комментарии к документации для инструмента Javadoc :
Обратите внимание, что методы и конструкторы расположены в «телескопическом» порядке, что означает сначала форму "no arg", затем форму "1 arg", затем форму "2 arg" и так далее.
И еще одна случайная цитата с более явным определением паттерна: Я ненавижу перегрузку метода (и вы тоже можете!) :
Методы телескопирования
У вас может быть функция, которая принимает некоторое количество аргументов. Последние несколько аргументов могут быть не так уж и важны, и большинство пользователей будут раздражены, если придумают, что в них передать. Таким образом, вы создаете еще несколько методов с тем же именем и меньшим количеством аргументов, которые вызывают «главный» метод.
Эта последняя цитата прямо предполагает, что языковая поддержка аргументов по умолчанию является гораздо лучшей альтернативой.
Я бы сказал, что это в значительной степени обходной путь в C # <4 из-за отсутствия аргументов по умолчанию. Если вы прописываете школу мысли «в шаблонах отсутствуют языковые особенности», я думаю, вы могли бы сказать, что это шаблон, хотя и не тот, который обычно называют.
edit: хорошо, ваше обновление меня действительно сбило с толку, я не понимаю, что вы пытаетесь сделать с публичным методом, вызывающим частный метод. Что касается общедоступного API, вы можете просто переместить весь код частных методов в общедоступный метод и иметь локальную переменную для значения «по умолчанию». или оба метода также вызываются из других мест в классе?
Это пример вспомогательного метода. Черт побери, отсутствие в книге «Банды четырех» не перестает быть образцом. В конкретном случае, когда помощник является общедоступным, а вспомогательный метод является частным, это пример инкапсуляции. Возможно, в этом случае слишком много инкапсуляции.
Имя этого перегружает, и это не шаблон проектирования, а функция ООП
Нет, это не шаблон проектирования в четырех смыслах, но он распространен во многих языках, которые не допускают параметры по умолчанию.
На таком языке, как рубин, вы могли бы сделать что-то подобное:
def dowork(name, phoneNumber, emailAddress = '')
# code here
end
Я предполагаю, что либо ваши методы DoWork
должны называться CreateContact
, либо ваш вызов CreateContact
должен быть DoWork
...
Но на самом деле это не шаблон. Это просто обычное использование перегрузки метода .
Я согласен с @polygenelubricants, но хотел бы отметить, что телескопический рисунок можно использовать без перегрузки. Пример - в Objective-C, где селекторы методов (сигнатуры) должны быть уникальными и не могут быть перегружены.
- (id)init {
return [self initWithParam:0];
}
- (id)initWithParam:(int)param {
// Do real initialization here!
return self;
}
Это называется перегрузкой функций. В перегрузке функций имена функций одинаковы, но они различаются либо типом параметра, либо количеством параметра. Это также называется ложным полиморфизмом. Это не шаблон, это базовая концепция ООП.