SlideShare a Scribd company logo
Углубленное программирование
на языке C++
Алексей Петров
Лекция №7. Принципы и шаблоны
ОО-проектирования. Базовые и
порождающие шаблоны
• Ключевые проблемы и принципы объектно-ориентированного
проектирования.
• Типология шаблонов.
• Базовые шаблоны: наследование и композиция, интерфейс,
делегирование, неизменяемые объекты.
• Порождающие шаблоны: абстрактные фабрики, виртуальные
конструкторы, прототипы, строители, классы с единственным
экземпляром.
• Постановка задач к практикуму №5.
Объектно-ориентированное
проектирование: общие сведения
Цель объектно-ориентированного проектирования — разработка
архитектуры (дизайна) сложных программных систем в соответствии с
заданными или общепринятыми критериями качества и с учетом
реализуемости архитектуры на выбранном языке объектно-
ориентированного программирования.
Критерии качества архитектуры, как правило, обеспечивают:
• возможность повторного использования;
• гибкость настройки;
• расширяемость и переносимость;
• структурированность и модульность;
• компактность и разумный уровень детализации;
• понятность и простоту (в том числе взаимодействия компонентов).
Проектирование как
искусство компромисса
Решение задач объектно-ориентированного проектирования в
большинстве случаев предполагает достижения множества
компромиссов.
Проблемы объектно-
ориентированного проектирования
Проблема №1. Идентификация объектов
Проблема №2. Определение степени детализации
Проблема №3. Определение интерфейса объекта
Проблема №4. Определение реализации объекта
Проблемы №1-2. Определение
состава и степени детализации
объектов
Проблемы №3-4. Определение
интерфейса и реализации
объектов
Причины перепроектирования
Явное задание классов при создании объектов:
• привязка к реализации (классу), а не к интерфейсу (типу).
Явное задание способа выполнения операций:
• сужение множества вариантов обслуживания запроса до
единственного возможного.
Зависимость от программной и (или) аппаратной платформы.
Зависимость клиента от представления или реализации объекта:
• потенциальная необходимость модификации клиента при
изменении способа представления, хранения или реализации
объекта.
Зависимость от алгоритмов.
Сильная связанность классов:
• формирование монолитных систем без слоевой структуры.
Чрезмерное использование наследования.
Максимы проектирования
Не решать каждую задачу «с нуля»
Инкапсулировать допускающие изменения элементы дизайна и
поведения (напр., алгоритмы, состояния, процессы создания объектов)
Программировать в соответствии с интерфейсом, а не с
реализацией (англ. Programming to interfaces):
• клиент не должен обладать информацией о типах используемых
объектов, если они имеют ожидаемый интерфейс;
• клиент не должен знать о классах, посредством которых
используемые объекты реализованы
Проектировать системы с учетом будущих изменений
Предпочитать композицию объектов, а не наследование классов
Использовать возможности языка программирования
• Но: поведение системы должен определять не язык, а
проектировщик
Шаблоны (паттерны)
проектирования
Обобщенные типовые архитектурные решения задач объектно-
ориентированного проектирования известны как шаблоны (паттерны)
проектирования.
Примечание: использованный ранее термин «шаблон класса
(функции)» известен в английском языке как class (function) template,
тогда как для обозначения архитектурных концепций традиционно
применяется англоязычный эквивалент design pattern.
Один из первых авторитетных каталогов шаблонов проектирования
составлен Э. Гаммой (Erich Gamma), Р. Хелмом (Richard Helm), Р.
Джонсоном (Ralph Johnson) и Дж. Влиссидесом (John Vlissides),
известными как «банда четырех» (англ. GoF — Gang of Four) и
опубликовавшими книгу Design Patterns: Elements of Reusable Object-
Oriented Software.
Шаблоны: определение,
преимущества, состав
По определению членов GoF, шаблон — это описание
взаимодействия объектов и классов, адаптированных для решения
общей задачи проектирования в конкретном контексте.
Активное использование шаблонов проектирования позволяет:
• повысить качество кода;
• улучшить техническую документацию;
• обеспечить качество сопровождения ПО.
Типология шаблонов (1 / 2)
В зависимости от цели использования шаблоны делятся на три
категории:
• порождающие — описывают процессы создания объектов;
• структурные — описывают способы композиции классов
(объектов);
• поведенческие — описывают взаимодействие классов (объектов)
между собой.
Типология шаблонов (2 / 2)
Пространство шаблонов GoF
Уровень
применения
Порождающие
шаблоны
Структурные
шаблоны
Поведенческие
шаблоны
Класс Фабричный
метод
Адаптер класса Интерпретатор
Шаблонный метод
Объект Абстрактная
фабрика
Класс с
единственным
экземпляром
Прототип
Строитель
Адаптер
объекта
Декоратор
Заместитель
Компоновщик
Мост
Приспособленец
Фасад
Итератор
Команда
Наблюдатель
Посетитель
Посредник
Состояние
Стратегия
Хранитель
Цепочка
ответственности
Стек шаблонов:
от потоков до служб
Базовые шаблоны:
наследование и композиция
Наследование классов (англ. inheritance) и композиция объектов
(англ. composition) являются распространенными приемами
повторного использования функциональных возможностей объектно-
ориентированных систем, а потому могут рассматриваться как базовые
шаблоны.
Наследование Композиция
Что? Определяет реализацию
одного класса в терминах
другого (white-box reuse)
Определяет реализацию
одного объекта в терминах
другого (black-box reuse)
Как? Определение подкласса Определение атрибута
(объединение объектов)
Когда? При компиляции
(статически)
При компиляции
(статически) или при
выполнении (динамически)
Наследование и композиция:
«за» и «против»
Критерий качества Наследование Композиция
Реализация и модификация Простая Сложная
Зависимость от реализации Высокая Низкая
Соблюдение инкапсуляции Нет Есть
Замена реализации при
выполнении
Невозможна Возможна
Необходимость тщательного
проектирования интерфейса
Нет Есть
Гибкость и возможность повторного
применения
Низкая Высокая
Размер класса Большой Небольшой
Количество классов Зависит от дизайна
Количество используемых объектов Мало Много
Наследование и композиция:
реализация
Composite
-impl
Implementer
Implementer
Aggregate1
-impl1
Aggregate2
-impl2
Три способа композиции
Характеристика
участника
Implementer
Инкапсуля-
ция
экземпляра
Инкапсуля-
ция ссылки
Инкапсуля-
ция указателя
Обязательность Обязателен Обязателен Необязателен
Количество
(кратность)
1 .. * 1 .. * 0 .. *
Зависимость
времени жизни (ВЖ)
от ВЖ агрегата
Зависит
(совпадает)
Не зависит
(совпадает
или
превышает)
Не зависит
Возможность
совместного
использования
Нет Есть Есть
Определение
атрибута
Implementer
impl;
Implementer
&impl;
Implementer
*impl;
Агрегирование или
осведомленность?
Агрегирование (англ. aggregation) и осведомленность (англ.
acquaintance) — две стороны композиции. Различия между ними
весьма существенны, хотя и определяются предполагаемым
использованием объектов, а не механизмами языка.
Характеристика Агрегирование Осведомленность
Семантика «Содержит», «владеет»,
«несет ответственность»
«Знает», «использует»,
«ассоциирован с…»
Сила Сильное Слабое
Постоянство Высокое Низкое
Частота применения Низкая Высокая
Время жизни Одинаково для агрегата и
составляющих
Любое
Инкапсулируемый
элемент
Экземпляр, ссылка,
указатель
Ссылка, указатель
Дискуссия
Наследование и композиция: примеры…
Базовые шаблоны:
делегирование
Делегирование (англ. delegation) — это передача ответственности за
выполнение запроса клиента от непосредственного получателя
(делегирующей стороны, англ. delegator) уполномоченному (делегату,
англ. delegate). Различают делегирование при наследовании классов
и при композиции объектов.
Назначение делегирования — абстрагирование (при композиции —
также инкапсуляция) поведения (реакции на клиентский запрос).
Шаблон делегирования используется в целом ряде шаблонов GoF
(«посетитель», «стратегия» и др.).
Ключевое достоинство делегирования — упрощение композиции
поведений на стадии выполнения.
Ключевой недостаток делегирования — трудность статического
анализа и понимания сильно параметризованного исходного кода.
Делегирование: реализация
Наследование Композиция
Получатель Производный класс Объект на стороне «целое»
Уполномоченный Базовый класс Объект на стороне «часть»
Доступ к
получателю
Указатель this Указатель на получателя
(должен быть передан)
Абстрактная
семантика
«Является» «Содержит»
Delegate
#DoSomething()
Delegator
+ProcessReq()
Delegator
-delegate
+ProcessReq()
Delegate
+DoSomething()
Дискуссия
Делегирование: примеры…
Базовые шаблоны:
неизменяемые объекты
Неизменяемый объект (англ. immutable object) — шаблон,
позволяющий создать программный объект, структурно не
допускающий модификации после (окончательного) создания.
Основное предназначение шаблона — устранение дорогостоящих
операций копирования и сравнения объектов путем использования
семантики ссылок.
В дизайне систем различают неизменность объекта:
• с точки зрения самой системы и ее пользователей;
• на битовом (внутримашинном) и абстрактном (логическом) уровне.
Достоинства неизменяемого объекта:
• константность, гарантируемая компилятором;
• потоковая безопасность;
• структурная надежность;
• простота анализа и понимания кода.
Неизменяемые объекты:
реализация
Реализация неизменяемого объекта на языке C++ предполагает:
• полное построение объекта конструктором класса (кроме
отложенной инициализации подмножества атрибутов);
• полное отсутствие неконстантных открытых статических и
нестатических атрибутов (без спецификатора const или со
спецификатором mutable);
• отсутствие мутаторов, изменяющих состояние всего объекта (для
побитовой неизменности) или части, видимой извне пользователю
(для логической неизменности).
Базовые шаблоны: интерфейс
Интерфейсный класс, или интерфейс (англ. interface) — шаблон,
структурирующий способы доступа к одному или нескольким (другим)
классам.
Классическое назначение интерфейса — определение нового
абстрактного типа данных (ADT) в целях его дальнейшего повторного
использования. Такой абстрактный тип обычно не содержит никаких
данных, но демонстрирует необходимое поведение.
Достоинство интерфейса состоит в обеспечении возможности
статической или динамической замены конкретных классов,
реализующих указанный интерфейс.
Интерфейс: реализация
Порождающие шаблоны:
общие сведения
Порождающие шаблоны:
• абстрагируют процессы создания объектов и инкапсулируют
сведения об инстанцируемых классах;
• обеспечивают независимость системы от способа создания,
композиции и представления объектов;
• наиболее важны для систем, основанных на композиции больше,
чем на наследовании.
Порождающие шаблоны:
абстрактная фабрика
Абстрактная фабрика (инструментарий, англ. kit) — шаблон уровня
объекта, предоставляющий интерфейс для создания семейств
взаимосвязанных (взаимозависимых) объектов.
Используется, когда:
• система не должна зависеть от способов создания, компоновки и
представления объектов;
• объекты разных семейств гарантированно не должны
использоваться совместно;
• используемое семейство объектов должно являться параметром
конфигурации системы.
Участники: абстрактная фабрика, конкретная фабрика, абстрактный
продукт, конкретный продукт, клиент.
Абстрактная фабрика:
реализация
Абстрактная фабрика:
обсуждение
Результаты:
• сокрытие (изоляция) конкретных классов — имена изготавливаемых
классов известны только абстрактной фабрике;
• упрощение замены семейств продуктов — класс фабрики
упоминается в приложении только при ее инстанцировании;
• обеспечение гарантии сочетаемости продуктов.
Недостаток:
• трудность поддержки новых видов продуктов.
Аспекты реализации:
• фабрика как объект класса с единственным экземпляром;
• создание продуктов через фабричные методы или прототипы;
• расширяемость фабрик.
Порождающие шаблоны:
строитель
Строитель — шаблон уровня объекта, отделяющий конструирование
сложного объекта от его представления.
Используется, когда:
• алгоритм создания сложного объекта не должен зависеть от состава
объекта и способов компоновки его частей;
• процесс конструирования объекта должен обеспечивать его
различные представления.
Участники: абстрактный строитель, конкретный строитель,
распорядитель, продукт, клиент.
Строитель: реализация
Director
-builder
+Construct()
AbstractBuilder
+BuildPart()
+GetResult()
ConcreteBuilder
+BuildPart()
+GetResult()
Product
Строитель: обсуждение
Результаты:
• возможность изменения внутреннего представления продукта —
процесс сборки, представление и внутренняя структура продукта
могут быть скрыты за абстрактным интерфейсом строителя;
• изоляция кода создания и представления сложного объекта —
классы, определяющие внутреннюю структуру продукта, в
интерфейсе строителя не присутствуют;
• возможность пошаговой сборки — предоставляемый строителем
контроль над сборкой продукта более тонок, чем у других шаблонов.
Аспекты реализации:
• интерфейс сборки и конструирования;
• отсутствие абстрактных продуктов;
• определение пустых методов в абстрактных строителях.
Порождающие шаблоны:
фабричный метод
Фабричный метод (виртуальный конструктор, англ. virtual constructor)
— шаблон уровня класса, определяющий абстрактный интерфейс
создания объектов и делегирующий выбор типов инстанцируемых
объектов конкретным подклассам.
Используется, когда:
• заранее неизвестен тип инстанцируемых объектов;
• дизайн класса с фабричным методом предполагает, что
создаваемые объекты специфицируются подклассами;
• класс делегирует свои обязанности по инстанцированию объектов
одному из своих подклассов.
Участники: абстрактный создатель, конкретный создатель,
абстрактный продукт, конкретный продукт.
Фабричный метод:
реализация
AbstractCreator
+FactoryMethod()
+Operation()
ConcreteCreator
+FactoryMethod()
AbstractProduct
ConcreteProduct
Фабричный метод:
обсуждение (1 / 2)
Результаты:
• независимость системы от классов продуктов — имена классов
продуктов инкапсулированы в фабричных методах конкретных
создателей;
• возможность использования фабричных методов как операций-
«зацепок» (англ. hook operations);
• соединение параллельных иерархий классов — фабричный метод
инкапсулирует сведения о том, какие классы могут работать вместе.
Фабричный метод:
обсуждение (2 / 2)
Недостаток:
• подкласс конкретного создателя должен определяться для создания
даже одного экземпляра интересующего продукта.
Аспекты реализации:
• базовый класс-создатель с неабстрактным фабричным методом;
• параметризация фабричного метода дискриминантом продукта;
• использование шаблонов классов для автоматизации определения
классов конкретных создателей.
Порождающие шаблоны:
прототип
Прототип — шаблон уровня объекта, определяющий вид создаваемого
объекта при помощи экземпляра-прототипа, который явно копируется
при создании объекта.
Используется, когда:
• инстанцируемые классы определяются динамически;
• необходимо избежать возникновения иерархий классов или фабрик,
параллельных иерархиям классов продуктов;
• количество прототипов невелико.
Участники: абстрактный прототип, конкретный прототип, клиент.
Прототип: реализация
Прототип: обсуждение (1 / 2)
Результаты:
• сокрытие (изоляция) конкретных классов — сокращает количество
имен классов, известных клиенту;
• поддержка динамического изменения состава продуктов — клиент
может удалять и устанавливать прототипы во время выполнения
кода;
• сокращение количества необходимых системе классов — роль
«класса»-продукта может выполнять должным образом
настроенный и зарегистрированный на стороне клиента экземпляр-
прототип, а роль класса-создателя — операция клонирования;
• динамическое конфигурирование приложений.
Прототип: обсуждение (2 / 2)
Недостаток:
• необходимость поддержки (в общем случае, нетривиальной)
операции клонирования объектов.
Аспекты реализации:
• использование диспетчера прототипов (ассоциативного реестра,
возвращающего искомый прототип по заданному ключу);
• клонирование путем «глубинного» (не имеет встроенной поддержки
в C++) или «поверхностного» (выполняется почленно, по
умолчанию) копирования;
• инициализация клонов.
Порождающие шаблоны: класс
с единственным экземпляром
Класс с единственным экземпляром (одиночка, жарг. синглтон, англ.
singleton) — шаблон уровня объекта, гарантирующий, что класс
располагает единственным экземпляром, и предоставляющий к нему
глобальную точку доступа.
Используется, когда:
• экземпляр класса должен быть один и только один;
• экземпляр класса должен быть доступен для любого клиента;
• класс должен допускать порождение подклассов с возможностью
работать с ними без модификации клиентской части системы.
Участник: одиночка.
Класс с единственным
экземпляром: минимальная
реализация
class Singleton
{
public: static Singleton* Instance();
protected: Singleton();
private: static Singleton* _instance;
};
Singleton* Singleton::_instance = NULL;
Singleton* Singleton::Instance()
{
if(_instance == NULL)
_instance = new Singleton;
return _instance;
}
Класс с единственным
экземпляром: обсуждение (1 / 2)
Результаты:
• контролируемый доступ к единственному экземпляру;
• сокращение количества глобальных переменных;
• возможность уточнения операций и представления;
• возможность существования переменного количества экземпляров;
• большая гибкость в сравнении с классом, содержащим только
статические атрибуты и методы (альтернативный подход к
реализации одиночек).
Класс с единственным
экземпляром: обсуждение (2 / 2)
Недостатки:
• искусственное ограничение масштабируемости проекта;
• усложнение процедур модульного тестирования системы.
Аспекты реализации:
• гарантия единственности;
• отложенная инициализация — статическая может быть невозможна;
• невозможность установления взаимозависимостей одиночек —
порядок вызова конструкторов глобальных объектов через границы
единиц трансляции в C++ не определен.
Спасибо за внимание
Алексей Петров

