Опубликовано

Вышла книга “Проектирование программ на C++”

Проектирование программ на C++

В книге заново разобраны и переосмыслены классические паттерны объектно-ориентированного проектирования на примере и с учётом всех возможностей современного языка 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 году, занимается проектированием крупномасштабных программных систем.

Добавить комментарий