КнигоПровод.Ru27.11.2024

/ИТ-книги

Современное проектирование на C++: Обобщённое программирование и прикладные шаблоны проектирования — Александреску А.
Современное проектирование на C++: Обобщённое программирование и прикладные шаблоны проектирования
Александреску А.
год издания — 2015, кол-во страниц — 336, ISBN — 978-5-8459-1940-3, 0-201-70431-5, тираж — 200, язык — русский, тип обложки — мягк., масса книги — 460 гр., издательство — Вильямс
серия — C++ In-Depth
цена: 499.00 рубПоложить эту книгу в корзину
Modern C++ Design
Generic Programming
and Design Patterns Applied

Andrei Alexandrescu

ADDISON-WESLEY 2002

Пер. с англ. д-ра ф.-м. наук Д. А. Клюшина

Формат 70x100 1/16
ключевые слова — c++, шаблон, проектирован, мультиметод, гибк, компилятор, наследован, многопоточн

В книге предложены новые перспективы в области программирования на языке C++. Разработан совершенно новый подход к проектированию, объединяющий шаблонное проектирование, обобщённое программирование и особенности языка C++. Это позволяет программистам создавать выразительные и гибкие программы, хорошо приспособленные к повторному применению.

В книге вводится понятие обобщённых компонентов — шаблонов проектирования, пригодных для повторного применения и позволяющих создавать шаблонные коды для компилятора, причём для их разработки используется только язык C++. Обобщённые компоненты позволяют легко и гладко переходить от проекта к прикладной программе, генерируя код, который лучше соответствует целям исходного проекта и поддерживает возможность повторного использования структур с минимальными изменениями.

Автор описывает особенности программирования на языке C++, позволяющие создавать обобщённые компоненты и применять их для создания реальных приложений на промышленной основе. В книге глубоко проанализированы и решены актуальные задачи программирования. В частности, рассмотрены следующие аспекты обобщённого программирования.

• Гибкое проектирование на основе стратегий.
• Частичная специализация шаблонов.
• Списки типов — мощное средство для манипуляции структурами.
• Шаблоны проектирования Visitor, Singleton, Command и AbstractFactory.
• Мультиметоды.

Для каждого обобщённого компонента в книге рассмотрены все связанные с ним проблемы и аспекты проектирования, а также представлено обобщённое решение соответствующей задачи.


Что нового можно сказать о языке C++? Оказывается, очень много. Эта книга посвящена слиянию разных способов программирования — обобщённого программирования, шаблонного метапрограммирования, объектно-ориентированного программирования и разработки шаблонов проектирования — в рамках нового подхода. До сих пор эти направления в программировании развивались изолированно друг от друга, и выгоды, полученные от их объединения, лишь начинают получать достойную оценку. Это слияние открывает новые перспективы для языка C++ не только с точки зрения собственно программирования, но для разработки программного обеспечения в целом. Особенно значительно это повлияет на анализ программного обеспечения и его архитектуру.

Обобщённые компоненты, созданные Андреем, поднимают уровень абстракции настолько высоко, что язык C++ приобретает черты языка спецификаций проектирования (design specification language). При этом в отличие от узкоспециализированных языков проектирования язык C++ сохраняет всю свою мощь и выразительность. Андрей продемонстрировал, как программируются концепции проектирования: синглтоны (singletones), инспекторы (visitors), заместители (proxies), абстрактные фабрики (abstract factories) и т.п. Можно даже настраивать готовые компоненты с помощью шаблонных параметров, не расходуя дополнительного машинного времени. Не нужно выбрасывать кучу денег на разработку новых инструментальных средств или изучать тома методологической тарабарщины. Достаточно иметь надёжный современный компилятор (и эту книгу).

Разработчики генераторов кода долгие годы обещали обеспечить их совместимость, но теоретические исследования и практический опыт убедили меня, что достичь этой цели невозможно. Остаются нерешёнными проблемы полного обхода дерева поиска, генерации недостаточно качественного кода, негибких генераторов, нечитабельности сгенерированного кода и, разумеется, широко известная проблема, которую можно сформулировать так: «Я не могу вставить этот проклятый код в свою программу». Каждой из этой проблем достаточно, чтобы завести программиста в тупик, а вместе они создают практически непреодолимые препятствия для автоматической генерации кода.

