7

Я возвращаюсь назад и вперед между C# и Java в течение последних 8 лет.Используете ли вы шаблон шаблона шаблона в языках программирования с закрытием/делегатами/указателями функций?

Одна вещь, которая меня поразила, заключается в том, что я полностью прекратил использовать шаблон шаблона «Шаблонный метод» на C#. На самом деле, в C# я подумал об этом шаблоне как о борьбе с шаблоном.

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

Возвращаясь к Java, я нахожу, что шаблон жив и здоров. Я все еще думаю, что это выглядит антикварным, но понимаю, что в java нет другого способа сделать это. Java тоже выглядит античным;)

Так как это все равно придет, почему это антипаттерн?

  • Много раз он использует вашу иерархию наследования для «неправильных причин».
  • Базовые классы имеют тенденцию к завалению всеми видами несвязанного кода.
  • Это заставляет вас блокировать дизайн, часто довольно рано в процессе разработки. (Преждевременная блокировка во многих случаях)
  • Изменение этого на более позднем этапе становится все труднее и труднее.

Таким образом, при закрытии/делегировании/указателях функций вы обычно передаете некоторую функцию вместо подкласса.

Итак, вернемся к вопросу:

Если ваш язык имеет закрытые участки/делегатов/функции, вы используете метод шаблона, и когда?

ответ

4

Когда я использовал Java, да. Но для языков с «закрытием/делегатами/функциями», Lua в моем случае, я больше не хочу, вместо этого я больше и больше склоняюсь к decoration pattern для большинства моих потребностей.

3

Да, я использую метод шаблона все время на языке программирования D. Закрытия, делегаты и указатели функций по своей природе очень слабо связаны с базовым классом. Это хорошо, когда вам нужна эта свободная муфта. С другой стороны, иногда поведение, которое вы настраиваете, по своей природе очень тесно связано с базовым классом. Такое поведение было бы бесполезным практически в любом другом контексте. В тех случаях, когда эта связь необходима, шаблон шаблона метода является самым чистым, самым простым способом выразить его.

Простой тест заключается в том, что вы всегда должны использовать указатели стратегий/закрытий/делегатов/указателей функций, если связь между базовым классом и настраиваемым поведением является однонаправленной, то есть базовый класс вызывает настраиваемое поведение и все. Если настраиваемое поведение требует ссылки на базовый класс, чтобы он мог вызывать методы и т. Д., Шаблон шаблона шаблона часто является самым простым способом.

+0

Не забудьте прочитать ваш ответ. Не могли бы вы привести пример того, где шаблон шаблона метода «абсолютно» лучший, особенно если связь хорошая? Только предполагаемое сцепление всегда плохо! – rpattabi

+0

@ragu: Дело в том, что связь хорошая или плохая. Дело в том, необходимо ли это или нет. Если это необходимо, то ИМХО самый простой способ выразить это шаблонный метод. – dsimcha

+0

Насколько я понимаю, вы пытаетесь ответить на вопрос в руке. Мой вопрос носит общий характер. Для меня сцепление в шаблоне шаблона - плохой побочный эффект. Какие примеры сцепления хороши? – rpattabi

2

Я добавлю еще один ответ, в то время как я пересматриваю эту тему:

Узор шаблонного метода лучше, чем шаблон стратегии, когда политика вы настройка вашего базовый объекта с необходимостью знать друг о друге и может иметь смысл только в очень ограниченном подмножестве всех возможных комбинаций. Например, предположим, что ваш базовый класс имеет конкретную функцию doIt() и крючки beforeDoIt(), предназначенные для инициализации политик и afterDoIt(), предназначенные для того, чтобы политики могли очищаться после себя.Вы не хотели бы устанавливать эти поведения самостоятельно, потому что они имеют смысл только при паре.