More Related Content

PPT
Работа в команде, управление программными проектами
PPTX
Software Engineering Knowledge Matrix
PPTX
C++ осень 2012 лекция 12
PPTX
Составные части объектного подхода
PDF
Шаблоны проектирования GoF
PPTX
ООП. Рекомендуемые информационные ресурсы
PPT
Базовые принципы и понятия технологии разработки объектно-ориентированных инф...
Работа в команде, управление программными проектами
Software Engineering Knowledge Matrix
C++ осень 2012 лекция 12
Составные части объектного подхода
Шаблоны проектирования GoF
ООП. Рекомендуемые информационные ресурсы
Базовые принципы и понятия технологии разработки объектно-ориентированных инф...

What's hot (20)

PDF
Domain-Driven Design: Модель вместо требований
PDF
С.Ковалёв -- теория категорий как математическое основание MBSE
PPT
Понятия технологии разработки объектно-ориентированных информационных систем ...
PPT
UML: Kinds of Diagram
PDF
DDD: проблемы и решения при отражении модели предметной области в код
DOCX
C# programming
PPT
Диаграмма развертывания
PDF
C++ осень 2013 лекция 5
PDF
Сила парадигмы: обзор парадигм программирования
PPTX
Алексей Иванов -- мультиагентные архитектуры в электроэнергетике
PPT
Авиком
PDF
DDD Workshop
PPT
Design Rules And Principles
PPT
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
PPTX
шаблоны проектирования (42)
PPTX
М.Бухарин -- DSM в архитектурном проектировании
PDF
C++ осень 2012 лекция 1
PPTX
Алексей Иванов -- курс по стыку системной и программной инженерий
Domain-Driven Design: Модель вместо требований
С.Ковалёв -- теория категорий как математическое основание MBSE
Понятия технологии разработки объектно-ориентированных информационных систем ...
UML: Kinds of Diagram
DDD: проблемы и решения при отражении модели предметной области в код
C# programming
Диаграмма развертывания
C++ осень 2013 лекция 5
Сила парадигмы: обзор парадигм программирования
Алексей Иванов -- мультиагентные архитектуры в электроэнергетике
Авиком
DDD Workshop
Design Rules And Principles
Евгений Кривошеев: Фундаментальные правила и принципы проектирования ПО
шаблоны проектирования (42)
М.Бухарин -- DSM в архитектурном проектировании
C++ осень 2012 лекция 1
Алексей Иванов -- курс по стыку системной и программной инженерий
Ad

