Многоразовый дизайн для написания кода, который обеспечивает четко определенную функцию
В программной инженерии шаблон проектирования описывает относительно небольшой, четко определенный аспект (т. е. функциональность) компьютерной программы с точки зрения того, как писать код .
Использование шаблона направлено на использование существующей концепции , а не на ее переизобретение . Это может сократить время разработки программного обеспечения и повысить качество получаемой программы.
Примечательно, что шаблон не состоит из программного артефакта . Большинство ресурсов разработки, которые использует программист , включают настройку кодовой базы для использования артефакта; например, библиотеки . Напротив, для использования шаблона программист пишет код, как описано в шаблоне. Результат каждый раз уникален, даже если результат может быть распознан как основанный на шаблоне.
Некоторые считают использование шаблонов лучшим методом проектирования программного обеспечения . Некоторые рассматривают использование шаблонов проектирования как структурированный подход к программированию .
Концептуально шаблон проектирования можно описать как более конкретный, чем парадигма программирования , и менее конкретный, чем алгоритм .
История
Паттерны возникли как архитектурная концепция Кристофера Александера еще в 1977 году в A Pattern Language (см. его статью "The Pattern of Streets", JOURNAL OF THE AIP, сентябрь 1966 г., том 32, № 5, стр. 273–278). В 1987 году Кент Бек и Уорд Каннингем начали экспериментировать с идеей применения паттернов к программированию — в частности, языков паттернов — и представили свои результаты на конференции OOPSLA в том же году. [1] [2] В последующие годы Бек, Каннингем и другие продолжили эту работу.
Шаблоны проектирования приобрели популярность в информатике после того, как в 1994 году так называемая «Банда четырех» (Гамма и др.) опубликовала книгу « Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения », которую часто сокращают до «GoF». В том же году прошла первая конференция Pattern Languages of Programming , а в следующем году был создан Portland Pattern Repository для документирования шаблонов проектирования. Область применения термина остается предметом споров. Известные книги в жанре шаблонов проектирования включают:
- Гамма, Эрих ; Хелм, Ричард ; Джонсон, Ральф ; Влиссидес, Джон (1994). Шаблоны проектирования: элементы повторно используемого объектно-ориентированного программного обеспечения . Addison-Wesley . ISBN 978-0-201-63361-0.
- Brinch Hansen, Per (1995). Исследования в области вычислительной науки: парадигмы параллельного программирования . Prentice Hall. ISBN 978-0-13-439324-7.
- Бушманн, Франк; Менье, Регина; Ронерт, Ганс; Соммерлад, Питер (1996). Шаблонно-ориентированная архитектура программного обеспечения, Том 1: Система шаблонов . Джон Уайли и сыновья. ISBN 978-0-471-95869-7.
- Бек, Кент (1997). Smalltalk Best Practice Patterns . Prentice Hall. ISBN 978-0134769042.
- Шмидт, Дуглас К.; Стал, Майкл; Ронерт, Ганс; Бушманн, Франк (2000). Архитектура программного обеспечения, ориентированная на шаблоны, том 2: Шаблоны для параллельных и сетевых объектов . John Wiley & Sons. ISBN 978-0-471-60695-6.
- Фаулер, Мартин (2002). Модели архитектуры корпоративных приложений . Addison-Wesley . ISBN 978-0-321-12742-6.
- Хохпе, Грегор; Вульф, Бобби (2003). Шаблоны интеграции предприятий: проектирование, построение и развертывание решений для обмена сообщениями . Addison-Wesley . ISBN 978-0-321-20068-6.
- Фримен, Эрик Т.; Робсон, Элизабет; Бейтс, Берт; Сьерра, Кэти (2004). Шаблоны проектирования Head First . O'Reilly Media . ISBN 978-0-596-00712-6.
- Ларман, Крейг (2004). Применение UML и шаблонов (3-е изд., 1-е изд. 1995) . Пирсон. ISBN 978-0131489066.
Хотя шаблоны проектирования применяются на практике уже давно, формализация концепции шаблонов проектирования затянулась на несколько лет. [3]
Упражняться
Шаблоны проектирования могут ускорить процесс разработки, предоставляя проверенные парадигмы разработки. [4] Эффективное проектирование программного обеспечения требует рассмотрения проблем, которые могут не проявиться до поздней стадии реализации. Свеженаписанный код часто может иметь скрытые, тонкие проблемы, обнаружение которых занимает время; проблемы, которые иногда могут вызвать серьезные проблемы в будущем. Повторное использование шаблонов проектирования может помочь предотвратить такие проблемы, [5] и улучшить читаемость кода для тех, кто знаком с шаблонами.
Методы проектирования программного обеспечения трудно применять к более широкому кругу проблем. [ необходима ссылка ] Шаблоны проектирования предоставляют общие решения, задокументированные в формате, который не требует конкретики, привязанной к конкретной проблеме.
В 1996 году Кристофер Александр был приглашен выступить с программной речью на съезде OOPSLA 1996 года. Здесь он размышлял о том, как развивалась его работа над шаблонами в архитектуре, и о своих надеждах на то, как сообщество разработчиков программного обеспечения может помочь архитектуре расширить шаблоны для создания живых структур, использующих генеративные схемы, которые больше похожи на компьютерный код.
Мотив
Шаблон описывает мотив дизайна , также известный как прототипическая микроархитектура , как набор компонентов программы (например, классов, методов...) и их взаимосвязей. Разработчик адаптирует мотив к своей кодовой базе для решения проблемы, описанной шаблоном. Полученный код имеет структуру и организацию, схожие с выбранным мотивом.
Шаблоны, специфичные для домена
Также были предприняты усилия по кодификации шаблонов дизайна в определенных доменах, включая использование существующих шаблонов дизайна, а также шаблонов дизайна, специфичных для домена. Примерами являются шаблоны дизайна пользовательского интерфейса , [6] визуализация информации , [7] безопасный дизайн, [8] «безопасное удобство использования», [9] веб-дизайн [10] и дизайн бизнес-моделей. [11]
Ежегодные материалы конференции Pattern Languages of Programming [12] включают множество примеров шаблонов, специфичных для предметной области.
Объектно-ориентированное программирование
Объектно-ориентированные шаблоны проектирования обычно показывают отношения и взаимодействия между классами или объектами , не указывая конечные классы или объекты приложения, которые задействованы. Шаблоны, подразумевающие изменяемое состояние, могут быть неподходящими для функциональных языков программирования. Некоторые шаблоны могут оказаться ненужными в языках, имеющих встроенную поддержку для решения проблемы, которую они пытаются решить, а объектно-ориентированные шаблоны не обязательно подходят для необъектно-ориентированных языков.
Примеры
Шаблоны проектирования можно организовать в группы на основе того, какую проблему они решают. Творческие шаблоны создают объекты. Структурные шаблоны организуют классы и объекты для формирования более крупных структур, которые предоставляют новую функциональность. Поведенческие шаблоны обеспечивают связь между объектами и реализацию этих шаблонов.
Творческие модели
Структурные модели
Модели поведения
Модели параллелизма
Документация
Документация для шаблона проектирования описывает контекст, в котором используется шаблон, силы в контексте, которые шаблон стремится разрешить, и предлагаемое решение. [25] Не существует единого стандартного формата для документирования шаблонов проектирования. Скорее, различные авторы шаблонов использовали множество различных форматов. Однако, по словам Мартина Фаулера , некоторые формы шаблонов стали более известными, чем другие, и, следовательно, стали общими отправными точками для новых усилий по написанию шаблонов. [26] Одним из примеров широко используемого формата документации является тот, который использовали Эрих Гамма , Ричард Хелм , Ральф Джонсон и Джон Влиссидес в своей книге Design Patterns . Она содержит следующие разделы:
- Название и классификация модели: Описательное и уникальное название, помогающее идентифицировать модель и ссылаться на нее.
- Цель: Описание цели шаблона и причины его использования.
- Также известно как: Другие названия узора.
- Мотивация (Силы): Сценарий, состоящий из проблемы и контекста, в котором этот шаблон может быть использован.
- Применимость: Ситуации, в которых этот шаблон применим; контекст для шаблона.
- Структура: Графическое представление шаблона. Для этой цели могут использоваться диаграммы классов и диаграммы взаимодействия .
- Участники: список классов и объектов, используемых в шаблоне, и их роли в дизайне.
- Взаимодействие: описание того, как классы и объекты, используемые в шаблоне, взаимодействуют друг с другом.
- Последствия: описание результатов, побочных эффектов и компромиссов, вызванных использованием шаблона.
- Реализация: Описание реализации шаблона; часть решения шаблона.
- Пример кода: Иллюстрация того, как шаблон можно использовать в языке программирования.
- Известные применения: Примеры реального использования шаблона.
- Связанные паттерны: Другие паттерны, имеющие некоторую связь с паттерном; обсуждение различий между паттерном и похожими паттернами.
Критика
Некоторые предполагают, что шаблоны проектирования могут быть признаком того, что в данном языке программирования отсутствуют функции ( например, Java или C++ ). Питер Норвиг демонстрирует, что 16 из 23 шаблонов в книге Design Patterns (которая в первую очередь сосредоточена на C++) упрощены или устранены (через прямую языковую поддержку) в Lisp или Dylan . [27] Связанные наблюдения были сделаны Ханнеманом и Кичалесом, которые реализовали несколько из 23 шаблонов проектирования с использованием аспектно-ориентированного языка программирования (AspectJ) и показали, что зависимости на уровне кода были удалены из реализаций 17 из 23 шаблонов проектирования и что аспектно-ориентированное программирование может упростить реализацию шаблонов проектирования. [28]
См. также эссе Пола Грэма «Месть ботаников». [29]
Неправильное использование шаблонов может привести к неоправданному увеличению сложности. [30]
По определению, шаблон должен быть запрограммирован заново в каждом приложении, которое его использует. Поскольку некоторые авторы видят в этом шаг назад от повторного использования программного обеспечения , предоставляемого компонентами , исследователи работали над тем, чтобы превратить шаблоны в компоненты. Мейер и Арноут смогли обеспечить полную или частичную компонентизацию двух третей шаблонов, которые они пытались реализовать. [31]
Для достижения гибкости шаблоны проектирования могут вводить дополнительные уровни косвенности , что может усложнить конечный проект и снизить производительность выполнения .
Смотрите также
Ссылки
- ^ Смит, Рид (октябрь 1987 г.). Панель по методологии проектирования . Приложение к Трудам OOPSLA '87. doi :10.1145/62138.62151.
Уорд предостерег от требования слишком большого программирования на, как он выразился, «высоком уровне мастеров». Он указал, что письменный «язык шаблонов» может значительно улучшить выбор и применение абстракций. Он предложил «радикальный сдвиг в бремени проектирования и реализации», основывая новую методологию на адаптации работы Кристофера Александра в языках шаблонов, и что ориентированные на программирование языки шаблонов, разработанные в
Tektronix,
значительно помогли их усилиям по разработке программного обеспечения.
- ^ Бек, Кент ; Каннингем, Уорд (сентябрь 1987 г.). Использование шаблонных языков для объектно-ориентированного программирования. Семинар OOPSLA '87 по спецификации и проектированию объектно-ориентированного программирования . Получено 26.05.2006 .
- ^ Барони, Алин Люсия; Геэнек, Янн-Гаэль; Альбин-Амио, Эрве (июнь 2003 г.). Формализация шаблонов проектирования (Отчет). Технический отчет EMN. Нант : Высшая национальная школа промышленной и горнодобывающей промышленности в Нанте. CiteSeerX 10.1.1.62.6466 . S2CID 624834 – через ResearchGate.
- ^ Бишоп, Джудит. "Шаблоны проектирования C# 3.0: используйте мощь C# 3.0 для решения реальных проблем". Книги по C# из O'Reilly Media . Получено 15.05.2012 .
Если вы хотите ускорить разработку приложений .NET, вы готовы к шаблонам проектирования C# — элегантным, общепринятым и проверенным способам решения распространенных проблем программирования.
- ^ Tiako, Pierre F. (31 марта 2009 г.). "Формальное моделирование и спецификация шаблонов проектирования с использованием RTPA". В Tiako, Pierre F (ред.). Программные приложения: концепции, методологии, инструменты и приложения: концепции, методологии, инструменты и приложения . стр. 636. doi :10.4018/978-1-60566-060-8. ISBN 9781605660615.
- ^ Лааксо, Сари А. (2003-09-16). «Коллекция шаблонов проектирования пользовательского интерфейса». Университет Хельсинки, кафедра компьютерных наук . Получено 2008-01-31 .
- ^ Хир, Дж.; Агравала, М. (2006). «Шаблоны проектирования программного обеспечения для визуализации информации». Труды IEEE по визуализации и компьютерной графике . 12 (5): 853–60. CiteSeerX 10.1.1.121.4534 . doi :10.1109/TVCG.2006.178. PMID 17080809. S2CID 11634997.
- ^ Догерти, Чад; Сейр, Кирк; Сикорд, Роберт С.; Свобода, Дэвид; Тогаси, Казуя (2009). Шаблоны безопасного проектирования (PDF) . Институт программной инженерии.
- ^ Гарфинкель, Симсон Л. (2005). Принципы и шаблоны проектирования компьютерных систем, которые одновременно безопасны и удобны в использовании (диссертация на соискание ученой степени доктора философии).
- ^ "Yahoo! Design Pattern Library". Архивировано из оригинала 29-02-2008 . Получено 31-01-2008 .
- ^ «Как разработать бизнес-модель для бережливого стартапа?». 2010-01-06 . Получено 2010-01-06 .
- ^ Шаблонные языки программирования, Труды конференции (ежегодно, 1994—) [1]
- ^ abc Макконнелл, Стив (июнь 2004). «Проектирование в строительстве». Code Complete (2-е изд.). Microsoft Press . стр. 104. ISBN 978-0-7356-1967-8Таблица
5.1 Популярные шаблоны проектирования
- ^ ab Fowler, Martin (2002). Patterns of Enterprise Application Architecture. Addison-Wesley . ISBN 978-0-321-12742-6.
- ^ Alur, Deepak; Crupi, John; Malks, Dan (2003). Основные шаблоны J2EE: лучшие практики и стратегии проектирования. Prentice Hall . стр. 166. ISBN 978-0-13-142246-9.
- ^ Фаулер, Мартин (2002). Модели архитектуры корпоративных приложений. Addison-Wesley . стр. 344. ISBN 978-0-321-12742-6.
- ^ Блох, Джошуа (2008). "Пункт 37: Используйте интерфейсы маркеров для определения типов". Effective Java (Второе изд.). Addison-Wesley. стр. 179. ISBN 978-0-321-35668-0.
- ^ «Близнецы — шаблон проектирования для моделирования множественного наследования» (PDF) .
- ^ Шмидт, Дуглас К.; Стал, Майкл; Ронерт, Ганс; Бушманн, Франк (2000). Архитектура программного обеспечения, ориентированная на шаблоны, том 2: Шаблоны для параллельных и сетевых объектов . John Wiley & Sons. ISBN 978-0-471-60695-6.
- ^ Свойства привязки
- ^ Нагель, Кристиан; Эвьен, Билл; Глинн, Джей; Уотсон, Карли; Скиннер, Морган (2008). «Асинхронный шаблон на основе событий». Professional C# 2008. Wiley. С. 570–571. ISBN 978-0-470-19137-8.
- ^ Шаблон замка
- ^ Франкаланца, Адриан; Табоне, Джерард (октябрь 2023 г.). «ElixirST: система типов на основе сеансов для модулей Elixir». Журнал логических и алгебраических методов в программировании . 135. doi :10.1016/j.jlamp.2023.100891. S2CID 251442539.
- ^ Шмидт, Дуглас К.; Виноски, Стив (июль–август 1996 г.). «Взаимосвязи объектов: сравнение альтернативных методов программирования для многопоточных серверов CORBA (столбец 7)» (PDF) . Отчет SIGS C++ . S2CID 2654843.
- ^ Габриэль, Дик . "Определение шаблона". Архивировано из оригинала 2007-02-09 . Получено 2007-03-06 .
- ^ Фаулер, Мартин (2006-08-01). "Написание шаблонов программного обеспечения" . Получено 2007-03-06 .
- ^ Норвиг, Питер (1998). Шаблоны проектирования в динамических языках.
- ^ Ханнеманн, Ян; Кицалес, Грегор (2002). "Реализация шаблона проектирования в Java и AspectJ". Труды 17-й конференции ACM SIGPLAN по объектно-ориентированному программированию, системам, языкам и приложениям - OOPSLA '02 . OOPSLA '02. стр. 161. doi :10.1145/582419.582436. ISBN 1581134711.
- ^ Грэм, Пол (2002). "Месть ботаников" . Получено 11 августа 2012 г.
- ^ Макконнелл, Стив (2004). Code Complete: A Practical Handbook of Software Construction, 2nd Edition . Pearson Education. стр. 105. ISBN 9780735619678.
- ^ Мейер, Бертран ; Арноут, Карин (июль 2006 г.). «Компонентизация: пример посетителя» (PDF) . IEEE Computer . 39 (7): 23–30. CiteSeerX 10.1.1.62.6082 . doi :10.1109/MC.2006.227. S2CID 15328522.
Дальнейшее чтение
- Александр, Кристофер ; Ишикава, Сара; Сильверстайн, Мюррей; Якобсон, Макс; Фиксдаль-Кинг, Ингрид; Энджел, Шломо (1977). Язык шаблонов: города, здания, конструкции . Нью-Йорк: Oxford University Press. ISBN 978-0-19-501919-3.
- Alur, Deepak; Crupi, John; Malks, Dan (май 2003 г.). Основные шаблоны J2EE: лучшие практики и стратегии проектирования (2-е изд.). Prentice Hall . ISBN 978-0-13-142246-9.
- Бек, Кент (октябрь 2007 г.). Модели внедрения . Addison-Wesley . ISBN 978-0-321-41309-3.
- Бек, Кент ; Крокер, Р.; Месарош, Г.; Коплиен, Дж. О .; Доминик, Л.; Паулиш, Ф.; Влиссидес, Дж. (март 1996 г.). Труды 18-й Международной конференции по программной инженерии . С. 25–30.
- Борчерс, Ян (2001). Шаблонный подход к проектированию взаимодействия . John Wiley & Sons . ISBN 978-0-471-49828-5.
- Коплиен, Джеймс О .; Шмидт, Дуглас К. (1995). Языки шаблонов проектирования программ . Addison-Wesley . ISBN 978-0-201-60734-5.
- Коплиен, Джеймс О .; Влиссидес, Джон М .; Керт, Норман Л. (1996). Языки шаблонов проектирования программ 2. Эддисон -Уэсли . ISBN 978-0-201-89527-8.
- Элоранта, Вели-Пекка; Коскинен, Йоханнес; Леппянен, Марко; Рейонен, Вилле (2014). Проектирование распределенных систем управления: подход на языке шаблонов . Уайли. ISBN 978-1118694152.
- Фаулер, Мартин (1997). Шаблоны анализа: повторно используемые объектные модели . Addison-Wesley . ISBN 978-0-201-89542-1.
- Фаулер, Мартин (2003). Модели архитектуры корпоративных приложений . Addison-Wesley . ISBN 978-0-321-12742-6.
- Фримен, Эрик; Фримен, Элизабет; Сьерра, Кэти ; Бейтс, Берт (2004). Шаблоны проектирования Head First . O'Reilly Media . ISBN 978-0-596-00712-6.
- Хохманн, Люк; Фаулер, Мартин ; Кавасаки, Гай (2003). Beyond Software Architecture . Addison-Wesley . ISBN 978-0-201-77594-5.
- Габриэль, Ричард (1996). Patterns of Software: Tales From The Software Community (PDF) . Oxford University Press . стр. 235. ISBN 978-0-19-512123-0. Архивировано из оригинала (PDF) 2003-08-01.
- Гамма, Эрих ; Хелм, Ричард ; Джонсон, Ральф ; Влиссидес, Джон (1995). Шаблоны проектирования: элементы повторно используемого объектно-ориентированного программного обеспечения . Addison-Wesley . ISBN 978-0-201-63361-0.
- Хохпе, Грегор; Вульф, Бобби (2003). Шаблоны интеграции предприятий: проектирование, построение и развертывание решений для обмена сообщениями . Addison-Wesley . ISBN 978-0-321-20068-6.
- Голуб, Аллен (2004). Голуб по выкройкам . Апресс . ISBN 978-1-59059-388-2.
- Кирхер, Михаэль; Фёльтер, Маркус; Здун, Уве (2005). Модели удаленного взаимодействия: основы корпоративного, интернет- и распределенного объектного промежуточного программного обеспечения в реальном времени . John Wiley & Sons . ISBN 978-0-470-85662-8.
- Ларман, Крейг (2005). Применение UML и шаблонов . Prentice Hall . ISBN 978-0-13-148906-6.
- Лисков, Барбара ; Гуттаг, Джон (2000). Разработка программ на Java: абстракция, спецификация и объектно-ориентированное проектирование . Addison-Wesley . ISBN 978-0-201-65768-5.
- Манолеску, Драгос; Фёльтер, Маркус; Нобл, Джеймс (2006). Языки шаблонов проектирования программ 5 . Эддисон-Уэсли . ISBN 978-0-321-32194-7.
- Маринеску, Флойд (2002). Шаблоны проектирования EJB: Расширенные шаблоны, процессы и идиомы. John Wiley & Sons . ISBN 978-0-471-20831-0.
- Мартин, Роберт Сесил ; Риле, Дирк; Бушманн, Франк (1997). Языки шаблонов проектирования программ 3. Эддисон -Уэсли . ISBN 978-0-201-31011-5.
- Мэттсон, Тимоти Г.; Сандерс, Беверли А.; Массингилл, Берна Л. (2005). Шаблоны для параллельного программирования . Addison-Wesley. ISBN 978-0-321-22811-6.
- Shalloway, Alan; Trott, James R. (2001). Design Patterns Explained, Второе издание: Новый взгляд на объектно-ориентированное проектирование. Addison-Wesley. ISBN 978-0-321-24714-8.
- Влиссидес, Джон М. (1998). Штриховка узоров: прикладные шаблоны проектирования . Addison-Wesley . ISBN 978-0-201-43293-0.
- Weir, Charles; Noble, James (2000). Small Memory Software: Patterns for systems with limited memory. Addison-Wesley . ISBN 978-0-201-59607-6. Архивировано из оригинала 2007-06-17.