Видео курс Шаблоны проектирования

Основные темы, рассматриваемые на уроке:
03:59 1 Шаблоны и их использование в объективной реальности
08:49 2 Паттерны в спорте
10:41 3 Фигуры логики и модусы силлогизмов
13:08 4 Шаблоны в музыке
15:52 5 Порождающие шаблоны в музыке
21:03 6 Структурные шаблоны в музыке
27:07 7 Поведенческие шаблоны в музыке
30:52 8 Главная задача ООП
34:00 9 Шаблоны в программировании
36:10 10 Определение Паттерна
42:31 11 Формат описания паттернов проектирования
49:12 12 Каталог паттернов проектирования
52:10 13 Техника ООП
53:10 14 Фасад Подсистемы
55:14 15 Принципы организации каталога
59:34 16 Рекомендации по изучению паттернов
1: 05:16 17 Разновидности шаблонов
1: 12:31 18 Что такое Шаблоны проектирования?

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

Для просмотра полной версии видеокурса и получения доступа к дополнительным учебным материалам Вам необходимо оформить подписку
Оформить подписку

1.1. Понятие паттерна проектирования

Определение

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

Паттерны (шаблоны) проектирования – это 23 примера, которые описывают:

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

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

Метафора

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

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

  • Шаги:

Основной шаг, Шассе, Кроссролл, Подсечка, Беговой шаг, Моухог, Чоктау и др.

  • Спирали:

Спираль в арабеске, спираль Шарлотты, Y-спираль, Fan-спираль, Спираль-Керриган и др.

  • Вращения:

Вращение стоя назад, Вращение-заклон, Вращение бильман, Вращение в ласточке (либела) и др.

  • Прыжки:

Лутц, Тулуп, Флип, Аксель, Риттбергер, Сальхов, Сальто и др.

Базовые элементы фигурного катания, можно назвать шаблонами или паттернами фигурного катания. В итоге полный танец состоит из комбинации базовых элементов в определенной последовательности. И все танцы в фигурном катании отличаются набором и последовательностью исполнения базовых элементов (шаблонов).

У каждого базового элемента имеется своя схема исполнения. Чтобы исполнить определенный элемент танца нужно выполнить ряд простейших действий (Разогнаться, повернуться, поднять ногу, расставить руки и пр.).

Рассмотрим в качестве примера один из базовых элементов – «Axel», который входит в категорию прыжков. На рисунке ниже показана детальная схема исполнения прыжка «Axel» и то как этот элемент разбивается на составляющие.

Рисунок 1. Схема исполнения прыжка «Axel»

При проектировании программных систем используется аналогичный подход. Программа строится с учетом наличия готовых подходов, которые представлены своими схемами – шаблонами (паттернами). В общем виде имеется 23 базовых шаблона проектирования программных систем, которые лежат в основе более высокоуровневых и модельно зависимых паттернов (например, паттерны проектирования корпоративных приложений, разработанные Мартином Фаулером, базируются на паттернах из каталога GoF).

Между элементами, показанными на рисунках 2 и 3 можно провести соответствия. 

Рисунок 2. Фрагмент танца составленный из двух независимых элементов (шаблонов)

Рисунок 3. Фрагмент программной системы, составленный из двух независмых элементов (шаблонов)

Условно, каждому отдельному движению из элемента (шаблона) входящего в состав танца можно поставить в соответствие отдельный класс из элемента (шаблона) входящего в состав программной системы.

Рисунок 3. Соответствие

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

 

1.2. Формат описания паттернов проектирования

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

Название

Название паттерна (на Русском языке) отражающее его назначение.

Также известен как

Альтернативное название паттерна (если такое название имеется).

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

Классификация паттернов производится:

  • По цели (порождающий, структурный или поведенческий)
  • По применимости (к объектам и/или к классам)

Частота использования

Низкая                  -   1 2 3 4 5

Ниже средней       -   1 2 3 4 5

Средняя               -   1 2 3 4 5

Выше средней      -   1 2 3 4 5

Высокая               -   1 2 3 4 5

Назначение

Краткое описание назначения паттерна и задачи проектирования, решаемые с его использованием.

Введение

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

Структура паттерна на языке UML

Графическое представление паттерна с использованием диаграмм классов языка UML. На диаграммах показаны основные участники (классы) и связи отношений между участниками.

Структура паттерна на языке C#

Программная реализация паттерна с использованием языка C#.

Участники

Имена участников (классы которые входят в состав паттерна) и описание их назначения.

Отношения между участниками

Описание отношений (взаимодействий) между участниками (классами и/или объектами).

Мотивация

Определение потребности в использовании паттерна. Рассмотрение способов применения паттерна.

Применимость паттерна

Рекомендации по применению паттерна.

Результаты

Особенности и варианты использования паттерна. Результаты применения.

Реализация

Описание вариантов и способов реализации паттерна.

Пример кода

Дополнительные примеры, иллюстрирующие использование паттерна.

Известные применения паттерна в .Net

Использование паттерна в .Net Framework и/или его выражение в языке C#.

 

1.3. Каталог паттернов проектирования

Каталог состоит из 23 паттернов. Все паттерны разделены на три группы:

Порождающие

  1. Abstract Factory (Абстрактная Фабрика)
  2. Builder (Строитель)
  3. Factory Method (Фабричный Метод)
  4. Prototype (Прототип)
  5. Singleton (Одиночка)