Как было бы хорошо получить все теоретические преимущества автоматической генерации кода — скорость, лёгкость реализации, сокращённую избыточность, меньшее количество ошибок, одновременно избежав его практических недостатков! Именно это обещает подход, предложенный Андреем. Обобщённые компоненты (generic components) реализуют удачные схемы в виде удобных для использования, поддающихся смешиванию и подходящих для решения задачи шаблонов (mixable-and-matchable templates). Эти шаблоны делают практически то же, что и генераторы кода: создают стереотипные фрагменты кода для дальнейшей обработки с помощью компилятора. Отличие заключается в том, что шаблоны позволяют сделать это, не выходя за рамки языка C++. В результате происходит полная интеграция полученного кода с исходным кодом приложения. При этом остаётся возможность использовать всю мощь языка, расширяя классы, замещая методы и подгоняя шаблоны под свои требования.

Некоторые из описанных приёмов программирования довольно трудно понять, особенно шаблонное метапрограммирование, рассмотренное в главе 3. Однако, освоив его, вы сможете постичь всю теорию обобщённых компонентов, которые практически сами себя создают. Эти компоненты описаны в последующих главах. Я думаю, что шаблонное метапрограммирование, изложенное в главе 3, само по себе достойно отдельной книги. Остальные десять глав освещают способы его применения. Несмотря на то что десять глав — это довольно много, ваши инвестиции окупятся сторицей.

ПРЕДИСЛОВИЕ ДЖОНА ВЛИССИДЕСА
Джон Влиссидес (John Vlissides)

ОГЛАВЛЕНИЕ

Предисловие Скотта Мейерса11
Предисловие Джона Влиссидеса15
Предисловие17
Аудитория18
Библиотека Loki19
Структура книги20
Благодарности21
 
Часть I. Методы23
 
Глава 1. Разработка классов на основе стратегий25
 
1.1. Разнообразие методов разработки программного обеспечения25
1.2. Недостатки универсального интерфейса26
1.3. Опасно ли множественное наследование?28
1.4. Преимущества шаблонов29
1.5. Стратегии и классы стратегий30
1.5.1. Реализация классов стратегий с помощью шаблонных параметров32
1.5.2. Реализация классов стратегий с помощью шаблонных
    функций-членов34
1.6. Расширенные стратегии34
1.7. Деструкторы классов стратегий35
1.8. Факультативные возможности, предоставляемые неполной
конкретизацией36
1.9. Комбинирование классов стратегий37
1.10. Настройка структур с помощью классов стратегий39
1.11. Совместимые и несовместимые стратегии39
1.12. Разложение классов на стратегии41
1.13. Резюме43
 
Глава 2. Приёмы программирования45
 
2.1. Статическая проверка диагностических утверждений46
2.2. Частичная специализация шаблонов48
2.3. Локальные классы50
2.4. Отображение целочисленных констант в типы51
2.5. Отображение одного типа в другой53
2.6. Выбор типа54
2.7. Распознавание конвертируемости и наследования на этапе компиляции56
2.8. Оболочка вокруг класса type_info59
2.9. Классы NullType и EmptyType61
2.10. Характеристики типов61
2.10.1. Реализация характеристик указателей62
2.10.2. Распознавание основных типов63
2.10.3. Оптимальные типы параметров64
2.10.4. Удаление квалификаторов65
2.10.5. Применение класса TypeTraits66
2.10.6. Заключение67
2.11. Резюме68
 
Глава 3. Списки типов71
 
3.1. Зачем нужны списки типов71
3.2. Определение списков типов73
3.3. Линеаризация создания списков типов74
3.4. Вычисление длины списка75
3.5. Интермеццо76
3.6. Индексированный доступ77
3.7. Поиск элемента78
3.8. Добавление элемента79
3.9. Удаление элемента80
3.10. Удаление дубликатов81
3.11. Замена элемента82
3.12. Частично упорядоченные списки типов83
3.13. Генерация класса на основе списка типов86
3.13.1. Генерация распределённых иерархий86
3.13.2. Генерация кортежей91
3.13.3. Генерация линейных иерархий92
3.14. Резюме95
3.15. Краткое описание класса Typelist96
 
Глава 4. Размещение в памяти небольших объектов99
 
