В разработке программного обеспечения, шаблон проектирования программного обеспечения является общим, многоразовым решением часто встречающейся проблемы в заданном контексте в разработке программного обеспечения. Это не законченный проект, который можно преобразовать непосредственно в исходный или машинный код. Скорее, это описание или шаблон решения проблемы, который можно использовать во многих различных ситуациях. Шаблоны проектирования - это формализованные передовые практики, которые программист может использовать для решения типичных проблем при разработке приложения или системы.
Объектно-ориентированные шаблоны проектирования обычно показывают отношения и взаимодействия между классами или объектами, без указания конечных классов приложения или задействованных объектов. Шаблоны, предполагающие изменяемое состояние, могут не подходить для языков функционального программирования, некоторые шаблоны могут быть ненужными в языках, которые имеют встроенную поддержку для решения проблемы, которую они пытаются решить, а объектно-ориентированные шаблоны не подходят. обязательно подходит для не объектно-ориентированных языков.
Шаблоны проектирования можно рассматривать как структурированный подход к компьютерному программированию, промежуточный между уровнями парадигмы программирования и конкретным алгоритмом.
в В недавнем обзорном исследовании Wedyan и Abufakher изучают шаблоны проектирования и качество программного обеспечения и приходят к выводу: «Наше исследование показало, что первичные исследования предоставляют эмпирические данные о положительном влиянии документации экземпляров шаблонов проектирования на понимание программы, и следовательно, ремонтопригодность. Хотя этот результат не удивителен, он, тем не менее, имеет два признака. Во-первых, разработчикам следует приложить больше усилий, чтобы добавить такую документацию, даже если в форме простых комментариев в исходный код. Во-вторых, при сравнении результатов В различных исследованиях необходимо учитывать влияние документации ».
Шаблоны возникли как архитектурная концепция Кристофера Александра еще в 1966 г. (см. "Узор улиц", ЖУРНАЛ AIP, сентябрь 1966 г., т. 32, No. 3, pp. 273-278). В 1987 году Кент Бек и Уорд Каннингем начали экспериментировать с идеей применения шаблонов в программировании, в частности языков шаблонов, и представили свои результаты на Конференция OOPSLA в том году. В последующие годы Бек, Каннингем и другие продолжили эту работу.
Шаблоны проектирования приобрели популярность в информатике после того, как в 1994 году так называемой «Бригадой официантов» была опубликована книга Шаблоны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования. Четыре »(Gamma et al.), Часто сокращенно GoF. В том же году была проведена первая конференция языков программирования шаблонов, а в следующем году был создан портлендский репозиторий шаблонов для документации шаблонов проектирования. Объем термина остается предметом споров. Известные книги в жанре паттернов дизайна включают:
Несмотря на то, что шаблоны проектирования применялись практически давно, формализация концепции шаблонов проектирования застопорилась на несколько лет.
Шаблоны проектирования могут ускорить процесс разработки, предоставляя проверенные, проверенные парадигмы разработки. Эффективный дизайн программного обеспечения требует рассмотрения проблем, которые могут не проявиться до конца реализации. В недавно написанном коде часто могут быть скрытые тонкие проблемы, на обнаружение которых требуется время, проблемы, которые иногда могут вызвать серьезные проблемы в будущем. Повторное использование шаблонов проектирования помогает предотвратить такие тонкие проблемы, а также улучшает читаемость кода для программистов и архитекторов, знакомых с шаблонами.
Для достижения гибкости шаблоны проектирования обычно вводят дополнительные уровни косвенного обращения, что в некоторых случаях может усложнить конечный дизайн и снизить производительность приложения.
По определению, шаблон должен быть запрограммирован заново в каждом приложении, которое его использует. Поскольку некоторые авторы рассматривают это как шаг назад от повторного использования программного обеспечения, предусмотренного компонентами, исследователи работали над превращением шаблонов в компоненты. Мейер и Арноут смогли обеспечить полную или частичную компонентность двух третей шаблонов, которые они пытались использовать.
Методы проектирования программного обеспечения трудно применять для решения более широкого круга задач. Шаблоны проектирования обеспечивают общие решения, задокументированные в формате, который не требует специфики, привязанной к конкретной проблеме.
Шаблоны проектирования состоят из нескольких разделов (см. § Документация ниже). Особый интерес представляют разделы «Структура», «Участники» и «Сотрудничество». В этих разделах описывается мотив дизайна: прототипная микроархитектура, которую разработчики копируют и адаптируют к своим конкретным проектам для решения повторяющейся проблемы, описываемой шаблоном проектирования. Микроархитектура - это набор компонентов программы (например, классов, методов...) и их взаимосвязей. Разработчики используют шаблон проектирования, внедряя в свои проекты эту прототипную микроархитектуру, что означает, что микроархитектуры в их проектах будут иметь структуру и организацию, аналогичные выбранному шаблону дизайна.
Также были предприняты усилия по кодификации шаблонов проектирования в определенных областях, включая использование существующих шаблонов проектирования, а также шаблонов проектирования для конкретных областей. Примеры включают пользовательский интерфейс шаблоны проектирования, визуализацию информации, безопасный дизайн, «безопасное удобство использования», веб-дизайн и дизайн бизнес-моделей.
Ежегодный Pattern Languages программирования Труды конференций включают множество примеров предметно-ориентированных шаблонов.
Шаблоны проектирования изначально были разделены на 3 подкласса в зависимости от типа решаемой ими проблемы. Шаблоны создания предоставляют возможность создавать объекты на основе требуемого критерия и контролируемым образом. Структурные шаблоны предназначены для организации различных классов и объектов для формирования более крупных структур и обеспечения новой функциональности. Наконец, поведенческие паттерны предназначены для выявления общих паттернов общения между объектами и реализации этих паттернов.
Имя | Описание | В Шаблоны проектирования | В Код завершен | Другое |
---|---|---|---|---|
Абстрактная фабрика | Предоставить интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов. | Да | Да | Н / Д |
Builder | Отделяйте построение сложного объекта от его представления, позволяя одному и тому же процессу построения создавать различные представления. | Да | Нет | Н / Д |
Внедрение зависимостей | Класс принимает требуемые объекты от инжектора вместо того, чтобы создавать объекты напрямую. | Нет | Нет | Н / Д |
Заводской метод | Определите интерфейс для создания одного объекта, но позвольте подклассам решать, какой класс создать. Заводской метод позволяет классу отложить создание экземпляра до подклассов. | Да | Да | Н / Д |
Ленивая инициализация | Тактика задержки создания объекта, вычисления значения или других дорогостоящих обрабатывать до первого раза. Этот шаблон появляется в каталоге GoF как «виртуальный прокси», стратегия реализации для шаблона Прокси. | Нет | Нет | PoEAA |
Multiton | Убедитесь, что у класса есть только именованные экземпляры, и предоставьте им глобальную точку доступа. | Нет | Нет | Неприменимо |
Пул объектов | Избегайте дорогостоящего приобретения и высвобождения ресурсов за счет повторного использования объектов, которые больше не используются. Можно считать обобщением шаблонов пула соединений и пула потоков. | Нет | Нет | Н / Д |
Прототип | Укажите типы объектов, которые нужно создать, используя прототипный экземпляр, и создайте новые объекты из 'скелета 'существующего объекта, тем самым повышая производительность и сводя к минимуму объем памяти. | Да | Нет | Н / Д |
Инициализация получения ресурсов (RAII) | Убедитесь, что ресурсы правильно высвобождаются путем связывания их на срок службы подходящих предметов. | Нет | Нет | Н / Д |
Синглтон | Убедитесь, что класс имеет только один экземпляр, и предоставьте глобальную точку доступа к нему. | Да | Да | Н / Д |
Имя | Описание | В Дизайн Шаблоны | в Код завершен | Другой |
---|---|---|---|---|
Адаптер, оболочка или транслятор | Преобразование интерфейса класса в другой интерфейс, ожидаемый клиентами. Адаптер позволяет классам работать вместе, что иначе было бы невозможно из-за несовместимых интерфейсов. Эквивалент модели интеграции предприятия - переводчик. | Да | Да | Н / Д |
Мост | Отделите абстракцию от ее реализации, позволяя им изменяться независимо. | Да | Да | Н / Д |
Составной | Объединение объектов в древовидные структуры для представления иерархий частично и целиком. Composite позволяет клиентам одинаково относиться к отдельным объектам и композициям объектов. | Да | Да | Н / Д |
Декоратор | Прикрепите дополнительные обязанности к объекту, динамически сохраняя тот же интерфейс. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности. | Да | Да | Н / Д |
Объект расширения | Добавление функциональных возможностей в иерархию без изменения иерархии. | Нет | Нет | Гибкая разработка программного обеспечения, принципы, шаблоны и методы |
Фасад | Предоставляет единый интерфейс для набора интерфейсов в подсистеме. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы. | Да | Да | Н / Д |
Легковес | Используйте общий доступ для эффективной поддержки большого количества похожих объектов. | Да | Нет | Н / Д |
Фронт-контроллер | Шаблон относится к дизайну веб-приложений. Он обеспечивает централизованную точку входа для обработки запросов. | Нет | Нет | Шаблоны J2EE PoEAA |
Маркер | Пустой интерфейс для связывания метаданных с классом. | Нет | Нет | Эффективный Java |
Модуль | Сгруппируйте несколько связанных элементов, таких как классы, синглтоны, методы, используемые глобально, в единую концептуальную сущность. | Нет | Нет | Неприменимо |
Прокси-сервер | Укажите суррогат или заполнитель для другого объекта для управления доступом к нему. | Да | Нет | Н / Д |
Twin | Twin позволяет моделировать множественное наследование на языках программирования, которые не поддерживают эту функцию. | Нет | Нет | Н / Д |
Имя | Описание | В Дизайн Шаблоны | В Код завершен | Другое |
---|---|---|---|---|
Blackboard | Искусственный интеллект шаблон для объединения разрозненных источников данных (см. система Blackboard ) | Нет | Нет | Неприменимо |
Цепочка ответственности | Избегайте связывания отправителя запроса с его получателем, давая возможность более чем одному объекту обработать запрос. Объедините получающие объекты в цепочку и передайте запрос по цепочке, пока объект не обработает его. | Да | Нет | Н / Д |
Команда | Инкапсулирует запрос как объект, тем самым позволяя параметризация клиентов с различными запросами, а также постановка в очередь или регистрация запросов. Это также позволяет поддерживать отменяемые операции. | Да | Нет | Н / Д |
Интерпретатор | Для данного языка определите представление его грамматики вместе с интерпретатором, который использует представление способность интерпретировать предложения на языке. | Да | Нет | Н / Д |
Итератор | Обеспечивает способ доступа к элементам объекта aggregate последовательно без раскрытия его базовое представление. | Да | Да | Н / Д |
Посредник | Определите объект, который инкапсулирует, как взаимодействует набор объектов. Посредник способствует слабой связи, не позволяя объектам явно ссылаться друг на друга, и позволяет их взаимодействию изменяться независимо. | Да | Нет | Н / Д |
Memento | Без нарушения инкапсуляции захватить и экстернализовать внутреннее состояние объекта, позволяя восстановить объект до этого состояния позже. | Да | Нет | Н / Д |
Нулевой объект | Избегайте нулевых ссылок, предоставляя объект по умолчанию. | Нет | Нет | Неприменимо |
Наблюдатель или Опубликовать / подписаться | Определить взаимозависимость между объектами где изменение состояния одного объекта приводит к автоматическому уведомлению и обновлению всех его зависимых элементов. | Да | Да | Н / Д |
Слуга | Определение общих функций для группы классов. Шаблон слуги также часто называют реализацией вспомогательного класса или служебного класса для данного набора классов. Вспомогательные классы обычно не имеют объектов, поэтому у них есть все статические методы, которые действуют на различные типы объектов класса. | Нет | Нет | Н / Д |
Спецификация | Рекомбинируемая бизнес-логика в виде логического | Нет | Нет | Н / Д |
Состояние | Разрешить объекту изменять свое поведение при изменении его внутреннего состояния. Объект изменит свой класс. | Да | Нет | Н / Д |
Стратегия | Определите семейство алгоритмов, инкапсулируйте каждый из них и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму изменяться независимо от клиентов, которые его используют. | Да | Да | Н / Д |
Шаблонный метод | Определите каркас алгоритма в операции, перенеся некоторые шаги на подклассы. Шаблонный метод позволяет подклассам переопределять определенные шаги алгоритма без изменения структуры алгоритма. | Да | Да | Н / Д |
Посетитель | Представляют операцию, которая должна быть выполнена над элементами структуры объекта. Посетитель позволяет определить новую операцию, не изменяя классы элементов, с которыми она работает. | Да | Нет | Н / Д |
Имя | Описание | В POSA2 | Другой |
---|---|---|---|
Активный объект | Отделяет выполнение метода от вызова методов, которые находятся в их собственном потоке управления. Цель состоит в том, чтобы ввести параллелизм с помощью вызова асинхронного метода и планировщика для обработки запросов. | Да | Н / Д |
Блокировка | Выполнять действие над объектом только тогда, когда объект находится в определенном состоянии. | Нет | Неприменимо |
Связывание свойств | Объединение нескольких наблюдателей для принудительной синхронизации или координации свойств в разных объектах. | Нет | Н / Д |
Вычислить ядро | Одно и то же вычисление много раз параллельно, отличающееся целочисленными параметрами, используемыми с математикой без ветвления указателя в общих массивах, например, GPU -оптимизировано Умножение матриц или Сверточная нейронная сеть. | Нет | Неприменимо |
Блокировка с двойной проверкой | Уменьшите накладные расходы на получение блокировки, сначала протестировав блокировку критерий («подсказка блокировки») небезопасным способом; только в том случае, если это удастся, действующая логика блокировки продолжается. Может быть небезопасным при реализации в некоторых сочетаниях языка и оборудования. Поэтому иногда его можно рассматривать как анти-шаблон. | Да | Н / Д |
Асинхронный на основе событий | Устраняет проблемы с асинхронным шаблоном, которые возникают в многопоточных программах. | Нет | Неприменимо |
Защищенная приостановка | Управляет операциями, которые требуют как блокировки, так и выполнения предварительного условия, прежде чем операция может быть выполнена. | Нет | Неприменимо |
Соединение | Шаблон соединения обеспечивает способ написания параллельных, параллельных и распределенных программ путем передачи сообщений. По сравнению с использованием потоков и блокировок это модель программирования высокого уровня. | Нет | Неприменимо |
Блокировка | Один поток устанавливает «блокировку» на ресурс, не позволяя другим потокам обращаться к нему или изменять его. | Нет | PoEAA |
Шаблон проектирования обмена сообщениями (MDP) | Позволяет обмениваться информацией (т.е. сообщениями) между компонентами и приложениями. | Нет | Неприменимо |
Монитор объекта | Объект, методы которого подчиняются взаимному исключению, что предотвращает ошибочные попытки использования его несколькими объектами в то же время. | Да | Н / Д |
Reactor | Объект реактора предоставляет асинхронный интерфейс для ресурсов, которые должны обрабатываться синхронно. | Да | Н / Д |
Блокировка чтения-записи | Разрешает одновременный доступ для чтения к объекту, но требует монопольного доступа для операций записи. | Нет | Н / Д |
Планировщик | Явно контролирует, когда потоки могут выполнять однопоточный код. | Нет | Неприменимо |
Пул потоков | Для выполнения ряда задач создается ряд потоков, которые обычно организуются в очередь. Обычно задач гораздо больше, чем потоков. Можно рассматривать как частный случай шаблона пул объектов. | Нет | Неприменимо |
Хранилище для конкретного потока | Статическая или «глобальная» память, локальная для потока. | Да | Н / Д |
Документация по шаблону проектирования описывает контекст, в котором используется шаблон, силы в контексте, в котором шаблон стремится решить, и предлагаемое решение. Не существует единого стандартного формата для документирования шаблонов проектирования. Скорее, разные авторы шаблонов использовали множество различных форматов. Однако, согласно Мартину Фаулеру, определенные формы паттернов стали более известными, чем другие, и, следовательно, стали общей отправной точкой для новых усилий по написанию паттернов. Одним из примеров широко используемого формата документации является формат, использованный Эрихом Гаммой, Ричардом Хелмом, Ральфом Джонсоном и Джоном Влиссидесом в их книга Шаблоны дизайна. Он содержит следующие разделы:
Было замечено, что шаблоны проектирования могут быть просто признаком того, что некоторые функции отсутствуют в данном языке программирования (Java или C ++, например). Питер Норвиг демонстрирует, что 16 из 23 шаблонов в книге Design Patterns (которая в основном ориентирована на C ++) упрощены или устранены (посредством прямой языковой поддержки) в Lisp или Дилан. Связанные с этим наблюдения были сделаны Ханнеманом и Кичалесом, которые реализовали несколько из 23 шаблонов проектирования с использованием аспектно-ориентированного языка программирования (AspectJ) и показали, что зависимости на уровне кода были удалены из реализаций 17 из 23 проектов. шаблоны и это аспектно-ориентированное программирование может упростить реализацию шаблонов проектирования. См. Также эссе Пола Грэма «Месть ботаников».
Неправильное использование шаблонов может излишне усложнять.