|
Пример удален
Я удалил следующий пример и заменил его своим, который я перевел с французской версии . Не стесняйтесь вернуться, если у вас есть причины для этого. Если нет, не стесняйтесь поправлять мой английский :)
<удаленный материал>
Например, учитывая скелет для общих операций со структурами данных, может быть несколько общих операций, а некоторые специфичны для структуры данных. Класс шаблона структуры данных может предоставить шаблон для каждого вновь добавленного класса структуры данных.
класс CDatastructure_Template { // Общие операции: шаблон алгоритма void virtual CleanAll () = 0; void virtual AddNode (Узел * узел) = 0; void virtual DeleteNode (Узел * узел) = 0; длинный виртуальный GetNumElements () = 0; Узел * виртуальный GetTopNode () = 0; Узел * виртуальный GetNextNode (Узел * CurrentNode) = 0;};class CLinkList_ConcTemplate: общедоступный Datastructure_Template; class CQueue_ConcTemplate: общедоступный Datastructure_Template; класс CArray_ConcTemplate: общедоступный Datastructure_Template; class CTree_ConcTemplate: общедоступный Datastructure_Template;
Новый класс структуры данных может быть получен из CLinkList_ConcTemplate , при необходимости изменяя операции.
Шаблон сверстников
Шаблон Peer пытается решить те же или похожие проблемы, что и шаблон метода Template, но использует композицию объектов вместо полиморфизма (информатика) . Фактически, вы могли бы просто назвать это простой старой композицией.
Позвольте мне изменить метод шаблона в нашем примере:
/ * Шаблонный метод: * / final void playOneGame (int playerCount) { this.playersCount = playerCount; initializeGame (); int j = 0; while (! endOfGame ()) { makePlay (j); updateDisplay (); j = (j + 1)% playerCount; } printWinner (); }
Теперь рассмотрим, что makePlay
, updateDisplay
и printWinner
несколько ортогональны друг другу. Я мог бы иметь P разных стилей игры (агрессивный, защитный и т. Д.), Отображать D на разных устройствах (графический интерфейс, командная строка, веб-браузер и т. Д.) И распечатывать победителя W разными способами (на экране, по электронной почте, так далее.). Вместо создания потенциальных подклассов P x D x W для Chess или Monopoly Game выполните рефакторинг для использования сверстников.
Продолжая пример с шахматами:
class MyChess extends Chess { // это аналоги MyChess. частные игроки Player []; частный дисплей; приватный WinnerNotifier wn; общедоступный MyChess (Player [] игроки, дисплей, уведомление WinnerNotifier) { супер(); this.players = игроки; this.display = дисплей; this.notifier = уведомитель; } void makePlay (int player) { игроки [игрок] .makePlay (); } void printWinner () { notifier.notify (); } void updateDisplay () { display.update (); } }
Теперь, предположив, что я где-то еще реализовал полиморфные подклассы Player, Display и WinnerNotifier, я могу составлять произвольные смеси MyChess. Например:
Player player [] = новый игрок [2];игроки [0] = новый AggressiveChessPlayer ();player [1] = новый DefensiveChessPlayer ();Chess myChess = new MyChess (игроки, новый CommandLineChessDisplay (), новый EmailChessWinnerNotifier ());
Помимо комбинаторных преимуществ, сверстники обеспечивают лучшую тестируемость. Вот почему:
- Коллеги более целенаправленны; например. партнер игрока принимает решения, и все.
- Одноранговые узлы существуют независимо от своего шаблонного класса. Мы можем создавать и выполнять одноранговые узлы вне их шаблонных методов.
Хотя я закрыл глаза на это в своем примере, упомянутым выше партнерам может потребоваться глубокое знание игрового состояния. Таким образом, одноранговые узлы могут стать сильно связанными со своими родительскими узлами (MyChess в моем примере). В этом случае шаблон метода шаблона может иметь больше смысла.
159.37.7.119 22:06, 22 марта 2006 г. (UTC)
- Считаете ли вы это тем же, что и шаблон стратегии ? - Беланд ( разговор ) 16:51, 30 марта 2018 г. (UTC)
Пример C ++ удален
Я только что удалил из статьи пример C ++ (BubbleSort и друзья); Я не думаю, что он предоставил какую-либо проясняющую информацию, которой не было в примере Java, а пример Java гораздо яснее - ему не хватает, как и большей части возни с C ++, virtual
и так далее, что не имеет отношения к шаблону, описанному в этой статье. (Кроме того, пример C ++ казался очень надуманным; никто не использует наследование для создания подкласса BubbleSort, написанного вручную, когда qsort()
это предоставляется стандартной библиотекой! :)
Те редакторы, которые заинтересованы в предоставлении хороших примеров кода для этой и других статей, могут ознакомиться с докладом в Википедии: Языки программирования WikiProject # Категория: статьи с предложением примеров кода и вызвать добровольцев , где я пытаюсь привлечь внимание некоторых людей к выбору несколько стандартных языков, на которых можно делать примеры кода, поэтому у нас не так много статей о "языковом супе" - как я вижу, большинство статей "Шаблоны проектирования" превратились в них! - Quuxplusone 09:38, 2 декабря 2006 г. (UTC)
- Что с примером C ++, который сейчас здесь? (21 ноября 2008 г.) Этот длинный фрагмент кода демонстрирует специализацию класса шаблона с помощью класса свойств. Он не демонстрирует шаблон метода шаблона, он просто перегружает метод (clone ()) в классе шаблона. В нем много избыточности, она не имеет ничего общего с какой-либо точкой и, конечно же, не имеет ничего общего с этой статьей. Я бы хотел, чтобы это было заменено реальным примером использования шаблонов C ++ для реализации этого шаблона. —Предыдущий комментарий без знака добавлен 217.111.33.2 ( обсуждение ) 10:47, 21 ноября 2008 г. (UTC)
- Похоже, его уже убрали. - Беланд ( разговорное ) 16:52, 30 марта 2018 г. (UTC)
Гранулярность?
Имеет ли смысл фраза «абстрактный метод - наименьшая единица детализации» в этом контексте?
Некоторые или все абстрактные методы могут быть специализированы в подклассе, абстрактный метод - это наименьшая единица гранулярности, позволяющая автору подкласса обеспечивать конкретное поведение с минимальными изменениями более широкой семантики - предшествующий беззнаковый комментарий, добавленный Мерутаком ( обсуждение • вклад ) 09:48, 19 июля 2007 г. (UTC)
- Я бы так не сказал, нет. Данные также могут быть изменены в подклассе, что, если оно влияет на унаследованный код, может рассматриваться как меньший уровень детализации. Но, безусловно, абстракция в функцию представляет собой границу на уровне детализации, который автор абстрактного класса считает полезным. - Беланд ( разговор ) 16:59, 30 марта 2018 г. (UTC)
Пример C ++ слишком сложен?
Я думаю, что пример для C ++ слишком сложен. Почему бы не использовать пример игры, также используемый для другого языка? В C ++ используются клоны и еще много чего, что не является предметом данной статьи. Я напишу лучший пример, если у меня будет время (которое реализует пример игры с шаблонами на C ++). Кроме того, большая часть стандартной библиотеки C ++ * использует * виртуальную диспетчеризацию для реализации метода шаблона. Достаточно взглянуть на ctype <>, в котором есть множество виртуальных функций do ... И функции буфера потока pub .. функции, которые в конце вызывают виртуальные функции.
Обновление: я заменил пример C ++, чтобы он делал то же самое, что и java, и добавил некоторые объяснения недостатков. —Предыдущий комментарий без подписи, добавленный 84.174.195.244 ( обсуждение ) 10:51, 29 декабря 2008 г. (UTC)
Соответствие MVC?
Я не думаю, что большая часть первого абзаца Введения верна. В частности, переопределенные функции в шаблонном методе не имеют ничего общего с «представлениями» в смысле MVC, который буквально представляет представление данных, тогда как шаблонные методы обычно относятся к алгоритмам и операциям. Если изменение реализации в производном классе представляет собой представление, то почти все в книге GoF является вариантом или подмножеством MVC. И это не то, что представляет собой MVC. Цитируя страницу MVC, он «изолирует бизнес-логику от соображений пользовательского интерфейса». Шаблонный метод (а также практически любой шаблон GoF) можно каким-то образом использовать для этого, но это лишь одно из многих приложений.
Я не понимаю, насколько здесь уместны шаблоны XSLT. Похоже, это расширяет определение шаблонного метода до чрезвычайно широких и неопределенных пропорций. Должны ли мы по той же причине называть разные веб-браузеры реализацией шаблонного метода? Думаю, нет. Килотан ( разговор ) 15:21, 2 июля 2009 (UTC)
- Я думал то же самое. Первый абзац должен идти!
- - 208.98.242.129 ( разговорное ) 23:58, 3 февраля 2010 г. (UTC)
- Я думаю, это могло объединить эту идею с обработчиком шаблонов . Я добавил сноску для читателей. Похоже, оскорбительный вводный текст уже удален. - Беланд ( разговор ) 16:55, 30 марта 2018 г. (UTC)
Скомпилировать пример Java?
Я расширил (очень красивый!) Пример Java несколькими строками, так что он компилируется без ошибок и выводит некоторые строки, специфичные для игры, при вызове из командной строки java PlayAGame Chess
или java PlayAGame Monopoly
из нее . Теперь в нем 106 строк вместо 84. Кто-нибудь заинтересован в замене исходного примера расширенным? 77.183.233.79 ( разговорное ) 13:54, 12 августа 2009 (UTC)
- Кажется, с тех пор это было полностью удалено. - Беланд ( разговор ) 16:59, 30 марта 2018 г. (UTC)
Крючковый метод
В статье не определена должным образом важность шаблонного метода для расширяемости кода. Хотя в статье упоминается метод перехвата, он не описывает и не показывает его использование для расширения поведения в подклассах. В шаблонном методе метод перехвата обычно помещается в конец алгоритма. Поведение по умолчанию для этого метода - ничего не делать. Подклассы расширяют поведение шаблона, отменяя действие по умолчанию. - Клодр ( разговор ) 21:21, 30 декабря 2012 (UTC)
- Я добавил на этот счет пояснение. - Беланд ( разговор ) 17:02, 30 марта 2018 г. (UTC)
Первоначальное описание
Первое предложение: «В разработке программного обеспечения шаблон метода шаблона - это шаблон поведенческого проектирования, который определяет программный скелет алгоритма в методе, называемом методом шаблона, который переносит некоторые шаги на подклассы». следует отнести к каноническим «Паттернам проектирования», E. Gamma et al. Это почти преступление, что статья не включает эту книгу в список литературы. - Клодр ( разговор ) 21:27, 30 декабря 2012 (UTC)
- С тех пор это было сделано. - Беланд ( разговор ) 17:04, 30 марта 2018 г. (UTC)
Пример Java
Этот раздел был отмечен тегами, и кто-то оставил в источнике следующий комментарий:
Википедия - это не список примеров. Не добавляйте сюда примеры из вашего любимого языка программирования; эта страница существует, чтобы объяснить шаблон проектирования, а не показать, как он взаимодействует с тонкостями каждого языка под солнцем. Не стесняйтесь добавлять примеры здесь: http://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Template_method
Имеются все веские причины полностью удалить этот раздел, поэтому я это сделаю. - Предшествующий неподписанный комментарий, добавленный Асоргиу ( обсуждение • вклад ) 19:50, 13 февраля 2017 г. (UTC)