1 of 59

SWEBOK. Область знаний «Проектирование ПО».�III. Типовые решения

МСПИСТ

13.09.2016 г.

Лекция 10

2 of 59

Типовые решения в проектировании ПО

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

3 of 59

Кристофер Александер:

  • «Каждое типовое решение описывает некую повторяющуюся проблему и ключ к ее разгадке, причем таким образом, что вы можете пользоваться этим ключом многократно, ни разу не придя к одному и тому же результату»
  • Alexander et al. A Pattern Language — Oxford, 1977.

4 of 59

Стиль мышления эксперта

  • При решении конкретных проблем эксперты обычно не пытаются разработать новое решение, который отличается от уже имеющихся.
  • Действия эксперта:
    • вспоминают аналогичную проблему, которую они уже решали,
    • стараются повторно используют суть ранее принятого решения для решения новой проблемы.
  • Такой «стиль мышление» в терминах пар «проблема - решение», является общим для множества различных предметных областей, таких, как:
    • архитектура;
    • экономика;
    • программная инженерия.

5 of 59

Кристофер Александер:

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

  • Alexander et al. A Pattern Language — Oxford, 1977.

6 of 59

Причины возникновения типовых решений в проектировании ПО

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

7 of 59

Зачем нужны шаблоны

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

8 of 59

Определение шаблона (Pattern)

  • Шаблон – это описание хорошо проверенной, обобщенной схемы решения некоторой часто повторяющейся проблемы (задачи) разработки ПО, которая возникает в некоторых специфических условиях (контексте)
  • Схема решения проблемы задается путем:
    • определения используемых (составляющих) компонент;
    • их ответственностей;
    • способов их взаимодействия.

9 of 59

Свойства шаблонов

  1. Описывают решения для часто повторяющихся задач проектирования, которая возникают в некоторых специфических ситуациях
  2. Документируют накопленный, хорошо зарекомендовавший себя опыт проектирования
  3. Определяют абстракции, которые находятся на более высоком уровне, чем уровень отдельных классов и экземпляров или компонентов
  4. Предоставляют общий словарь терминов и общее понимание принципов проектирования.

10 of 59

Иерархия типовых решений

  1. Архитектурные стили (шаблоны архитектуры) - п. 3.2 в Swebook
    • Описывают фундаментальные способы структурирования программных систем.
    • Относятся к уровню систем и подсистем, а не классов
  2. Шаблоны проектирования - п. 3.3 в Swebook
    • Описывают структуру программных систем в терминах классов и объектов
    • Идиомы, специфичные для конкретного языка программирования.

11 of 59

Шаблоны архитектуры ПО

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

12 of 59

Шаблоны архитектуры ПО (2)

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

13 of 59

Примеры архитектурных шаблонов

  1. Layers (Уровни),
  2. Pipes and Filters (каналы и фильтры),
  3. Blackboard (информационная "доска"),
  4. Broker (брокер),
  5. Model-View-Controller (Модель-Представление-Контроллер),
  6. Presentation-Abstraction-Control (Представление-Абстракция-Контроллер),
  7. Microkernel (микроядро),
  8. Reflection (отражение).

14 of 59

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

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

15 of 59

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

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

    • «A Pattern Language: Towns, Buildings, Construction» (1977 г.),
    • «The Timeless Way of Building» (1979 г.).

16 of 59

Развитие идеи паттернов

  • В 1987 году Кент Бэк (Kent Beck) и Вард Каннигем (Ward Cunningham) разработали шаблоны разработки ПО для графических оболочек на языке Smalltalk.
  • В 1991 году Эрих Гамма совместно с Ричардом Хелмом (Richard Helm), Ральфом Джонсоном (Ralph Johnson) и Джоном Влиссидсом (John Vlissides) публикует книгу «Design Patterns — Elements of Reusable Object-Oriented Software» [GoF91].
    • Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. «Приемы объектно-ориентированного проектирования. Паттерны проектирования.» - СПб: Питер, 2001. - 386 с.
  • В этой книге описаны 23 паттерна проектирования.