4.1. Стандартный механизм распределения динамической памяти100
4.2. Как работает стандартный механизм распределения динамической
памяти100
4.3. Распределитель памяти для небольших объектов102
4.4. Класс Chunk103
4.5. Класс FixedAllocator106
4.6. Класс SmallObjAllocator110
4.7. Трюк112
4.8. Просто, сложно и снова просто114
4.9. Применение115
4.10. Резюме116
4.11. Краткое описание механизма распределения памяти для небольших
объектов117
 
Часть II. Компоненты119
 
Глава 5. Обобщённые функторы121
 
5.1. Шаблон Command122
5.2. Шаблон Command в реальном мире124
5.3. Вызываемые сущности в языке C++125
5.4. Скелет шаблонного класса Functor126
5.5. Реализация оператора пересылки Functor::operator()131
5.6. Работа с функторами132
5.7. Один пишем, два в уме134
5.8. Преобразование типов аргументов и возвращаемого значения136
5.9. Указатели на функции-члены137
5.10. Связывание141
5.11. Сцепление143
5.12. Первая практическая проблема: стоимость функций пересылки144
5.13. Вторая практическая проблема: распределение динамической памяти146
5.14. Реализация операций Undo и Redo с помощью класса Functor147
5.15. Резюме148
5.16. Краткое описание класса Functor148
 
Глава 6. Реализация шаблона Singleton151
 
6.1. Статические данные + статические функции != синглтон152
6.2. Основные идиомы языка C++ для поддержки синглтонов153
6.3. Обеспечение уникальности синглтонов154
6.4. Разрушение объектов класса Singleton155
6.5. Проблема висячей ссылки157
6.6. Проблема адресации висячей ссылки (1): феникс159
6.6.1. Проблемы, связанные с функцией atexit161
6.7. Проблема висячей ссылки (II): синглтон с заданной
продолжительностью жизни162
6.8. Реализация синглтонов, имеющих заданную продолжительность жизни164
6.9. Продолжительность жизни объектов в многопоточной среде167
6.9.1. Шаблон блокировки с двойной проверкой168
6.10. Сборка170
6.10.1. Разложение класса SingletonHolder на стратегии171
6.10.2. Требования, предъявляемые к стратегиям класса
    SingletonHolder171
6.10.3. Сборка класса SingletonHolder172
6.10.4. Реализации стратегий174
6.11. Работа с классом SingletonHolder175
6.12. Резюме176
6.13. Краткое описание шаблонного класса SingletonHolder177
 
Глава 7. Интеллектуальные указатели179
 
7.1. Сто первое описание интеллектуальных указателей179
7.2. Особенности интеллектуальных указателей180
7.3. Хранение интеллектуальных указателей182
7.4. Функции-члены интеллектуальных указателей183
7.5. Стратегии владения185
7.5.1. Глубокое копирование185
7.5.2. Копирование при записи186
7.5.3. Подсчёт ссылок187
7.5.4. Связывание ссылок189
7.5.5. Разрушающее копирование190
7.6. Оператор взятия адреса192
7.7. Неявное приведение к типам обычных указателей193
7.8. Равенство и неравенство195
7.9. Отношения порядка200
7.10. Обнаружение и регистрация ошибок202
7.10.1. Проверка во время инициализации202
7.10.2. Проверка перед разыменованием203
7.10.3. Сообщения об ошибках203
7.11. Интеллектуальные указатели на константные объекты и константные
интеллектуальные указатели204
7.12. Массивы205
7.13. Интеллектуальные указатели и многопоточность205
7.13.1. Многопоточность на уровне объектов205
7.13.2. Многопоточность на уровне регистрации данных207
7.14. Сборка209
7.14.1. Многопоточность на уровне объектов210
7.14.2. Стратегия Ownership212
7.14.3. Стратегия Conversion214
7.14.4. Стратегия Checking214
7.15. Резюме215
7.16. Краткий обзор класса SmartPtr216
 
Глава 8. Фабрики объектов217
 