Viewers also liked (10)

PPT
OO Design with C++: 2. Inheritance, part 2
ODT
шаблоны проектирования
PPTX
Шаблоны проектирования. часть 1
PPTX
Паттерны проектирования
PDF
Разработка веб-сервисов осень 2013 лекция 7
PDF
C++ осень 2013 лекция 8
PPT
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
PDF
Лекция 13. YARN
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
PDF
Лекция 11. Вычислительная модель Pregel
OO Design with C++: 2. Inheritance, part 2
шаблоны проектирования
Шаблоны проектирования. часть 1
Паттерны проектирования
Разработка веб-сервисов осень 2013 лекция 7
C++ осень 2013 лекция 8
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Лекция 13. YARN
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 11. Вычислительная модель Pregel
Ad

Similar to C++ осень 2012 лекция 7 (20)

PDF
Бизнес и системный анализ весна 2013 лекция 5
PDF
C# Desktop. Занятие 01.
PPTX
документирование долгоживущих веб проектов. г. белогорцев. зал 3
DOC
Конспект лекций по курсу "Шаблоны разработки ПО"
PPT
OO Design with C++: 0. Intro
PPTX
разработка бизнес приложений (7)
PPTX
Большие проекты, архитектура и фреймворки.
PPTX
Software Design Patterns
PDF
DESIGN PATTERNS? EASY!
PPTX
Genome
PPTX
Современный подход к локализации на примере одного проекта
PPTX
Практические аспекты разработки ПО #3
PPTX
введение в объектно ориентированный анализ
PDF
C++ осень 2012 лекция 8
PDF
Tool View Interface of Integrated Development Environment / Исследование инте...
PPTX
разработка бизнес приложений (6)
PPT
Шаблоны разработки ПО. Часть 1. Введние
PPTX
метод организации репозитория исходного кода
PDF
C++ весна 2014 лекция 5
PPT
2013-04-06 01 Максим Юнусов. Архитектура в agile-проекте
Бизнес и системный анализ весна 2013 лекция 5
C# Desktop. Занятие 01.
документирование долгоживущих веб проектов. г. белогорцев. зал 3
Конспект лекций по курсу "Шаблоны разработки ПО"
OO Design with C++: 0. Intro
разработка бизнес приложений (7)
Большие проекты, архитектура и фреймворки.
Software Design Patterns
DESIGN PATTERNS? EASY!
Genome
Современный подход к локализации на примере одного проекта
Практические аспекты разработки ПО #3
введение в объектно ориентированный анализ
C++ осень 2012 лекция 8
Tool View Interface of Integrated Development Environment / Исследование инте...
разработка бизнес приложений (6)
Шаблоны разработки ПО. Часть 1. Введние
метод организации репозитория исходного кода
C++ весна 2014 лекция 5
2013-04-06 01 Максим Юнусов. Архитектура в agile-проекте

