Используете ли вы шаблон метода шаблона в языках программирования с замыканиями / делегатами / указателями на функции? - PullRequest
7 голосов
/ 21 ноября 2008

Последние 8 лет я ходил туда-сюда между C # и Java.

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

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

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

Поскольку это все равно произойдет, почему это антипаттерн?

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 21 ноября 2008

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

3 голосов
/ 14 января 2010

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

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

2 голосов
/ 20 июля 2010

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

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

...