Структурные

  1. Adapter (Адаптер)
  2. Bridge (Мост)
  3. Composite (Компоновщик)
  4. Decorator (Декоратор)
  5. Facade (Фасад)
  6. Flyweight (Приспособленец)
  7. Proxy (Заместитель)

Поведенческие

  1. Chain of Responsibility (Цепочка Обязанностей)
  2. Command (Команда)
  3. Interpreter (Интерпретатор)
  4. Iterator (Итератор)
  5. Mediator (Посредник)
  6. Memento (Хранитель)
  7. Observer (Наблюдатель)
  8. State (Состояние)
  9. Strategy (Стратегия)
  10. Template Method (Шаблонный Метод)
  11. Visitor (Посетитель)

 

1.4. Техники ООП

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

Фабрика - Продукт

Техника использования объекта-фабрики для порождения объектов-продуктов, была положена в основу всех порождающих паттернов. Методы, принадлежащие объекту-фабрике, которые порождают и возвращают объекты-продукты, принято называть фабричными-методами (или виртуальными конструкторами).

См. пример к главе: \RulesOOP (Creating)

На диаграмме последовательностей можно отследить работу фабричной техники.

 Рисунок 4. Диаграмма последовательностей фабричной техники

Фасад - Подсистема

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

См. пример к главе: \RulesOOP (Structural)

На диаграмме последовательностей можно отследить работу фасадной техники.

Рисунок 5. Диаграмма последовательностей фасадной техники

 

Диспетчеризация

Техника использования диспетчеризации имеет две формы: «Цепочка объектов» и «Издатель-Подписчик». Эти техники были положены в основу поведенческих паттернов.

Цепочка объектов

При использовании техники «Цепочка объектов» - объекты связываются в цепочку, вдоль которой происходит серия вызовов методов (посылка сообщений).

См. пример к главе: \RulesOOP (Chain)

На диаграмме последовательностей можно отследить работу техники «Цепочка объектов».

Рисунок 6. Диаграмма последовательностей техники "Цепочка объектов».

Издатель-Подписчик

При использовании техники «Издатель-Подписчик» - объект-издатель вызывает метод на объекте-подписчике, а объект-подписчик после этого вызывает метод на объекте-издателе. Таким образом объект-издатель уведомляет объекта-подписчика о наступлении некоторого события.

См. пример к главе: \RulesOOP (Behavioral)

На диаграмме последовательностей можно отследить работу техники «Издатель-Подписчик».

Рисунок 7. Диаграмма последовательностей техники "Издатель-подписчик"

 

1.5. Принципы организации каталога

Все 23 паттерна классифицируются по двум критериям – цель и применимость (уровень).

 

 

Цель

Порождающие

Структурные

Поведенческие

Применимость (уровень)

К классам

 

Фабричный метод

 

Адаптер (класса)

 

 

Интерпретатор

Шаблонный метод

 

К объектам

 

Абстрактная фабрика

Одиночка

Прототип

Строитель

 

Адаптер (объекта)

Декоратор

Заместитель

Компоновщик

Мост

Приспособленец

Фасад

 

Итератор

Команда

Наблюдатель

Посетитель

Посредник

Состояние

Стратегия

Хранитель

Цепочка обязанностей

 

Таблица 1. Принципы организации каталога паттернов.

Цель паттерна

Цель паттерна – показывает его назначение.

 

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

Уровень паттерна

Уровень паттерна -  показывает область применения паттерна: к классам или к объектам.

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

 

1.6. Рекомендации по изучению паттернов

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

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

Начинающим программистам понадобится немного больше времени для изучения и хорошего понимания паттернов. Им рекомендуется сначала приступить к ознакомлению с диаграммой классов и сравнению классов и связей отношений, изображенных на диаграмме с реализацией паттерна в примере на языке C#. Такой подход позволит закрепить понимание простейших техник ООП, которые используются при построении паттерна. Для достижения большего эффекта есть смысл при изучении кода паттерна параллельно рисовать диаграмму объектов (овалы - символизирующие объекты в памяти и стрелки – показывающие как одни объекты ссылаются на другие).

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

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

Важно понимать, что паттерн - это формула, а пример использования паттерна - это пример применения этой формулы. Формула – первична, ее применение – вторично. Для создателей каталога паттернов формула была вторична. В основу этого каталога была положена докторская диссертация Эриха Гаммы – а это значит сначала исследования в области построения объектно-ориентированных систем, затем формализация результатов исследований и представление их в виде 23 паттернов (формул). Разработчикам исследовать ничего не нужно, им не нужно порождать новых знаний и делать открытий, им просто требуется использовать готовые паттерны (формулы) в повседневной работе для решения проектных задач.

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

 

1.7. Рекомендации по применению паттернов

Использовать паттерны просто для тех, кто знает наизусть все 23 паттерна (всех участников и связи отношений между ними). 23 паттерна – это «таблица умножения» проектировщика. Как трудно производить расчеты без знания таблицы умножения, также трудно проектировать приложения без знания паттернов.

Нет надобности искать в каком месте и когда применить тот или иной паттерн. Выбор паттерна – это выбор способа решения задачи. Нет задачи – нет и решения. Поставленная задача – причина. Паттерн - путь к следствию. Решенная задача – следствие.

Примеры, приводимые в книге приближены к несложным проектным требованиям и их рассмотрение окажется полезным для понимания использования паттернов. Важно понимать, что пример - это образец чего-либо, как правило – самый яркий и лучший образец (пример для подражания).

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

© 2017 ITVDN, все права защищены