
В книге заново разобраны и переосмыслены классические паттерны объектно-ориентированного проектирования на примере и с учётом всех возможностей современного языка C++. Указаны сильные стороны базовых паттернов проектирования, даны рекомендации по их сочетаемости, рассмотрены роли различных паттернов при инкапсуляции, обеспечении полиморфизма и в особенности наследования. Приведены примеры выразительного идиоматического языка C++, рассказано о работе с шаблонами стандартной библиотеки STL, затронуты сложные аспекты теории типов, интеграции больших приложений и работы с унаследованным кодом.
Для специалистов по C++ и архитекторов больших программных систем
Принципы и паттерны
С этой книгой Вы:
- Научитесь оценивать свой код, сверяя его с проверенными паттернами проектирования
- Разберитесь, что такое проектирование программ, какие цели ставятся при проектировании, в частности, что такое изменяемость и расширяемость программ
- Исследуйте преимущества и недостатки каждого подхода к проектированию
- Узнайте, как паттерны проектирования помогают решать поставленные задачи
- Выбирайте именно тот паттерн проектирования, который наиболее уместен в конкретной ситуации
Книгу “Проектирование программ на C++” можно купить со скидкой в интернет-магазине издательства “БХВ“.
Отзывы о книге. 11
Об авторе. 13
Предисловие. 15
Почему я написал эту книгу. 15
О чем эта книга. 16
Проектирование программного обеспечения. 16
Современный C++. 16
Паттерны проектирования. 17
Для кого предназначена эта книга. 17
Как организована эта книга. 18
Условные обозначения и соглашения. 18
Использование примеров кода. 19
Благодарности. 19
ГЛАВА 1. Искусство проектирования программного обеспечения. 21
Руководство 1. О важности грамотного проектирования программного
обеспечения. 22
Почему возможности не являются частью проектирования
программного обеспечения. 22
Проектирование программного обеспечения: искусство управления зависимостями и абстракции 23
Три уровня проектирования программного обеспечения. 25
Акцент на возможностях. 29
Акцент на проектировании программного обеспечения и принципах проектирования 30
Руководство 2. Проектирование с учетом изменений. 31
Разделение ответственности. 31
Пример искусственного связывания. 32
Сравнение логической и физической связей. 35
Не повторяйся. 38
Избегайте преждевременного разделения ответственности. 42
Руководство 3. Разделение интерфейсов во избежание искусственной связи. 44
Разделяйте интерфейсы для разделения ответственности. 44
Минимизация требований к аргументам шаблона. 47
Руководство 4. Проектирование с учетом тестируемости. 48
Как протестировать приватную функцию-член. 48
Правильное решение: разделение ответственности. 52
Руководство 5. Проектирование для расширения. 55
Принцип открытости/закрытости. 56
Расширяемость времени компиляции. 60
Избегайте преждевременного проектирования для расширения. 62
ГЛАВА 2. Искусство создания абстракций. 65
Руководство 6. Как придерживаться ожидаемого поведения абстракций. 66
Пример нарушения ожиданий. 66
Принцип подстановки Барбары Лисков. 69
Критика принципа подстановки Барбары Лисков. 73
Потребность в хороших и осмысленных абстракциях. 74
Руководство 7. О сходстве между базовыми классами и понятиями. 74
Руководство 8. О семантических требованиях к перегрузочным наборам. 78
Сила свободных функций: механизм абстракции во время компиляции. 79
Проблема свободных функций: ожидания от поведения. 81
Руководство 9. Переключение внимания на владение абстракциями. 85
Принцип инверсии зависимостей. 85
Инверсия зависимостей в архитектуре подключаемых модулей. 90
Инверсия зависимостей с помощью шаблонов. 93
Инверсия зависимостей с помощью наборов перегрузки. 93
Принцип инверсии зависимостей против принципа единственной ответственности 95
Руководство 10. О возможности создания документа архитектуры. 96
ГЛАВА 3. Назначение паттернов проектирования. 101
Руководство 11. Цели паттернов проектирования. 101
Паттерн проектирования имеет название. 102
Паттерн проектирования несет в себе намерение. 103
Паттерн проектирования вводит абстракцию.. 104
Паттерн проектирования проверен. 106
Руководство 12. Предостережение насчет ошибочных представлений
о паттернах проектирования. 106
Паттерны проектирования не являются целью.. 107
Паттерны проектирования не связаны с деталями реализации. 108
Паттерны проектирования не ограничиваются объектно-ориентированным программированием или динамическим полиморфизмом. 111
Руководство 13. Вездесущие паттерны проектирования. 114
Руководство 14. Использование названия паттерна проектирования
для передачи намерений. 119
ГЛАВА 4. Паттерн проектирования Посетитель. 123
Руководство 15. Проектирование для добавления типов или операций. 123
Процедурное решение. 124
Объектно-ориентированное решение. 131
Помните о выборе проектирования в динамическом полиморфизме. 134
Руководство 16. Использование паттерна проектирования Посетитель для расширения операций 135
Анализ проблем проектирования. 136
Объяснение паттерна проектирования Посетитель. 137
Анализ недостатков паттерна проектирования Посетитель. 141
Руководство 17. Шаблонный класс std::variant для реализации Посетителя. 145
Введение в std::variant 145
Рефакторинг рисования фигур как ненавязчивое решение,
основанное на значении. 148
Тесты производительности. 154
Анализ недостатков решения std::variant 155
Руководство 18. О производительности паттерна проектирования
Ациклический посетитель. 157
ГЛАВА 5. Паттерны проектирования Стратегия и Команда. 163
Руководство 19. Использование паттерна проектирования Стратегия
для изоляции способов выполнения задач. 163
Анализ проблем проектирования. 166
Объяснение паттерна проектирования Стратегия. 170
Анализ недостатков прямолинейного решения. 174
Сравнение паттернов проектирования Посетитель и Стратегия. 181
Анализ недостатков паттерна проектирования Стратегия. 181
Проектирование на основе политик. 184
Руководство 20. Предпочтение композиции наследованию.. 187
Руководство 21. Использование паттерна проектирования Команда для идентификации выполняемого действия 190
Объяснение паттерна проектирования Команда. 190
Сравнение паттернов проектирования Команда и Стратегия. 198
Анализ недостатков паттерна проектирования Команда. 201
Руководство 22. Предпочтение семантики значений семантике ссылок. 202
Недостатки стиля “Банды четырех”: семантика ссылок. 202
Семантика ссылок: второй пример. 206
Современная философия C++: семантика значений. 208
Семантика значений: второй пример. 210
Предпочтение семантики значений для реализации паттернов
проектирования. 212
Руководство 23. Предпочтение основанной на значениях реализации
паттернов Стратегия и Команда. 213
Введение в std::function. 213
Рефакторинг рисования геометрических фигур. 215
Тесты производительности. 220
Анализ недостатков решения std::function. 222
ГЛАВА 6. Паттерны проектирования Адаптер, Наблюдатель и CRTP. 223
Руководство 24. Использование паттерна проектирования Адаптер для стандартизации интерфейсов 223
Объяснение паттерна проектирования Адаптер. 225
Адаптеры объектов и адаптеры классов. 227
Примеры из стандартной библиотеки. 228
Сравнение паттернов проектирования Адаптер и Стратегия. 230
Функциональные адаптеры. 230
Анализ недостатков паттерна проектирования Адаптер. 232
Руководство 25. Применение паттерна проектирования Наблюдатель
в качестве абстрактного механизма уведомления. 236
Объяснение паттерна проектирования Наблюдатель. 236
Классическая реализация Наблюдателя. 237
Реализация Наблюдателя на основе семантики значений. 248
Анализ недостатков паттерна проектирования Наблюдатель. 250
Руководство 26. Использование паттерна проектирования CRTP
для введения категорий статических типов. 252
Мотивация для CRTP. 253
Объяснение паттерна проектирования CRTP. 258
Анализ недостатков паттерна проектирования CRTP. 264
Будущее CRTP: сравнение концепций CRTP и C++20. 266
Руководство 27. Использование паттерна проектирования CRTP
для статических классов-примесей. 269
Мотивация сильных типов. 269
Использование CRTP в качестве паттерна реализации. 272
ГЛАВА 7. Паттерны проектирования Мост, Прототип и Внешний полиморфизм.. 277
Руководство 28. Создание Мостов для устранения физических зависимостей. 277
Мотивирующий пример. 278
Объяснение паттерна проектирования Мост. 283
Идиома pimpl 286
Сравнение паттернов проектирования Мост и Стратегия. 291
Анализ недостатков паттерна проектирования Мост. 294
Руководство 29. Выигрыши и потери в производительности
при использовании паттерна проектирования Мост. 295
Влияние Мостов на производительность. 295
Повышение производительности с помощью частичных Мостов. 298
Руководство 30. Применение паттерна проектирования Прототип
для операций абстрактного копирования. 301
Пример с овцами: копирование животных. 302
Объяснение паттерна проектирования Прототип. 304
Сравнение Прототипа и std::variant 307
Анализ недостатков паттерна проектирования Прототип. 308
Руководство 31. Использование паттерна проектирования Внешний полиморфизм для неинтрузивного полиморфизма времени выполнения. 309
Объяснение паттерна проектирования Внешний полиморфизм. 310
Возвращение к рисованию фигур. 313
Сравнение паттернов проектирования Внешний полиморфизм и Адаптер. 322
Анализ недостатков паттерна проектирования Внешней полиморфизм. 322
ГЛАВА 8. Паттерн проектирования Затирание типов. 327
Руководство 32. Возможность замены иерархий наследования паттерном проектирования Затирание типов 327
История Затирания типов. 328
Объяснение паттерна проектирования Затирание типов. 330
Реализация Затирания типов с владением. 333
Анализ недостатков паттерна проектирования Затирание типов. 341
Сравнение двух оберток паттерна проектирования Затирание типов. 342
Разделение интерфейсов оберток Затирания типов. 345
Тесты производительности. 346
Несколько слов о терминологии. 347
Руководство 33. Об оптимизирующем потенциале паттерна проектирования Затирание типов 349
Оптимизация малого буфера. 349
Реализация диспетчеризации функций вручную.. 359
Руководство 34. О затратах на установку оберток для Затирания типов
с владением. 365
Затраты на установку обертки Затирания типов с владением. 365
Простая реализация Затирания типов без владения. 368
Более мощная реализация Затирания типов без владения. 370
ГЛАВА 9. Паттерн проектирования Декоратор. 381
Руководство 35. Использование паттерна проектирования Декоратор для иерархического добавления настроек 381
Проектировочная проблема ваших коллег. 382
Объяснение паттерна проектирования Декоратор. 386
Классическая реализация паттерна проектирования Декоратор. 389
Второй пример использования паттерна проектирования Декоратор. 394
Сравнение паттернов проектирования Декоратор, Адаптер и Стратегия. 397
Анализ недостатков паттерна проектирования Декоратор. 398
Руководство 36. Компромисс между абстракциями времени выполнения
и времени компиляции. 401
Декоратор времени компиляции, основанный на значениях. 401
Декоратор времени выполнения, основанный на значениях. 407
ГЛАВА 10. Паттерн Одиночка. 415
Руководство 37. Одиночка как паттерн реализации, а не как паттерн проектирования. 415
Объяснение паттерна Одиночка. 416
Одиночка не управляет зависимостями и не уменьшает их. 419
Руководство 38. Проектирование Одиночек с учетом изменений
и тестируемости. 421
Одиночки представляют глобальное состояние. 421
Одиночки затрудняют изменяемость и тестируемость. 423
Инвертирование зависимостей на Одиночке. 427
Применение паттерна проектирования Стратегия. 432
Переход к внедрению локальных зависимостей. 437
ГЛАВА 11. Последнее руководство. 441
Руководство 39. Продолжайте изучать паттерны проектирования. 441
Предметный указатель. 445

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