17 of 59

Развитие идеи паттернов (2)

  • Мэри Шоу (Mary Shaw), Дэвид Гарлан (David Garlan), 1996 Опубликовали книгу «Архитектура программного обеспечения» – классификация архитектурных стилей;
  • Мартин Фаулер (Martin Fowler) опубликовал книгу «Архитектура корпоративных программных приложений» - типовые решения при разработке КИС,
    • Например, работа с базами данных, транзакциями и т.п.;
  • Джошуа Кериевски (Joshua Kerievsky) показал, как можно постоянным рефакторингом, руководствуясь базовыми принципами ООП, обеспечить эволюцию кода, перемещая его от одного паттерна к другому в зависимости от требований;
  • После начала активного использования модульного тестирования (Unit Testing) программного кода все паттерны при этом были переосмыслены с позиций тестируемости.

18 of 59

  • Martin C. Robert, Martin Micah Agile Principles, Patterns, and Practices in C#. - Prentice Hall, 2006, 768 p.
    • Роберт Мартин, Мика Мартин Принципы, паттерны и методики гибкой разработки на языке C#. - Пер. с англ. – СПб.: Символ-Плюс, 2011. – 768 с.

Robert C. Martin

President and Chief Executive Officer

Object Mentor 

19 of 59

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

  • Паттерн проектирования ПО – это описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте [GoF].
  • Следует отличать паттерны проектирования от идиом.
    • Паттерны проектирования не зависят от выбора языка (хотя их реализации, зачастую, зависимы от языка программирования).
    • Идиомы — это паттерны, описывающие типичные решения на конкретном языке программирования.

20 of 59

Описание паттернов

  • В общем случае каждый паттерн состоит из таких составляющих:
  • Имя является уникальным идентификатором паттерна. Имена паттернов проектирования, описанных в [GoF], являются общепринятыми.

2. Задача описывает ситуацию, в которой можно применять паттерн.

3. Решения задачи проектирования в виде паттерна определяет общие функции каждого элемента дизайна и отношения между ними.

4. Результаты представляют следствия применения паттерна.

21 of 59

Классификация шаблонов �Gamma и др.

  • 23 базовых шаблона
  • Шаблоны создания (Creational patterns) - builder, factory, prototype, singleton
  • Структурные шаблоны (Structural patterns) - adapter, bridge, composite, decorator, façade, flyweight, proxy
  • Шаблоны поведения (Behavioral patterns) - command, interpreter, iterator, mediator, memento, observer, state, strategy, template, visitor

22 of 59

Организация каталога шаблонов

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

23 of 59

Критерии классификации

  • Паттерны проектирования различаются степенью детализации и уровнем абстракции
  • Паттерны можно классифицировать по двум критериям :
    • Цель -- отражает назначение паттерна.
    • Уровень -- говорит о том, к чему обычно применяется паттерн.

24 of 59

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

  1. Порождающие паттерны (Creational Patterns).
    • Определяют способы создания объектов в системе.
  2. Структурные паттерны (Structural Patterns).
    • Описывают способы построение сложных структур из классов и объектов.
  3. Поведенческие паттерны (Behavioral Patterns).
    • Описывают способы взаимодействия между объектами.

25 of 59

Классификация по уровням паттернов проектирования

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

26 of 59

Сводная таблица�паттернов проектирования

Цель

Уровень

Порождающие паттерны

Структурные паттерны

Паттерны поведения

Класс

Factory Method

Adapter (класса)

Interpreter

Template Method

Объект

Abstract Factory

Singleton

Prototype

Builder

Adapter (объекта)

Decorator

Proxy

Composite

Bridge

Flyweight

Facade

Iterator

Command

Observer

Visitor

Mediator

State

Strategy

Memento

Chain of Responsibility

27 of 59

