Git: введение и основы работы через терминал. Часть 1
26 августа 2024

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

Анализ проекта с целью определения используемых шаблонов проектирования. Качество применения шаблонов, возможные изменения.

Дмитрий Обухов
Инженер-разработчик ПО
  • Более 23 лет опыта в сфере ИТ.
  • Большой опыт разработки в разных отраслях. Разработал и внедрил систему сравнения позиций прайс-листов.
  • Навыки: C#, MSSQL, PostgreSQL, .NET Framework, .NET Core, EF, WebService, WebApi. SQL.

Шаблон проектирования (Software design pattern)

Повторяемая архитектурная конструкция в сфере проектирования программного обеспечения, предлагающая решение проблемы проектирования в рамках некоторого часто возникающего контекста.

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

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

Code Complete

Стивен С. МакКоннелл получил степень бакалавра философии со специализацией в области компьютерных наук в Колледже Уитмена в Уолла-Уолла, штат Вашингтон, и степень магистра в области разработки программного обеспечения в Университете Сиэтла. Затем он продолжил карьеру в индустрии программного обеспечения для настольных компьютеров, работая в Microsoft, Boeing, Russell Investment Group и нескольких других фирмах Сиэтла. В Microsoft МакКоннелл работал над TrueType как частью Windows 3.1. В компании Boeing он работал над проектом Стратегической оборонной инициативы.

МакКоннелл опубликовал свою первую книгу «Code Complete» в 1993 году.

Design Patterns: Elements of Reusable Object-Oriented Software

«Приёмы объектно-ориентированного проектирования. Паттерны проектирования» — книга 1994 года о программной инженерии, описывающая шаблоны проектирования программного обеспечения.

Книга состоит из двух частей, в первых двух главах рассказывается о возможностях и недостатках объектно-ориентированного программирования, а во второй части описаны 23 классических шаблона проектирования.

«Банда четырёх»

Эрих Гамма (программист из Швейцарии), Ричард Хелм (учёный из Австралии), Ральф Джонсон (профессор из США) и Джон Влиссидес (программист, учёный из США) в 1994 году выпустили книгу о программной инженерии, в которой описаны шаблоны проектирования программного обеспечения «Приёмы объектно-ориентированного проектирования. Паттерны проектирования» (Design Patterns: Elements of Reusable Object-Oriented Software).

Software design patterns

Список шаблонов

Типы шаблонов проектирования

Основные
  • Основные шаблоны (Fundamental)
  • Порождающие шаблоны (Creational)
  • Структурные шаблоны (Structural)
  • Поведенческие шаблоны (Behavioral)

Частные
  • Шаблоны параллельного программирования
  • Шаблоны генерации объектов
  • Шаблоны программирования гибких объектов
  • Шаблоны выполнения задач
  • Шаблоны архитектуры системы
  • Шаблоны проектирования потоковой обработки
  • Шаблоны проектирования распределённых систем
  • Шаблоны баз данных
  • Прочие

Основные шаблоны (Fundamental)

  • Шаблон делегирования Delegation pattern
Объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту.

  • Шаблон функционального дизайна Functional design
Гарантирует, что каждый модуль компьютерной программы имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие части программы.

  • Неизменяемый интерфейс Immutable interface
Создание не изменяемого объекта.

  • Интерфейс Interface
Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять.

  • Интерфейс-маркер Marker interface
В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современныхязыкахпрограммированиявместоэтогомогутприменятьсяатрибутыилианнотации.

  • Контейнер свойств Property container
Позволяет добавлять дополнительные свойства для класса в контейнер (внутри класса), вместо расширения класса новыми свойствами.

  • Канал событий Event channel
Расширяет шаблон «издатель — подписчик», создавая централизованный канал для событий. Использует объект-представитель для подписки и объект-представитель для публикации события в канале. Представительсуществуетотдельноотреальногоиздателяилиподписчика. Подписчик может получать опубликованные события от более чем одного объекта, даже если он зарегистрирован только на одном канале.

Порождающие шаблоны (Creational)

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

  • Абстрактная фабрика (Abstract factory)