8.1. Для чего нужны фабрики объектов218
8.2. Фабрики объектов в языке C++: классы и объекты220
8.3. Реализация фабрики объектов221
8.4. Идентификаторы типов225
8.5. Обобщение227
8.6. Мелкие детали230
8.7. Фабрика клонирования231
8.8. Использование фабрики объектов в сочетании с другими обобщёнными
компонентами234
8.9. Резюме235
8.10. Краткий обзор шаблонного класса Factory235
8.11. Краткий обзор шаблонного класса CloneFactory236
 
Глава 9. Шаблон AbstractFactory239
 
9.1. Архитектурная роль шаблона AbstractFactory239
9.2. Обобщённый интерфейс шаблона AbstractFactory242
9.3. Реализация класса AbstractFactory245
9.4. Реализация шаблона AbstractFactory на основе прототипов249
9.5. Резюме252
9.6. Краткий обзор классов AbstractFactory и ConcreteFactory253
 
Глава 10. Шаблон Visitor255
 
10.1. Основы шаблона Visitor255
10.2. Перегрузка и функция-ловушка261
10.3. Уточнение реализации: шаблон AcyclicVisitor262
10.4. Обобщённая реализация шаблона Visitor268
10.5. Назад — к «простому» шаблону Visitor274
10.6. Отладка вариантов277
10.6.1. Функция-ловушка277
10.6.2. Нестрогое инспектирование279
10.7. Резюме279
10.8. Краткий обзор обобщённых компонентов шаблона Visitor280
 
Глава 11. Мультиметоды281
 
11.1. Что такое мультиметоды?282
11.2. Когда нужны мультиметоды282
11.3. Двойное переключение по типу: грубый подход284
11.4. Автоматизированный грубый подход286
11.5. Симметричность грубого подхода290
11.6. Логарифмический двойной диспетчер294
11.6.1. Логарифмический диспетчер и наследование296
11.6.2. Логарифмический диспетчер и приведение типов297
11.7. Класс FnDispatcher и симметрия299
11.8. Двойная диспетчеризация функторов300
11.9. Преобразование аргументов: static_cast или dynamic_cast?302
11.10. Мультиметоды с постоянным временем выполнения307
11.11. Классы BasicDispatcher и BasicFastDispatcher как стратегии310
11.12. Перспективы311
11.13. Резюме312
11.14. Краткий обзор двойных диспетчеров314
 
Приложение. Многопоточная библиотека в стиле минимализма319
 
П.1. Критика многопоточности320
П.2. Подход, реализованный в библиотеке Loki321
П.З. Атомарные операции с целочисленными типами321
П.4. Мьютексы323
П.5. Семантика блокировки в объектно-ориентированном программировании325
П.6. Модификатор volatile327
П.7. Семафоры, события и другие полезные вещи327
П.8. Резюме327
 
Библиография329
Предметный указатель331

Книги на ту же тему

  1. Стандарты программирования на C++: 101 правило и рекомендации, Саттер Г., Александреску А., 2015
  2. Моя первая программа на C/C++, Нейбауэр А. Р., 1995
  3. Основы программирования на языках C и C++, Ашарина И. В., 2002
  4. Справочник программиста по C/C++. — 2-е изд., Шилдт Г., 2001
  5. Начальный курс C и C++, Березин Б. И., Березин С. Б., 2001
  6. Типичные ошибки проектирования, Аллен Э., 2003
  7. Объектно-ориентированное программирование в C++. — 4-е изд., Лафоре Р., 2003
  8. Мультипарадигменное проектирование для C++, Коплиен Д., 2005
  9. Программирование на C++ в Linux, Секунов Н. Ю., 2003
  10. Разработка приложений на C++ и С#. Библиотека программиста, Секунов Н. Ю., 2003
  11. C++ Boost Graph Library, Сик Д., Ли Л., Ламсдэйн Э., 2006
  12. Язык программирования C. Лекции и упражнения. — 6-е изд., Прата С., 2015
  13. Символьный C++: Введение в компьютерную алгебру с использованием объектно-ориентированного программирования, Тан К. Ш., Стиб В.-Х., Харди Й., 2001
  14. UNIX. Профессиональное программирование. — 2-е изд., Стивенс Р., Раго С., 2007
  15. UNIX: взаимодействие процессов, Стивенс Р., 2002
  16. Объектно-ориентированный анализ и проектирование с использованием UML и IBM Rational Rose, Леоненков А. В., 2006

© 1913—2013 КнигоПровод.Ruhttp://knigoprovod.com