Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Программирование – 1 курс весна 2022 – 11 занятие

Программирование – 1 курс весна 2022 – 11 занятие

ТиМПИ

May 17, 2022
Tweet

More Decks by ТиМПИ

Other Decks in Programming

Transcript

  1. 17 мая 2022
    [email protected]
    Олисеенко Валерий Дмитриевич
    Ассистент кафедры информатики
    Паттерны проектирования

    View full-size slide

  2. 2/13
    2/13
    Что это?
    Паттерн проектирования — архитектурная
    конструкция, позволяющая решать схожие
    проблемы в “проектировании”.
    Чем паттерн проектирования
    отличается от алгоритма?

    View full-size slide

  3. 3/13
    3/13
    Составляющее паттернов
    • Описание проблемы
    • Мотивация предлагаемого решения
    • Описание и структура классов
    • Пример применения (код)
    • Связи с другими паттернами

    View full-size slide

  4. 4/13
    4/13
    История паттернов
    • Александер К., Исикава С., Силверстайн М. Язык шаблонов:
    города, здания, строительство. – Москва: Изд-во Студии
    Артемия Лебедева, 2014. – 1093 с.
    • Гамма Э., Хелм Р., Джонсон Р., Влиссидес Д. Приемы
    объектно-ориентированного проектирования. Паттерны
    проектирования.– 2007. [23 паттерна, GoF book]

    View full-size slide

  5. 5/13
    5/13
    Зачем нужны паттерны?
    • Стандартизация кода
    • Проверенные решения
    • Создание понятной архитектуры
    Критика:
    • Костыли для слабого языка
    • Неэффективные решения («как в книжке»)
    • Неправильное применение (Золотой молоток)

    View full-size slide

  6. 6/13
    6/13
    Классификация паттернов
    • Порождающие паттерны (гибкое создание объектов)
    • Структурные паттерны (способы связи между объектами)
    • Поведенческие паттерны (коммуникация между объектами)
    Основная цель изучения паттернов — понять зачем и как
    применять

    View full-size slide

  7. 7/13
    7/13
    Синглтон (порождающий паттерн)
    Суть: паттерн гарантирует, что у класса есть только один экземпляр и
    глобальная точка доступа
    Проблема:
    - Нужен постоянный объект при обращении к классу
    - Нужна глобальная «защищенная» (от перезаписи) точка доступа
    Решение: скрыть конструктор класса и реализовать static-метод для
    управления классом

    View full-size slide

  8. 8/13
    8/13
    Синглтон
    Мотивация:
    • В программе нужен один экземпляр класса
    • Когда нужен контроль над глобальными переменными
    Плюсы и минусы:
    + Гарантирует наличие одного экземпляра класса
    + Даёт глобальную точку доступа
    + Отложенная инициализация
    – Нарушение принципов ООП
    – Может маскировать плохой дизайн программы
    – Проблемы с многопоточностью
    https://bool.dev/blog/detail/pattern-singleton

    View full-size slide

  9. 9/13
    9/13
    Синглтон алгоритм
    1) Добавить в класс приватное статическое поле, которое будет
    содержать одиночный объект
    2) Объявить статический метод для создания одиночки (getInstance())
    3) Добавить в статический метод (getInstance()) создание объекта при
    первом вызове метода
    4) Создать приватный конструктор
    5) Заменить вызовы конструктора одиночка вызовами его
    создающего метода

    View full-size slide

  10. 10/13
    10/13
    Мост (структурный паттерн)
    Суть: разделить классы на абстракцию и реализацию
    Проблема:
    - Фигур
    Решение: замена наследования агрегацией или композицией
    (фигура->цвет или GUI+API)

    View full-size slide

  11. 11/13
    11/13
    Мост
    Мотивация:
    • Разделить класс, который содержит несколько реализаций одной
    функциональности
    • Когда класс нужно расширять в двух независимых плоскостях
    • Когда необходимо изменять во время выполнения программы
    Плюсы и минусы:
    + Возможность построения кросс-платформенные программы
    + Возможность скрыть детали клиентского кода
    – Сильно усложняет код программы

    View full-size slide

  12. 12/13
    12/13
    Мост алгоритм
    1) Определить по какому измерению можно разделить класс
    2) Выделить и описать абстракцию (базовый класс, «фигура»)
    3) Выделить часть, необходимую абстракции — реализация (общий интерфейс,
    «цвет фигуры»)
    4) Под каждую задачу опишите конкретную реализацию (красный цвет, черный
    цвет и т.д.)
    5) Добавьте в класс абстракции ссылку на объект реализации
    6) Если у вас есть несколько вариаций абстракции, создайте для каждой из них
    свой подкласс
    7) Подать объект реализации в конструктор абстракции, чтобы связать их
    воедино. Использовать объект абстракции

    View full-size slide

  13. 13/13
    13/13
    Снимок (поведенческий паттерн)
    Суть: сохранить и восстановить состояния объектов
    Проблема:
    • создание и откат истории файла
    • приватность
    • изменение кода классов копирования
    Решение: поручить создание копии состояния объекта самому
    объекту, который этим состоянием владеет

    View full-size slide

  14. 14/13
    14/13
    Снимок
    Мотивация:
    • Когда нужно сохранить состояние объекта
    • Когда прямое получение состояния объекта раскрывает
    приватные детали его реализации, нарушая инкапсуляцию
    Плюсы и минусы:
    + Не нарушает инкапсуляции исходного объекта
    + Исходному объекту не надо хранить свою историю
    – Требует много памяти
    – Сложно гарантировать приватность (Python, JS, PHP и др.)

    View full-size slide

  15. 15/13
    15/13
    Снимок алгоритм
    1) Определить класс создателя
    2) Создайте класс снимка и опишите поля как у создателя
    3) Защитите объект снимка от изменений
    4) Сделайте класс снимка вложенным в класс создателя (или
    создайте интерфейс)
    5) Добавьте в класс создателя метод получения снимков
    6) Добавьте в класс создателя метод восстановления из
    снимка

    View full-size slide

  16. 16/13
    16/13
    Какие ещё паттерны есть?
    Порождающие:
    • Фабричный метод
    • Абстрактная
    фабрика
    • Строитель
    • Прототип
    Структурные:
    • Адаптер
    • Компоновщик
    • Декоратор
    • Фасад
    • Легковес
    • Заместитель
    Поведенческие:
    • Цепочка
    обязанностей
    • Команда
    • Итератор
    • Состояние

    View full-size slide

  17. 17 мая 2022
    [email protected]
    Олисеенко Валерий Дмитриевич
    Ассистент кафедры информатики
    Паттерны проектирования

    View full-size slide