Класс, который представляет собой интерфейс для создания компонентов системы.

  • Строитель (Builder)
Класс, который представляет собой интерфейс для создания сложного объекта.

  • Фабричный метод (Factory method)
Определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.

  • Отложенная инициализация (Lazy initialization)
Объект, инициализируемый во время первого обращения к нему.

  • Мультитон (Multiton)
Гарантирует, что класс имеет по именованные экземпляры объекта и обеспечивает глобальную точку доступа к ним.

  • Объектный пул (Object pool)
Класс, который представляет собой интерфейс для работы с набором инициализированных и готовых к использованию объектов.

  • Прототип (Prototype)
Определяетинтерфейссозданияобъектачерезклонированиедругогообъектавместосозданиячерезконструктор.

  • Получение ресурса есть инициализация (Resource acquisition is initialization / RAII)
Получение некоторого ресурса совмещается с инициализацией, а освобождение — с уничтожением объекта.

  • Одиночка (Singleton)
Класс, который может иметь только один экземпляр.

Структурные шаблоны (Structural)

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

  • Адаптер (Adapter / Wrapper)
Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.

  • Мост (Bridge)
Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.

  • Компоновщик (Composite)
Объект, который объединяет в себе объекты, подобные ему самому.

  • Декоратор или Wrapper/Обёртка (Decorator)
Класс, расширяющийфункциональностьдругогоклассабезиспользованиянаследования.

  • Фасад (Facade)
Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.

  • Единая точка входа (Front controller)
Обеспечивает унифицированный интерфейс для интерфейсов в подсистеме. Front Controller определяет высокоуровневый интерфейс, упрощающий использование подсистемы.

  • Приспособленец (Flyweight)
Это объект, представляющий себя как уникальный экземпляр в разных местах программы, нофактически неявляющийся таковым.

  • Заместитель (Proxy)
Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.

Поведенческие шаблоны (Behavioral)

Определяют взаимодействие между объектами, увеличивая таким образом его гибкость.

  • Цепочка обязанностей (Chain of responsibility)
Предназначен для организации в системе уровней ответственности.

  • Команда, Action, Transaction (Command)
Представляет действие. Объект команды заключает в себе самодействие и его параметры.

  • Интерпретатор (Interpreter)
Решает часто встречающуюся, но подверженную изменениям, задачу.

  • Итератор (CursorIterator)
Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящих в состав агрегации.

  • Посредник (Mediator)
Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.

  • Хранитель (Memento)
Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях.

  • Null Object
Предотвращает нулевые указатели, предоставляя объект «по умолчанию».

  • Наблюдатель или Издатель-подписчик (Observer)
Определяет зависимость типа «один ко многим» между объектами таким образом, чтоприизменениисостоянияодногообъектавсезависящиеотнегооповещаютсяобэтомсобытии.

  • Слуга (Servant)
Используется для обеспечения общей функциональности группе классов.

  • Спецификация (Specification)
Служит для связывания бизнес-логики.

  • Состояние (State)
Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.

  • Стратегия (Strategy)
Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.

Подробнее про шаблоны архитектуры системы, «Модель-Представление-Контроллер» (MVC), «Модель-Вид-Контроллер») и ExecutionFlow в записи онлайн-лекции ниже.

Содержание онлайн-лекции:

00:00:00 - Вступление. Что такое шаблон проектирования? Истоки. Code Complete. Design Patterns: Elements of Reusable Object-Oriented Software. «Банда четырёх».
00:04:40 - Software design patterns. Список шаблонов проектирования. Типы шаблонов проектирования.
00:07:50 - Основные шаблоны архитектуры системы.
00:11:00 - Порождающие шаблоны проектирования. Структурные шаблоны. Поведенческие шаблоны.
00:19:30 - Шаблоны архитектуры системы.
00:26:00 - Model-View-Controller (MVC)
00:40:21 - Иерархические Модель-Вид-Контроллер (Hierarchical model–view–controller)
00:43:52 - Шаблоны проектирования в проекте. ExecutionFlow.
Вам также может быть интересно