Объекто-ориентированное проектирование Паттерны проектирования. 28 февраля 2008 г. 4 курс Технологии программирования
2 Основные понятия ООП Объектно-ориентированные программы состоят из объектов. Объект сочетает данные и процедуры для их обработки. Такие процедуры обычно называют методами или операциями. Объект выполняет операцию, когда получает запрос (или сообщение) от клиента.
3 Инкапсуляция Посылка запроса - это единственный способ заставить объект выполнить операцию. А выполнение операции - единственный способ изменить внутреннее состояние объекта. Таким образом, внутреннее состояние объекта инкапсулировано: к нему нельзя получить непосредственный доступ, то есть представление объекта закрыто от внешней программы.
4 Интерфейсы При объявлении объектом любой операции должны быть заданы: имя операции, объекты, передаваемые в качестве параметров, значение, возвращаемое операцией. Эту триаду называют сигнатурой операции. Множество сигнатур всех определенных для объекта операций называется интерфейсом этого объекта. Тип это имя конкретного интерфейса.
5 Динамическое связывание Когда объекту посылается запрос, то операция, которую он будет выполнять, зависит как от запроса, так и от объекта- адресата. Разные объекты, поддерживающие одинаковые интерфейсы, могут выполнять в ответ на такие запросы разные операции. Ассоциация запроса с объектом и одной из его операций во время выполнения называется динамическим связыванием.
6 Полиморфизм Допустимо написать программу, которая ожидает объект с конкретным интерфейсом, точно зная, что любой объект с подходящим интерфейсом сможет принять этот запрос. Более того, динамическое связывание позволяет во время выполнения подставить вместо одного объекта другой, если он имеет точно такой же интерфейс. Такая взаимозаменяемость называется полиморфизмом.
7 Реализация Реализация объекта определяется его классом. Класс специфицирует внутренние данные объекта и его представление, а также операции, которые объект может выполнять. Объекты создаются с помощью инстанцирования класса. Говорят, что объект является экземпляром класса. В процессе инстанцирования выделяется память для переменных экземпляра (внутренних данных объекта), и с этими данными ассоциируются операции.
8 Наследование Новые классы можно определить в терминах существующих с помощью наследования классов. Если подкласс наследует родительскому классу, то он включает определения всех данных и операций, определенных в родительском классе. Класс называется абстрактным, если его единственное назначение - определить общий интерфейс для всех своих подклассов.
9 Принципы ООП Программируйте в соответствии с интерфейсом, а не с реализацией. (принцип «черного ящика») Предпочитайте композицию наследованию класса. (наследование фиксируется на этапе компиляции; наследование нарушает инкапсуляцию)
10 Причины перепроектирования При создании объекта явно указывается класс. Зависимость от конкретных операций. Зависимость от аппаратной и программной платформ. Зависимость от представления или реализации объекта. Зависимость от алгоритмов. Сильная связанность. Расширение функциональности за счет порождения подклассов. Неудобства при изменении классов.
11 Паттерны Любой паттерн описывает задачу, которая снова и снова возникает в нашей работе, а также принцип ее решения, причем таким образом, что это решение можно потом использовать миллион раз, ничего не изобретая заново. Кристофер Александер.
Классификация паттернов Порождающие паттерны Абстрактная фабрика, Одиночка, Прототип, Строитель, Фабричный метод Структурные паттерны Адаптер, Декоратор, Заместитель, Компоновщик, Мост, Приспособленец, Фасад Паттерны поведения Интерпретатор, Итератор, Команда, Наблюдатель, Посетитель, Посредник, Состояние, Стратегия, Хранитель, Цепочка обязанностей, Шаблонный метод 12
13 Абстрактная фабрика Этот паттерн может создавать семейства объектов, не инстанцируя классы явно. Применять его лучше всего, когда число и общий вид изготавливаемых объектов остаются постоянными, но между конкретными семействами продуктов имеются различия. Выбор того или иного семейства осуществляется путем инстанцирования конкретной фабрики, после чего она используется для создания всех объектов.
14 Одиночка (Singleton) Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Определяет операцию Instance, которая позволяет клиентам получать доступ к единственному экземпляру. Instance - это операция класса, то есть статическая функция-член в C++ Клиенты получают доступ к экземпляру класса Singleton только через его операцию Instance.
15 Фабричный метод Фабричный метод позволяет классу делегировать инстанцирование подклассам. Используйте паттерн фабричный метод, когда: классу заранее неизвестно, объекты каких классов ему нужно создавать; класс спроектирован так, чтобы объекты, которые он создает, специфицировались подклассами; класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и вы планируете локализовать знание о том, какой класс принимает эти обязанности на себя.
16 Строитель (Builder) Абстрактная фабрика похожа на строитель в том смысле, что может конструировать сложные объекты. Основное различие между ними в том, что строитель делает акцент на пошаговом конструировании объекта, а абстрактная фабрика - на создании семейств объектов (простых или сложных). Строитель возвращает продукт на последнем шаге, тогда как с точки зрения абстрактной фабрики продукт возвращается немедленно.
17 Прототип Задает виды создаваемых объектов с помощью экземпляра-прототипа и создает новые объекты путем копирования этого прототипа. У прототипа те же самые результаты, что у абстрактной фабрики и строителя: он скрывает от клиента конкретные классы продуктов, уменьшая тем самым число известных клиенту имен.
18 Цепочка обязанностей
19 Команда
20 Мост
21 Хранитель
22 Заместитель
23 Итератор
24 Стратегия
25 Посетитель
26 Фасад
27 Посредник
28 Наблюдатель
29 Компоновщик
30 Декоратор
31 Адаптер
32 Приспособленец
33 Шаблонный метод
34 Хранитель
35 Состояние
36 Назначение паттернов
37 Слабости паттернов
38 Спасибо за внимание Конец лекции. Следующая лекция 10 мая 2007 г.: Тестирование программ.