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

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

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

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

20 голосов | спросил GenEric35 14 PMpWed, 14 Apr 2010 16:25:21 +040025Wednesday 2010, 16:25:21

8 ответов


0

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


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

  

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

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


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

  

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


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

  

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

     

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

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

ответил polygenelubricants 14 PMpWed, 14 Apr 2010 16:54:17 +040054Wednesday 2010, 16:54:17
0

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

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

ответил Claudio Redi 14 PMpWed, 14 Apr 2010 16:27:30 +040027Wednesday 2010, 16:27:30
0

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

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

  def dowork(name, phoneNumber, emailAddress = '')
    # code here
  end
ответил Daniel 14 PMpWed, 14 Apr 2010 16:29:07 +040029Wednesday 2010, 16:29:07
0

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

ответил Steve 14 PMpWed, 14 Apr 2010 16:54:28 +040054Wednesday 2010, 16:54:28
0

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

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

ответил jk. 14 PMpWed, 14 Apr 2010 16:30:57 +040030Wednesday 2010, 16:30:57
0

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

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

ответил Justin Niessner 14 PMpWed, 14 Apr 2010 16:28:07 +040028Wednesday 2010, 16:28:07
0

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

ответил MAS1 14 PMpWed, 14 Apr 2010 16:34:45 +040034Wednesday 2010, 16:34:45
0

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

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

- (id)initWithParam:(int)param {
    // Do real initialization here!
    return self;
}
ответил mbmcavoy 15 PMpThu, 15 Apr 2010 20:35:30 +040035Thursday 2010, 20:35:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132