Список паттернов проектирования�(порождающие)

  1. Factory Method (фабричный метод)
    • Определяет интерфейс для создания объектов, при этом выбранный класс инстанцируется подклассами
  2. Abstract Factory (абстрактная фабрика)
    • Предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны
  3. Singleton (одиночка)
    • Гарантирует, что некоторый класс может иметь только один экземпляр, и предоставляет глобальную точку доступа к нему
  4. Prototype (прототип)
    • Описывает виды создаваемых объектов с помощью прототипа и создает новые объекты путем его копирования
  5. Builder (строитель)
    • Отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс конструирования для создания различных представлений.

28 of 59

Список паттернов проектирования (структурные )

  1. Adapter (адаптер)
    • Преобразует интерфейс класса в некоторый другой интерфейс, ожидаемый клиентами.
    • Обеспечивает совместную работу классов, которая была бы невозможна без данного паттерна из-за несовместимости интерфейсов.
  2. Bridge (мост)
    • Отделяет абстракцию от реализации, благодаря чему появляется возможность независимо изменять то и другое.
  3. Decorator (декоратор)
    • Динамически возлагает на объект новые функции.
    • Применяются для расширения имеющейся функциональности и являются гибкой альтернативой порождению подклассов.

29 of 59

Список паттернов проектирования (структурные) (2)

  1. Proxy (заместитель)
    • Подменяет другой объект для контроля доступа к нему
  2. Facade (фасад)
    • Предоставляет унифицированный интерфейс к множеству интерфейсов в некоторой подсистеме.
    • Определяет интерфейс более высокого уровня, облегчающий работу с подсистемой.
  3. Composite (компоновщик)
    • Группирует объекты в древовидные структуры для представления иерархий типа «часть-целое».
    • Позволяет клиентам работать с единичными объектами так же, как с группами объектов.
  4. Flyweight (приспособленец)
    • Использует разделение для эффективной поддержки большого числа мелких объектов.

30 of 59

Список паттернов проектирования (поведения)

  1. Interpreter (интерпретатор)
    • Для заданного языка определяет представление его грамматики, а также интерпретатор предложений языка, использующий это представление
  2. Template Method (шаблонный метод)
    • Определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы.
    • Позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры
  3. Iterator (итератор)
    • Дает возможность последовательно обойти все элементы составного объекта, не раскрывая его внутреннего представления.

31 of 59

Список паттернов проектирования (поведения) (2)

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

32 of 59

Список паттернов проектирования (поведения) (3)

  1. Mediator (посредник)
    • Определяет объект, в котором инкапсулировано знание о том, как взаимодействуют объекты из некоторого множества.
    • Способствует уменьшению числа связей между объектами, позволяя им работать без явных ссылок друг на друга.
    • Это, в свою очередь, дает возможность независимо изменять схему взаимодействия
  2. Memento (хранитель)
    • Позволяет, не нарушая инкапсуляции, получить и сохранить во внешней памяти внутреннее состояние объекта, чтобы позже объект можно было восстановить точно в таком же состоянии.

33 of 59

Список паттернов проектирования (5)

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

34 of 59

Список паттернов проектирования (поведения) (4)

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

35 of 59

36 of 59

Классификация архитектурных стилей Show&Garlan

  • Архитектура потоков данных
  • Независимые компоненты
  • Виртуальные машины
  • Репозиторные архитектуры
  • Уровневые архитектуры.

37 of 59

Архитектура потоков данных

    • Последовательные пакеты
    • Каналы и фильтры
  • Каждый процесс обработки данных проектируется независимо
  • Данные поступают, обрабатываются и передаются.

38 of 59

Архитектура каналов и фильтров

  • Обрабатывающие модули ждут данных, чтобы начать свою работу

39 of 59

Классификация архитектур Show&Garlan

  • Архитектура потоков данных
    • Последовательные пакеты
    • Каналы и фильтры
  • Независимые компоненты
    • Параллельно взаимодействующие процессы
    • Клиент-серверные системы
    • Системы, управляемые событиями
  • Виртуальные машины
    • Интерпретаторы
    • Системы, основанные на правилах
  • Репозиторные архитектуры
    • Базы данных
    • Гипертекстовые системы
    • Доски объявлений
  • Уровневые архитектуры

