Шаблон разработки программного обеспечения

редактировать
Многоразовое решение часто встречающейся проблемы программного обеспечения

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

Объектно-ориентированные шаблоны проектирования обычно показывают отношения и взаимодействия между классами или объектами, без указания конечных классов приложения или задействованных объектов. Шаблоны, предполагающие изменяемое состояние, могут не подходить для языков функционального программирования, некоторые шаблоны могут быть ненужными в языках, которые имеют встроенную поддержку для решения проблемы, которую они пытаются решить, а объектно-ориентированные шаблоны не подходят. обязательно подходит для не объектно-ориентированных языков.

Шаблоны проектирования можно рассматривать как структурированный подход к компьютерному программированию, промежуточный между уровнями парадигмы программирования и конкретным алгоритмом.

в В недавнем обзорном исследовании Wedyan и Abufakher изучают шаблоны проектирования и качество программного обеспечения и приходят к выводу: «Наше исследование показало, что первичные исследования предоставляют эмпирические данные о положительном влиянии документации экземпляров шаблонов проектирования на понимание программы, и следовательно, ремонтопригодность. Хотя этот результат не удивителен, он, тем не менее, имеет два признака. Во-первых, разработчикам следует приложить больше усилий, чтобы добавить такую ​​документацию, даже если в форме простых комментариев в исходный код. Во-вторых, при сравнении результатов В различных исследованиях необходимо учитывать влияние документации ».

Содержание

  • 1 История
  • 2 Практика
  • 3 Структура
    • 3.1 Специфические для предметной области шаблоны
  • 4 Классификация и список
    • 4.1 Шаблоны создания
    • 4.2 Структурные шаблоны
    • 4.3 Be шаблоны поведения
    • 4.4 Шаблоны параллелизма
  • 5 Документация
  • 6 Критика
  • 7 См. также
  • 8 Ссылки
  • 9 Дополнительная литература

История

Шаблоны возникли как архитектурная концепция Кристофера Александра еще в 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 проектов. шаблоны и это аспектно-ориентированное программирование может упростить реализацию шаблонов проектирования. См. Также эссе Пола Грэма «Месть ботаников».

Неправильное использование шаблонов может излишне усложнять.

См. Также

Ссылки

Дополнительная литература

Последняя правка сделана 2021-06-08 08:27:04
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте