Шаблон проектирования программного обеспечения - Software design pattern

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

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

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

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

История

Узоры возникли как архитектурная концепция от Кристофер Александр еще в 1966 г. (см. «Узор улиц», ЖУРНАЛ AIP, сентябрь 1966 г., том 32, № 3, стр. 273-278). В 1987 г. Кент Бек и Уорд Каннингем начал экспериментировать с идеей применения шаблонов в программировании, в частности языки шаблонов - и представили свои результаты на OOPSLA конференция в том году.[2][3] В последующие годы Бек, Каннингем и другие продолжили эту работу.

Паттерны дизайна приобрели популярность в Информатика после книги Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования был опубликован в 1994 году так называемой «Бандой четырех» (Gamma et al.), которую часто сокращают как «GoF». В том же году первый Паттерн-языки программирования Конференция была проведена, и в следующем году Репозиторий портлендских паттернов был настроен для документации шаблонов проектирования. Объем термина остается предметом споров. Известные книги в жанре паттернов дизайна включают:

Хотя шаблоны проектирования применялись практически давно, формализация концепции шаблонов проектирования томилась на несколько лет.[4]

Практика

Шаблоны проектирования могут ускорить процесс разработки, предоставляя проверенные, проверенные парадигмы разработки.[5] Эффективный дизайн программного обеспечения требует рассмотрения вопросов, которые могут не проявиться до конца реализации. Недавно написанный код часто может иметь скрытые тонкие проблемы, на обнаружение которых требуется время, проблемы, которые иногда могут вызвать серьезные проблемы в будущем. Повторное использование шаблонов проектирования помогает предотвратить такие тонкие проблемы[нужна цитата ], а также улучшает читаемость кода для программистов и архитекторов, знакомых с шаблонами.

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

По определению, шаблон должен быть запрограммирован заново в каждом приложении, которое его использует. Поскольку некоторые авторы видят в этом шаг назад от повторное использование программного обеспечения как предусмотрено компоненты, исследователи работали над превращением паттернов в компоненты. Мейер и Арноут смогли предоставить полную или частичную компонентность двух третей шаблонов, которые они пытались использовать.[6]

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

Структура

Паттерны проектирования состоят из нескольких разделов (см. § Документация ниже). Особый интерес представляют разделы «Структура», «Участники» и «Сотрудничество». В этих разделах описывается мотив дизайна: прототип микроархитектура которые разработчики копируют и адаптируют к своим конкретным проектам для решения повторяющейся проблемы, описываемой шаблоном проектирования. Микроархитектура - это набор компонентов программы (например, классов, методов ...) и их взаимосвязей. Разработчики используют шаблон проектирования, внедряя в свои проекты эту прототипную микроархитектуру, что означает, что микроархитектуры в их проектах будут иметь структуру и организацию, аналогичные выбранному шаблону дизайна.

Шаблоны для конкретных доменов

Также были предприняты усилия по кодификации шаблонов проектирования в конкретных областях, включая использование существующих шаблонов проектирования, а также шаблонов проектирования для конкретных областей. Примеры включают пользовательский интерфейс шаблоны проектирования,[7] визуализация информации,[8] безопасный дизайн,[9] "безопасное юзабилити",[10] веб-дизайн [11] и дизайн бизнес-модели.[12]

Ежегодный Паттерн-языки программирования Материалы конференций [13] включают множество примеров шаблонов, специфичных для предметной области.

Классификация и список

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

Шаблоны создания

имяОписаниеВ Шаблоны проектированияВ Код завершен[14]Другой
Абстрактная фабрикаПредоставьте интерфейс для создания семьи связанных или зависимых объектов без указания их конкретных классов.дадаНет данных
СтроительОтделяйте построение сложного объекта от его представления, позволяя одному и тому же процессу построения создавать различные представления.даНетНет данных
Внедрение зависимостиКласс принимает требуемые объекты от инжектора вместо того, чтобы создавать объекты напрямую.НетНетНет данных
Заводской методОпределите интерфейс для создания не замужем объект, но позвольте подклассам решать, какой класс создать. Заводской метод позволяет классу отложить создание экземпляра до подклассов.дадаНет данных
Ленивая инициализацияТактика откладывания создания объекта, вычисления стоимости или другого дорогостоящего процесса до первой необходимости. Этот шаблон появляется в каталоге GoF как «виртуальный прокси», стратегия реализации для Прокси шаблон.НетНетPoEAA[15]
МультитонУбедитесь, что у класса есть только именованные экземпляры, и предоставьте им глобальную точку доступа.НетНетНет данных
Пул объектовИзбегайте дорогостоящего приобретения и высвобождения ресурсов за счет утилизации неиспользуемых объектов. Можно считать обобщением пул соединений и пул потоков узоры.НетНетНет данных
ПрототипУкажите типы объектов для создания с использованием прототипа и создайте новые объекты из «скелета» существующего объекта, таким образом повышая производительность и сводя к минимуму объем памяти.даНетНет данных
Приобретение ресурсов - это инициализация (RAII)Убедитесь, что ресурсы высвобождаются должным образом, привязав их к сроку службы подходящих объектов.НетНетНет данных
СинглтонУбедитесь, что у класса есть только один экземпляр, и предоставьте ему глобальную точку доступа.дадаНет данных

Структурные образцы

имяОписаниеВ Шаблоны проектированияВ Код завершен[14]Другой
Адаптер, Оболочка или переводчикПреобразование интерфейса класса в другой интерфейс, ожидаемый клиентами. Адаптер позволяет классам работать вместе, что иначе было бы невозможно из-за несовместимых интерфейсов. Эквивалент модели интеграции предприятия - переводчик.дадаНет данных
МостОтделите абстракцию от ее реализации, позволяя им изменяться независимо.дадаНет данных
КомпозитныйОбъединяйте объекты в древовидные структуры для представления иерархий «частично-целое». Composite позволяет клиентам обрабатывать отдельные объекты и композиции объектов единообразно.дадаНет данных
ДекораторДобавляйте дополнительные обязанности к объекту, динамически сохраняя тот же интерфейс. Декораторы предоставляют гибкую альтернативу созданию подклассов для расширения функциональности.дадаНет данных
Объект расширенияДобавление функциональности в иерархию без изменения иерархии.НетНетГибкая разработка программного обеспечения, принципы, шаблоны и практики[16]
ФасадПредоставляет унифицированный интерфейс для набора интерфейсов в подсистеме. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.дадаНет данных
Наилегчайший весИспользуйте общий доступ для эффективной поддержки большого количества похожих объектов.даНетНет данных
Передний контроллерШаблон относится к дизайну веб-приложений. Он обеспечивает централизованную точку входа для обработки запросов.НетНет

Паттерны J2EE[17]PoEAA[18]

МаркерПустой интерфейс для связи метаданных с классом.НетНетЭффективная Java[19]
МодульСгруппируйте несколько связанных элементов, таких как классы, синглтоны, методы, используемые глобально, в единую концептуальную сущность.НетНетНет данных
ПроксиПредоставьте суррогат или заполнитель для другого объекта, чтобы контролировать доступ к нему.даНетНет данных
Близнец [20]Twin позволяет моделировать множественное наследование на языках программирования, которые не поддерживают эту функцию.НетНетНет данных

Модели поведения

имяОписаниеВ Шаблоны проектированияВ Код завершен[14]Другой
ДоскаИскусственный интеллект шаблон для объединения разрозненных источников данных (см. система доски )НетНетНет данных
Цепочка ответственностиИзбегайте связывания отправителя запроса с его получателем, давая возможность более чем одному объекту обработать запрос. Объедините получающие объекты в цепочку и передайте запрос по цепочке, пока объект не обработает его.даНетНет данных
КомандаИнкапсулируйте запрос как объект, тем самым позволяя параметризацию клиентов с различными запросами, а также создание очереди или протоколирование запросов. Это также позволяет поддерживать отменяемые операции.даНетНет данных
ПереводчикДля данного языка определите представление для его грамматики вместе с интерпретатором, который использует это представление для интерпретации предложений на языке.даНетНет данных
ИтераторОбеспечьте способ доступа к элементам совокупность объект последовательно, не раскрывая его базовое представление.дадаНет данных
ПосредникОпределите объект, который инкапсулирует, как взаимодействует набор объектов. Посредник продвигает Слабая связь не позволяя объектам явно ссылаться друг на друга, и позволяет их взаимодействию изменяться независимо.даНетНет данных
MementoНе нарушая инкапсуляцию, захватите и извлеките внутреннее состояние объекта, позволяя объекту вернуться в это состояние позже.даНетНет данных
Нулевой объектИзбегайте нулевых ссылок, предоставляя объект по умолчанию.НетНетНет данных
Наблюдатель или Опубликовать / подписатьсяОпределите зависимость между объектами "один ко многим", при которой изменение состояния одного объекта приводит к автоматическому уведомлению и обновлению всех его зависимых элементов.дадаНет данных
СлугаОпределите общую функциональность для группы классов. Шаблон слуги также часто называют реализацией вспомогательного класса или служебного класса для данного набора классов. Вспомогательные классы обычно не имеют объектов, поэтому у них есть все статические методы, которые действуют на различные типы объектов класса.НетНетНет данных
Технические характеристикиРекомбинантный бизнес-логика в Булево мода.НетНетНет данных
государствоРазрешить объекту изменять свое поведение при изменении его внутреннего состояния. Объект изменит свой класс.даНетНет данных
СтратегияОпределите семейство алгоритмов, инкапсулируйте каждый из них и сделайте их взаимозаменяемыми. Стратегия позволяет алгоритму изменяться независимо от клиентов, которые его используют.дадаНет данных
Шаблонный методОпределите скелет алгоритма в операции, отложив некоторые шаги до подклассов. Шаблонный метод позволяет подклассам переопределять определенные шаги алгоритма без изменения структуры алгоритма.дадаНет данных
ПосетительПредставляют собой операцию, выполняемую над элементами структуры объекта. Посетитель позволяет определить новую операцию, не изменяя классы элементов, с которыми она работает.даНетНет данных

Шаблоны параллелизма

имяОписаниеВ POSA2[21]Другой
Активный объектОтделяет выполнение метода от вызова методов, которые находятся в их собственном потоке управления. Цель состоит в том, чтобы ввести параллелизм с помощью вызов асинхронного метода и планировщик для обработки запросов.даНет данных
ОтказВыполняйте действие над объектом только тогда, когда объект находится в определенном состоянии.НетНет данных
Связующие свойстваОбъединение нескольких наблюдателей для принудительной синхронизации или согласования свойств разных объектов каким-либо образом.[22]НетНет данных
Вычислить ядроОдно и то же вычисление много раз параллельно, отличающееся целочисленными параметрами, используемыми с математикой без ветвления указателя в совместно используемых массивах, таких как GPU -оптимизированный Умножение матриц или Сверточная нейронная сеть.НетНет данных
Двойная проверка блокировкиУменьшите накладные расходы на получение блокировки, проверив сначала критерий блокировки («подсказку блокировки») небезопасным способом; только в том случае, если это удастся, будет действовать фактическая логика блокировки.

Может быть небезопасным при реализации в некоторых сочетаниях языка и оборудования. Поэтому иногда его можно рассматривать антипаттерн.

даНет данных
Асинхронный на основе событийРешает проблемы с асинхронным шаблоном, возникающие в многопоточных программах.[23]НетНет данных
Охраняемая подвескаУправляет операциями, которые требуют как блокировки, так и выполнения предварительного условия перед выполнением операции.НетНет данных
ПрисоединитьсяШаблон соединения обеспечивает способ написания параллельных, параллельных и распределенных программ путем передачи сообщений. По сравнению с использованием потоков и блокировок это модель программирования высокого уровня.НетНет данных
ЗамокОдин поток устанавливает «блокировку» на ресурс, не позволяя другим потокам обращаться к нему или изменять его.[24]НетPoEAA[15]
Шаблон проектирования обмена сообщениями (MDP)Позволяет обмениваться информацией (например, сообщениями) между компонентами и приложениями.НетНет данных
Монитор объектаОбъект, методы которого подчиняются взаимное исключение, таким образом предотвращая ошибочные попытки использовать его одновременно несколькими объектами.даНет данных
РеакторОбъект реактора предоставляет асинхронный интерфейс для ресурсов, которые должны обрабатываться синхронно.даНет данных
Блокировка чтения-записиРазрешает одновременный доступ для чтения к объекту, но требует монопольного доступа для операций записи.НетНет данных
ПланировщикЯвно контролируйте, когда потоки могут выполнять однопоточный код.НетНет данных
Пул потоковДля выполнения ряда задач создается несколько потоков, которые обычно организованы в очередь. Обычно задач гораздо больше, чем потоков. Можно рассматривать как частный случай пул объектов шаблон.НетНет данных
Хранилище для конкретных потоковСтатическая или «глобальная» память, локальная для потока.даНет данных

Документация

Документация по шаблону проектирования описывает контекст, в котором используется шаблон, силы в контексте, которые шаблон пытается разрешить, и предлагаемое решение.[25] Не существует единого стандартного формата для документирования шаблонов проектирования. Скорее, разные авторы шаблонов использовали множество различных форматов. Однако, по мнению Мартин Фаулер, некоторые формы шаблонов стали более известными, чем другие, и, следовательно, стали общей отправной точкой для новых усилий по написанию шаблонов.[26] Одним из примеров широко используемого формата документации является формат, используемый Эрих Гамма, Ричард Хелм, Ральф Джонсон, и Джон Влиссидес в их книге Шаблоны проектирования. Он состоит из следующих разделов:

  • Название и классификация паттерна: Описательное и уникальное имя, которое помогает идентифицировать шаблон и ссылаться на него.
  • Намерение: Описание цели паттерна и причины его использования.
  • Также известный как: Другие названия выкройки.
  • Мотивация (силы): Сценарий, состоящий из проблемы и контекста, в котором можно использовать этот шаблон.
  • Применимость: Ситуации, в которых можно использовать этот шаблон; контекст для шаблона.
  • Структура: Графическое представление узора. Диаграммы классов и Диаграммы взаимодействия могут быть использованы для этой цели.
  • Участники: Список классов и объектов, используемых в шаблоне, и их роли в дизайне.
  • Сотрудничество: Описание того, как классы и объекты, используемые в шаблоне, взаимодействуют друг с другом.
  • Последствия: Описание результатов, побочных эффектов и компромиссов, вызванных использованием шаблона.
  • Реализация: Описание реализации паттерна; часть решения узора.
  • Образец кода: Иллюстрация того, как шаблон можно использовать в языке программирования.
  • Известные применения: Примеры реального использования паттерна.
  • Связанные шаблоны: Другие паттерны, которые имеют некоторое отношение к паттерну; обсуждение различий между рисунком и похожими узорами.

Критика

Было замечено, что шаблоны проектирования могут быть просто признаком того, что некоторые функции отсутствуют в данном языке программирования (Ява или C ++ например). Питер Норвиг показывает, что 16 из 23 паттернов в Шаблоны проектирования книга (которая в основном ориентирована на C ++) упрощены или исключены (посредством прямой языковой поддержки) в Лисп или Дилан.[27] Соответствующие наблюдения были сделаны Ханнеманом и Кичалесом, которые реализовали несколько из 23 шаблонов проектирования с использованием аспектно-ориентированный язык программирования (AspectJ) и показал, что зависимости на уровне кода были удалены из реализаций 17 из 23 шаблонов проектирования и что аспектно-ориентированное программирование может упростить реализацию шаблонов проектирования.[28]Смотрите также Пола Грэма очерк «Месть ботаников».[29]

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

Смотрите также

использованная литература

  1. ^ Ведьян, Фади; Абуфахер, Сомия (01.02.2020). «Влияние шаблонов проектирования на качество программного обеспечения: систематический обзор литературы». Программное обеспечение IET. 14 (1): 1–17. Дои:10.1049 / iet-sen.2018.5446. ISSN  1751-8806.
  2. ^ Смит, Рид (октябрь 1987 г.). Панель по методологии проектирования. OOPSLA '87 Приложение к материалам трудов. Дои:10.1145/62138.62151. Уорд предостерег от необходимости слишком много программирования на, как он выразился, «высоком уровне волшебников». Он указал, что письменный «язык шаблонов» может значительно улучшить выбор и применение абстракций. Он предложил «радикальное изменение бремени проектирования и реализации», основываясь на новой методологии адаптации работы Кристофера Александера по языкам шаблонов и языков шаблонов, ориентированных на программирование, разработанных Tektronix значительно помогли им в разработке программного обеспечения.
  3. ^ Бек, Кент; Каннингем, Уорд (Сентябрь 1987 г.). Использование языков шаблонов для объектно-ориентированной программы. OOPSLA Мастерская 87 года по Спецификация и дизайн для объектно-ориентированного программирования. Получено 2006-05-26.
  4. ^ Барони, Алин Лусия; Генек, Янн-Гаэль; Альбин-Амио, Эрве (июнь 2003 г.). «Формализация паттернов дизайна». Нант: École Nationale Supérieure des Techniques Industrielles et des Mines de Nantes. CiteSeerX  10.1.1.62.6466. Цитировать журнал требует | журнал = (Помогите)
  5. ^ Епископ Юдифь. «Шаблоны проектирования C # 3.0: используйте возможности C # 3.0 для решения реальных проблем». Книги по C # от O'Reilly Media. Получено 2012-05-15. Если вы хотите ускорить разработку своих .NET-приложений, вы готовы к шаблонам проектирования C # - элегантным, общепринятым и проверенным способам решения общих проблем программирования.
  6. ^ Мейер, Бертран; Арноут, Карин (июль 2006 г.). "Компонентизация: пример посетителя" (PDF). IEEE Computer. 39 (7): 23–30. CiteSeerX  10.1.1.62.6082. Дои:10.1109 / MC.2006.227. S2CID  15328522.
  7. ^ Лааксо, Сари А. (16 сентября 2003 г.). «Коллекция шаблонов дизайна пользовательского интерфейса». Университет Хельсинки, факультет компьютерных наук. Получено 2008-01-31.
  8. ^ Heer, J .; Агравала, М. (2006). «Шаблоны проектирования программного обеспечения для визуализации информации». IEEE Transactions по визуализации и компьютерной графике. 12 (5): 853–60. CiteSeerX  10.1.1.121.4534. Дои:10.1109 / TVCG.2006.178. PMID  17080809. S2CID  11634997.
  9. ^ Догерти, Чад; Сэйр, Кирк; Сикорд, Роберт С.; Свобода, Давид; Тогаши, Казуя (2009). Шаблоны безопасного проектирования (PDF). Институт программной инженерии.
  10. ^ Гарфинкель, Симсон Л. (2005). Принципы и шаблоны проектирования компьютерных систем, которые одновременно являются безопасными и удобными (Кандидатская диссертация).
  11. ^ "Библиотека шаблонов дизайна Yahoo!". Архивировано из оригинал на 2008-02-29. Получено 2008-01-31.
  12. ^ «Как разработать свою бизнес-модель как экономичный стартап?». 2010-01-06. Получено 2010-01-06.
  13. ^ Шаблонные языки программирования, Материалы конференции (ежегодно, 1994-) [1]
  14. ^ а б c МакКоннелл, Стив (Июнь 2004 г.). «Дизайн в строительстве». Код завершен (2-е изд.). Microsoft Press. п.104. ISBN  978-0-7356-1967-8. Таблица 5.1 Популярные шаблоны дизайна
  15. ^ а б Фаулер, Мартин (2002). Паттерны архитектуры корпоративных приложений. Эддисон-Уэсли. ISBN  978-0-321-12742-6.
  16. ^ К. Мартин, Роберт (2002). «28. Объект расширения». Гибкая разработка программного обеспечения, принципы, шаблоны и практики. п.408. ISBN  978-0135974445.
  17. ^ Алур, Дипак; Крапи, Джон; Малкс, Дэн (2003). Базовые шаблоны J2EE: передовой опыт и стратегии проектирования. Prentice Hall. п. 166. ISBN  978-0-13-142246-9.
  18. ^ Фаулер, Мартин (2002). Паттерны архитектуры корпоративных приложений. Эддисон-Уэсли. п. 344. ISBN  978-0-321-12742-6.
  19. ^ Блох, Джошуа (2008). «Правило 37: Используйте интерфейсы маркеров для определения типов». Эффективная Java (Второе изд.). Эддисон-Уэсли. п.179. ISBN  978-0-321-35668-0.
  20. ^ «Двойник - шаблон проектирования для моделирования множественного наследования» (PDF).
  21. ^ Schmidt, Douglas C .; Сталь, Михаил; Ронерт, Ганс; Бушманн, Франк (2000). Шаблонно-ориентированная архитектура программного обеспечения, Том 2: Шаблоны для параллельных и сетевых объектов. Джон Вили и сыновья. ISBN  978-0-471-60695-6.
  22. ^ Свойства привязки
  23. ^ Нагель, Кристиан; Эвьен, Билл; Глинн, Джей; Уотсон, Карли; Скиннер, Морган (2008). «Асинхронный шаблон на основе событий». Профессиональный C # 2008. Вайли. С. 570–571. ISBN  978-0-470-19137-8.
  24. ^ Шаблон блокировки
  25. ^ Габриэль, Дик. "Определение шаблона". Архивировано из оригинал на 2007-02-09. Получено 2007-03-06.
  26. ^ Фаулер, Мартин (2006-08-01). «Написание шаблонов программного обеспечения». Получено 2007-03-06.
  27. ^ Норвиг, Питер (1998). Шаблоны проектирования на динамических языках.
  28. ^ Ханнеманн, Ян; Кичалес, Грегор (2002). Реализация шаблона проектирования в Java и AspectJ. OOPSLA '02. Дои:10.1145/582419.582436.CS1 maint: location (ссылка на сайт)
  29. ^ Грэм, Пол (2002). Месть ботаников. Получено 2012-08-11.
  30. ^ МакКоннелл, Стив (2004). Код завершен: Практическое руководство по созданию программного обеспечения, 2-е издание. п.105.

дальнейшее чтение