40 of 59

Архитектура независимых компонент

  • Состоит из компонент, работающих независимо и обменивающихся между собой информацией

    • Параллельно взаимодействующие процессы
    • Клиент-серверные системы
    • Системы, управляемые событиями.

41 of 59

Клиент-серверная архитектура

  • Серверы обслуживают клиентов с помощью запросов
  • Низкое сцепление между компонентами
  • «Узкий» интерфейс
  • Шаблон «Facade»

42 of 59

Шаблон «Фасад»

43 of 59

Архитектура библиотечной системы фильмов и фотографий

44 of 59

Архитектура параллельно взаимодействующих процессов

  • Параллельный запуск нескольких процессов (потоков, нитей)
  • Шаблон «Observer» (наблюдатель)

45 of 59

Шаблон «Наблюдатель»

46 of 59

Архитектура событийно-управляемых систем

  • Приложение состоит из набора компонент, каждый из которых находится в состоянии ожидания, пока не произойдет воздействующее на него событие
  • Если поведение описывается набором состояний –
  • Подходит Шаблон «State»

47 of 59

Шаблон «State»

48 of 59

Архитектура виртуальных машин

  • Рассматривает приложение, как программу, написанную на специальном языке
  • Если грамматика мала и скорость некритична – подходит Шаблон Interpreter

49 of 59

Репозиторные архитектуры

  • Виды репозиторных архитектур:
    • Базы данных
    • Гипертекстовые системы
    • Доски объявлений
  • Шаблон «Iterator»

50 of 59

Архитектура набора CASE-средств

51 of 59

Шаблон «Iterator»

52 of 59

Уровневые архитектуры

  • Уровень = Слой (Layer)
  • Видимость «сверху вниз»
  • Инкапсуляция внутренних слоев
  • Высокая степень автономности слоев

  • Количество уровней
  • Особенности реализации уровней.

53 of 59

Эталонная трехслойная модель

  • Слой представления (Presentation)
  • Слой предметной области или домен (Domain)
  • Источник данных (Data Source)

54 of 59

Преимущества «расслоения»

  • Отдельный слой можно воспринимать как единое самодостаточное целое, не особенно заботясь о наличии других)
  • Можно выбирать альтернативную реализацию базовых слоев
  • Зависимость между слоями можно свести к минимуму.
  • Каждый слой является удачным кандидатом на стандартизацию (например, TCP и
  • Созданный слой может служить основой для нескольких различных слоев более высокого уровня

55 of 59

М. Фаулер. Архитектура корпоративных программных приложений

• "расслоение" приложения по уровням;

• структурирование логики предметной области;

• разработка пользовательского Web-интерфейса;

• связывание модулей, размещаемых в памяти (в частности, объектов), с реляционной базой данных;

• принципы распределения программных компонентов и данных.

56 of 59

Область знаний «проектирование ПО» в SWEBOK

  1. Основы проектирования
  2. Ключевые вопросы проектирования
  3. Структура и архитектура ПО
  4. Анализ качества и оценка результатов проектирования
  5. Нотации проектирования ПО
  6. Стратегии и методы проектирования ПО

57 of 59

3.2. Архитектурные стили

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

Примеры:

  • Каналы и фильтры
  • Уровневые архитектуры
  • Данные-представления-обработка (MVC)
  • и т.д.

58 of 59

3.3. Шаблоны проектирования

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

59 of 59

Классификации архитектур (архитектурных стилей)

  • Gamma, Johnson, Helm, Vlissides
    • Эрик Брауде. Технология разработки программного обеспечения – СПб, Питер, 2004
  • Show, Garlan
    • Mary Shaw and David Garlan, Software Architecture -- Perspectives on an Emerging Discipline, Prentice Hall, 1996
  • Fowler
    • Мартин Фаулер. Архитектура корпоративных программных приложений.: — М.: Издательский дом "Вильямс", 2006.