More from Technopark (20)

PDF
Лекция 12. Spark
PDF
Лекция 10. Apache Mahout
PDF
Лекция 9. ZooKeeper
PDF
Лекция 7. Введение в Pig и Hive
PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 4. MapReduce в Hadoop (введение)
PDF
Лекция 3. Распределённая файловая система HDFS
PDF
Лекция 2. Основы Hadoop
PDF
Лекция 1. Введение в Big Data и MapReduce
PPTX
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
PPT
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
PPTX
СУБД 2013 Лекция №9 "Безопасность баз данных"
PPTX
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
PPTX
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
PPTX
СУБД 2013 Лекция №5 "Определение узких мест"
PPTX
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
PPTX
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
PPTX
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
PPTX
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
Лекция 12. Spark
Лекция 10. Apache Mahout
Лекция 9. ZooKeeper
Лекция 7. Введение в Pig и Hive
Лекция 6. MapReduce в Hadoop (графы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 4. MapReduce в Hadoop (введение)
Лекция 3. Распределённая файловая система HDFS
Лекция 2. Основы Hadoop
Лекция 1. Введение в Big Data и MapReduce
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"

C++ осень 2012 лекция 7

  • 2. Лекция №7. Принципы и шаблоны ОО-проектирования. Базовые и порождающие шаблоны • Ключевые проблемы и принципы объектно-ориентированного проектирования. • Типология шаблонов. • Базовые шаблоны: наследование и композиция, интерфейс, делегирование, неизменяемые объекты. • Порождающие шаблоны: абстрактные фабрики, виртуальные конструкторы, прототипы, строители, классы с единственным экземпляром. • Постановка задач к практикуму №5.
  • 3. Объектно-ориентированное проектирование: общие сведения Цель объектно-ориентированного проектирования — разработка архитектуры (дизайна) сложных программных систем в соответствии с заданными или общепринятыми критериями качества и с учетом реализуемости архитектуры на выбранном языке объектно- ориентированного программирования. Критерии качества архитектуры, как правило, обеспечивают: • возможность повторного использования; • гибкость настройки; • расширяемость и переносимость; • структурированность и модульность; • компактность и разумный уровень детализации; • понятность и простоту (в том числе взаимодействия компонентов).
  • 4. Проектирование как искусство компромисса Решение задач объектно-ориентированного проектирования в большинстве случаев предполагает достижения множества компромиссов.
  • 5. Проблемы объектно- ориентированного проектирования Проблема №1. Идентификация объектов Проблема №2. Определение степени детализации Проблема №3. Определение интерфейса объекта Проблема №4. Определение реализации объекта
  • 6. Проблемы №1-2. Определение состава и степени детализации объектов
  • 8. Причины перепроектирования Явное задание классов при создании объектов: • привязка к реализации (классу), а не к интерфейсу (типу). Явное задание способа выполнения операций: • сужение множества вариантов обслуживания запроса до единственного возможного. Зависимость от программной и (или) аппаратной платформы. Зависимость клиента от представления или реализации объекта: • потенциальная необходимость модификации клиента при изменении способа представления, хранения или реализации объекта. Зависимость от алгоритмов. Сильная связанность классов: • формирование монолитных систем без слоевой структуры. Чрезмерное использование наследования.
  • 9. Максимы проектирования Не решать каждую задачу «с нуля» Инкапсулировать допускающие изменения элементы дизайна и поведения (напр., алгоритмы, состояния, процессы создания объектов) Программировать в соответствии с интерфейсом, а не с реализацией (англ. Programming to interfaces): • клиент не должен обладать информацией о типах используемых объектов, если они имеют ожидаемый интерфейс; • клиент не должен знать о классах, посредством которых используемые объекты реализованы Проектировать системы с учетом будущих изменений Предпочитать композицию объектов, а не наследование классов Использовать возможности языка программирования • Но: поведение системы должен определять не язык, а проектировщик
  • 10. Шаблоны (паттерны) проектирования Обобщенные типовые архитектурные решения задач объектно- ориентированного проектирования известны как шаблоны (паттерны) проектирования. Примечание: использованный ранее термин «шаблон класса (функции)» известен в английском языке как class (function) template, тогда как для обозначения архитектурных концепций традиционно применяется англоязычный эквивалент design pattern. Один из первых авторитетных каталогов шаблонов проектирования составлен Э. Гаммой (Erich Gamma), Р. Хелмом (Richard Helm), Р. Джонсоном (Ralph Johnson) и Дж. Влиссидесом (John Vlissides), известными как «банда четырех» (англ. GoF — Gang of Four) и опубликовавшими книгу Design Patterns: Elements of Reusable Object- Oriented Software.
  • 11. Шаблоны: определение, преимущества, состав По определению членов GoF, шаблон — это описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте. Активное использование шаблонов проектирования позволяет: • повысить качество кода; • улучшить техническую документацию; • обеспечить качество сопровождения ПО.
  • 12. Типология шаблонов (1 / 2) В зависимости от цели использования шаблоны делятся на три категории: • порождающие — описывают процессы создания объектов; • структурные — описывают способы композиции классов (объектов); • поведенческие — описывают взаимодействие классов (объектов) между собой.
  • 14. Пространство шаблонов GoF Уровень применения Порождающие шаблоны Структурные шаблоны Поведенческие шаблоны Класс Фабричный метод Адаптер класса Интерпретатор Шаблонный метод Объект Абстрактная фабрика Класс с единственным экземпляром Прототип Строитель Адаптер объекта Декоратор Заместитель Компоновщик Мост Приспособленец Фасад Итератор Команда Наблюдатель Посетитель Посредник Состояние Стратегия Хранитель Цепочка ответственности
  • 16. Базовые шаблоны: наследование и композиция Наследование классов (англ. inheritance) и композиция объектов (англ. composition) являются распространенными приемами повторного использования функциональных возможностей объектно- ориентированных систем, а потому могут рассматриваться как базовые шаблоны. Наследование Композиция Что? Определяет реализацию одного класса в терминах другого (white-box reuse) Определяет реализацию одного объекта в терминах другого (black-box reuse) Как? Определение подкласса Определение атрибута (объединение объектов) Когда? При компиляции (статически) При компиляции (статически) или при выполнении (динамически)
  • 17. Наследование и композиция: «за» и «против» Критерий качества Наследование Композиция Реализация и модификация Простая Сложная Зависимость от реализации Высокая Низкая Соблюдение инкапсуляции Нет Есть Замена реализации при выполнении Невозможна Возможна Необходимость тщательного проектирования интерфейса Нет Есть Гибкость и возможность повторного применения Низкая Высокая Размер класса Большой Небольшой Количество классов Зависит от дизайна Количество используемых объектов Мало Много
  • 19. Три способа композиции Характеристика участника Implementer Инкапсуля- ция экземпляра Инкапсуля- ция ссылки Инкапсуля- ция указателя Обязательность Обязателен Обязателен Необязателен Количество (кратность) 1 .. * 1 .. * 0 .. * Зависимость времени жизни (ВЖ) от ВЖ агрегата Зависит (совпадает) Не зависит (совпадает или превышает) Не зависит Возможность совместного использования Нет Есть Есть Определение атрибута Implementer impl; Implementer &impl; Implementer *impl;
  • 20. Агрегирование или осведомленность? Агрегирование (англ. aggregation) и осведомленность (англ. acquaintance) — две стороны композиции. Различия между ними весьма существенны, хотя и определяются предполагаемым использованием объектов, а не механизмами языка. Характеристика Агрегирование Осведомленность Семантика «Содержит», «владеет», «несет ответственность» «Знает», «использует», «ассоциирован с…» Сила Сильное Слабое Постоянство Высокое Низкое Частота применения Низкая Высокая Время жизни Одинаково для агрегата и составляющих Любое Инкапсулируемый элемент Экземпляр, ссылка, указатель Ссылка, указатель
  • 22. Базовые шаблоны: делегирование Делегирование (англ. delegation) — это передача ответственности за выполнение запроса клиента от непосредственного получателя (делегирующей стороны, англ. delegator) уполномоченному (делегату, англ. delegate). Различают делегирование при наследовании классов и при композиции объектов. Назначение делегирования — абстрагирование (при композиции — также инкапсуляция) поведения (реакции на клиентский запрос). Шаблон делегирования используется в целом ряде шаблонов GoF («посетитель», «стратегия» и др.). Ключевое достоинство делегирования — упрощение композиции поведений на стадии выполнения. Ключевой недостаток делегирования — трудность статического анализа и понимания сильно параметризованного исходного кода.
  • 23. Делегирование: реализация Наследование Композиция Получатель Производный класс Объект на стороне «целое» Уполномоченный Базовый класс Объект на стороне «часть» Доступ к получателю Указатель this Указатель на получателя (должен быть передан) Абстрактная семантика «Является» «Содержит» Delegate #DoSomething() Delegator +ProcessReq() Delegator -delegate +ProcessReq() Delegate +DoSomething()
  • 25. Базовые шаблоны: неизменяемые объекты Неизменяемый объект (англ. immutable object) — шаблон, позволяющий создать программный объект, структурно не допускающий модификации после (окончательного) создания. Основное предназначение шаблона — устранение дорогостоящих операций копирования и сравнения объектов путем использования семантики ссылок. В дизайне систем различают неизменность объекта: • с точки зрения самой системы и ее пользователей; • на битовом (внутримашинном) и абстрактном (логическом) уровне. Достоинства неизменяемого объекта: • константность, гарантируемая компилятором; • потоковая безопасность; • структурная надежность; • простота анализа и понимания кода.
  • 26. Неизменяемые объекты: реализация Реализация неизменяемого объекта на языке C++ предполагает: • полное построение объекта конструктором класса (кроме отложенной инициализации подмножества атрибутов); • полное отсутствие неконстантных открытых статических и нестатических атрибутов (без спецификатора const или со спецификатором mutable); • отсутствие мутаторов, изменяющих состояние всего объекта (для побитовой неизменности) или части, видимой извне пользователю (для логической неизменности).
  • 27. Базовые шаблоны: интерфейс Интерфейсный класс, или интерфейс (англ. interface) — шаблон, структурирующий способы доступа к одному или нескольким (другим) классам. Классическое назначение интерфейса — определение нового абстрактного типа данных (ADT) в целях его дальнейшего повторного использования. Такой абстрактный тип обычно не содержит никаких данных, но демонстрирует необходимое поведение. Достоинство интерфейса состоит в обеспечении возможности статической или динамической замены конкретных классов, реализующих указанный интерфейс.
  • 29. Порождающие шаблоны: общие сведения Порождающие шаблоны: • абстрагируют процессы создания объектов и инкапсулируют сведения об инстанцируемых классах; • обеспечивают независимость системы от способа создания, композиции и представления объектов; • наиболее важны для систем, основанных на композиции больше, чем на наследовании.
  • 30. Порождающие шаблоны: абстрактная фабрика Абстрактная фабрика (инструментарий, англ. kit) — шаблон уровня объекта, предоставляющий интерфейс для создания семейств взаимосвязанных (взаимозависимых) объектов. Используется, когда: • система не должна зависеть от способов создания, компоновки и представления объектов; • объекты разных семейств гарантированно не должны использоваться совместно; • используемое семейство объектов должно являться параметром конфигурации системы. Участники: абстрактная фабрика, конкретная фабрика, абстрактный продукт, конкретный продукт, клиент.
  • 32. Абстрактная фабрика: обсуждение Результаты: • сокрытие (изоляция) конкретных классов — имена изготавливаемых классов известны только абстрактной фабрике; • упрощение замены семейств продуктов — класс фабрики упоминается в приложении только при ее инстанцировании; • обеспечение гарантии сочетаемости продуктов. Недостаток: • трудность поддержки новых видов продуктов. Аспекты реализации: • фабрика как объект класса с единственным экземпляром; • создание продуктов через фабричные методы или прототипы; • расширяемость фабрик.
  • 33. Порождающие шаблоны: строитель Строитель — шаблон уровня объекта, отделяющий конструирование сложного объекта от его представления. Используется, когда: • алгоритм создания сложного объекта не должен зависеть от состава объекта и способов компоновки его частей; • процесс конструирования объекта должен обеспечивать его различные представления. Участники: абстрактный строитель, конкретный строитель, распорядитель, продукт, клиент.
  • 35. Строитель: обсуждение Результаты: • возможность изменения внутреннего представления продукта — процесс сборки, представление и внутренняя структура продукта могут быть скрыты за абстрактным интерфейсом строителя; • изоляция кода создания и представления сложного объекта — классы, определяющие внутреннюю структуру продукта, в интерфейсе строителя не присутствуют; • возможность пошаговой сборки — предоставляемый строителем контроль над сборкой продукта более тонок, чем у других шаблонов. Аспекты реализации: • интерфейс сборки и конструирования; • отсутствие абстрактных продуктов; • определение пустых методов в абстрактных строителях.
  • 36. Порождающие шаблоны: фабричный метод Фабричный метод (виртуальный конструктор, англ. virtual constructor) — шаблон уровня класса, определяющий абстрактный интерфейс создания объектов и делегирующий выбор типов инстанцируемых объектов конкретным подклассам. Используется, когда: • заранее неизвестен тип инстанцируемых объектов; • дизайн класса с фабричным методом предполагает, что создаваемые объекты специфицируются подклассами; • класс делегирует свои обязанности по инстанцированию объектов одному из своих подклассов. Участники: абстрактный создатель, конкретный создатель, абстрактный продукт, конкретный продукт.
  • 38. Фабричный метод: обсуждение (1 / 2) Результаты: • независимость системы от классов продуктов — имена классов продуктов инкапсулированы в фабричных методах конкретных создателей; • возможность использования фабричных методов как операций- «зацепок» (англ. hook operations); • соединение параллельных иерархий классов — фабричный метод инкапсулирует сведения о том, какие классы могут работать вместе.
  • 39. Фабричный метод: обсуждение (2 / 2) Недостаток: • подкласс конкретного создателя должен определяться для создания даже одного экземпляра интересующего продукта. Аспекты реализации: • базовый класс-создатель с неабстрактным фабричным методом; • параметризация фабричного метода дискриминантом продукта; • использование шаблонов классов для автоматизации определения классов конкретных создателей.
  • 40. Порождающие шаблоны: прототип Прототип — шаблон уровня объекта, определяющий вид создаваемого объекта при помощи экземпляра-прототипа, который явно копируется при создании объекта. Используется, когда: • инстанцируемые классы определяются динамически; • необходимо избежать возникновения иерархий классов или фабрик, параллельных иерархиям классов продуктов; • количество прототипов невелико. Участники: абстрактный прототип, конкретный прототип, клиент.
  • 42. Прототип: обсуждение (1 / 2) Результаты: • сокрытие (изоляция) конкретных классов — сокращает количество имен классов, известных клиенту; • поддержка динамического изменения состава продуктов — клиент может удалять и устанавливать прототипы во время выполнения кода; • сокращение количества необходимых системе классов — роль «класса»-продукта может выполнять должным образом настроенный и зарегистрированный на стороне клиента экземпляр- прототип, а роль класса-создателя — операция клонирования; • динамическое конфигурирование приложений.
  • 43. Прототип: обсуждение (2 / 2) Недостаток: • необходимость поддержки (в общем случае, нетривиальной) операции клонирования объектов. Аспекты реализации: • использование диспетчера прототипов (ассоциативного реестра, возвращающего искомый прототип по заданному ключу); • клонирование путем «глубинного» (не имеет встроенной поддержки в C++) или «поверхностного» (выполняется почленно, по умолчанию) копирования; • инициализация клонов.
  • 44. Порождающие шаблоны: класс с единственным экземпляром Класс с единственным экземпляром (одиночка, жарг. синглтон, англ. singleton) — шаблон уровня объекта, гарантирующий, что класс располагает единственным экземпляром, и предоставляющий к нему глобальную точку доступа. Используется, когда: • экземпляр класса должен быть один и только один; • экземпляр класса должен быть доступен для любого клиента; • класс должен допускать порождение подклассов с возможностью работать с ними без модификации клиентской части системы. Участник: одиночка.
  • 45. Класс с единственным экземпляром: минимальная реализация class Singleton { public: static Singleton* Instance(); protected: Singleton(); private: static Singleton* _instance; }; Singleton* Singleton::_instance = NULL; Singleton* Singleton::Instance() { if(_instance == NULL) _instance = new Singleton; return _instance; }
  • 46. Класс с единственным экземпляром: обсуждение (1 / 2) Результаты: • контролируемый доступ к единственному экземпляру; • сокращение количества глобальных переменных; • возможность уточнения операций и представления; • возможность существования переменного количества экземпляров; • большая гибкость в сравнении с классом, содержащим только статические атрибуты и методы (альтернативный подход к реализации одиночек).
  • 47. Класс с единственным экземпляром: обсуждение (2 / 2) Недостатки: • искусственное ограничение масштабируемости проекта; • усложнение процедур модульного тестирования системы. Аспекты реализации: • гарантия единственности; • отложенная инициализация — статическая может быть невозможна; • невозможность установления взаимозависимостей одиночек — порядок вызова конструкторов глобальных объектов через границы единиц трансляции в C++ не определен.