Dyzzet|
C++ Data Science Алгоритмы Темы · Блог · YouTube · Telegram
Обзоры книг по C++
Парадигмы, идиомы, шаблоны проектирования

Андрей Александреску. Современное проектирование на C++. Обобщённое программирование и прикладные шаблоны проектирования

336 страниц. Вильямс, 2002

Andrei Alexandrescu. Modern C++ Design: Generic Programming and Design Patterns. Addison-Wesley, 2001

Андрей Александреску — соавтор языка D.

Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приёмы объектно-ориентированного проектирования, оригинал 1995 года

Книгу открывают предисловия Скотта Мейерса и Джона Влиссидеса (соавтора знаменитой книги о шаблонах проектирования от «банды четырёх»).

Материал, безусловно, сложный. Это то, что называют шаблонной магией. Автор показывает устройство библиотеки Loki. Хотя всё подробно описывается, читатель должен уже быть хорошо подготовлен.

К сожалению, в русском переводе есть опечатки в коде и ошибки в терминах: copy constructor, то есть конструктор копирования, в одном месте перевели непонятно как; некоторые термины на момент перевода ещё не устоялись в русском языке; так, frameworks перевели как специальные среды разработки (но в скобках даётся оригинал, так что можно понять).

Содержание первой части: стратегии, приёмы программирования, списки типов, размещение в памяти небольших объектов. Содержание второй части: обобщённые функторы, шаблон синглетон, умные указатели, фабрики объектов, абстрактные фабрики, шаблон «Посетитель», мультиметоды.

Must-read не только для тех, кто собирается писать библиотеки с шаблонными классами и функциями, но и для тех, кто хочет понимать, что такое type traits или аллокаторы и другие вещи в STL.

Само собой, за два десятилетия что-то устарело, но от этого книга не становится менее полезной, наоборот — интересно подумать, как некоторые вещи можно сделать по-современному.

Приложение: многопоточная библиотека в стиле минимализма.

Джеймс О. Коплиен. Программирование на C++

479 страниц. Питер, 2005

James O. Coplien. Advanced C++. Programming Styles and Idioms. Addison-Wesley, 1992

Содержание: введение, абстракция и абстрактные типы данных, конкретные типы данных, наследование, ООП, объектно-ориентированное проектирование, многократное использование программ и объекты, прототипы, эмуляция символических языков, динамическое множественное наследование, системные аспекты.

Наполовину учебник, наполовину справочник. Излагается идиоматика (если вам хочется знать, что такое делегированный полиморфизм или аппликативное программирование, эта книга для вас) и некоторые тонкости наподобие этой:

while (*cp1++ = *cp2++);

Книга старая, ещё эпохи до выхода стандартов, хотя совсем уж устаревшей её не назовёшь. Написана она хорошим слогом. Много внимания уделяется парадигмам, идиомам, истории, например, когда и в каком языке впервые появились классы (Simula 67), когда появились типизированные языки и т. д. Автор много раз показывает связь между C и C++ с наглядным сравнением в два столбца. Примеры крепкие, часто из физики.

Всё-таки 1992 год оригинального издания превращает некоторые задания в своего рода вызов:

Пакет Curses — простая оконная система, часто используемая в редакторах и игровых программах UNIX. Найдите руководство по Curses для своей локальной установки и преобразуйте структуру окна (она может называться _win_st или WINDOW) в класс. Составьте объявления функций класса addch, getch, addstr, getstr, move, clear, erase и т. д.

Много рассказывается про наследование, разные его виды, виртуальность и RTTI, идиомы типа «делегирование», «мультиметод», «манипулятор/тело» (в каких языках они поддерживаются и как их сымитировать на C++), виды отношений между классами, так называемые канонические формы. Описано, как загружать виртуальные функции, что не так часто встречается в литературе об идиомах.

Приложения: C в среде C++, программа Shapes, ссылочные возвращаемые значения операторов, поразрядное копирование, иерархия геометрических фигур в символической идиоме, структурное программирование, список терминов (оригинальные термины и вариант их перевода в книге).

Джеймс О. Коплиен. Мультипарадигменное проектирование для C++

235 страниц. Питер, 2005

James O. Coplien. Multi-Paradigm Design for C++. Addison-Wesley, 1999

Содержание: потребность в нескольких парадигмах, анализ общности, анализ изменчивости, анализ предметной области, объектно-ориентированный анализ, анализ области решений, простое смешивание парадигм, «переплетаем парадигмы», «дополняем область решений паттернами».

Много воды, как и в любой книге по проектированию. На мой вкус, есть более содержательная литература по этой теме. Какие-то принципы разобраны полностью (как принцип подстановки Барбары Лисков), какие-то кратко, для галочки (такие, как очень общие принципы «разделяй и властвуй», бритва О́ккама). «Надёрганы» некоторые шаблоны проектирования (лучше опять же обратиться к другой литературе).

Хотя автор и говорит в предисловии, что хотел написать книгу для практиков, но видна тенденция к постоянному обобщению, часто натянутому (как пример — «отрицательная изменчивость», где рядом стоят #ifdef и аргументы по умолчанию). Отдельные части, может, и хороши, но цельности не хватает.

Фёдор Григорьевич Пикус. Идиомы и паттерны проектирования в современном C++

452 страницы. ДМК Пресс, 2020

Fedor G. Pikus. Hands-On Design Patterns with C++. Packt Publishing, 2019

Содержание:

  1. Введение в наследование и полиморфизм
  2. Шаблоны классов и функций
  3. Владение памятью
  4. От простого к нетривиальному [про обмен]
  5. Всё о захвате ресурсов как инициализации [тут же — Google Test]
  6. Что такое стирание типа
  7. SFINAE и управление разрешением перегрузки
  8. Рекурсивный шаблон CRTP
  9. Именованные аргументы и сцепление методов
  10. Оптимизация локального буфера
  11. Охрана области видимости
  12. Фабрика друзей
  13. Виртуальные конструкторы и фабрики
  14. Петтерн Шаблонный метод и идиома невиртуального интерфейса
  15. Одиночка — классический объектно-ориентированный паттерн
  16. Проектирование на основе политик
  17. Адаптеры и декораторы
  18. Паттерн Посетитель и множественная диспетчеризация

В конце книги — ответы на вопросы и предметный указатель.

«Спасибо [...] моему коту Пушку, который разрешал использовать свою подстилку в качестве моего ноутбука».

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

Под идиомами автор имеет в виду PIMPL, copy-on-write (COW) и другие. Важно знать, но на статус шаблона проектирования не тянет.

Каждая глава довольно исчерпывающая. Например, в главе о шаблонах — templates — рассказывается, шаблоны чего вообще существуют, какого типа могут быть параметры шаблонов, что такое специализация, как работать с шаблонами с переменным числом аргументов, как лямбда-функции связаны с шаблонами. Материал выстроен методологически грамотно, в каждой главе, если требуется, даётся справка о рассматриваемом аспекте.

Ещё один must-read для тех, кто хочет писать производительный и выразительный код.

Прасид Пай, Питер Абрахам. Реактивное програмирование на C++

324 страницы. ДМК Пресс, 2019

Praseed Pai, Peter Abraham. C++ Reactive Programming. Packt Publishing, 2018

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

Хотя в книге излагается, как работать с Qt, как писать на C++17, сначала нарочно используются сырые указатели и другой фреймворк (правда, это MFC). Авторы чётко дают понять, что они хотят изложить, поэтому не стесняются, например, помещать в книгу раздел «Методологические замечания». Очень кратко, но толково и по делу написано о новых возможностях языка, в том числе о многопоточности и асинхронности. Треть книги или даже половина — это подготовка.

Основная часть книги начинается с классического шаблона проектирования «Наблюдатель» (и других шаблонов). От наблюдателей переходят к наблюдаемым источникам и программированию потоков событий. После того — прицельный рассказ о библиотеке RxCpp и её интеграции с фреймворком Qt.

Наконец, книгу завершают шаблоны и идиомы реактивного программирования (про которые есть отдельная литература), а также реактивные микросервисы. Может, не исчерпывающе, но по делу и в объёме, достаточном, чтобы применить знания на практике.

К сожалению, мало внимания уделяется управлению памятью. Не раскрывается, как библиотеки это делают, чего стоит опасаться.

Книга относительно новая, но и в ней уже есть устаревшие вещи, например, авторы используют библиотеку C++ REST SDK.

Переводчик перестарался; понимать термины «втягивающие» и «вталкивающие» программы сложно, а ведь в оригинале это просто pull и push.

Дело вкуса, но мне показались избыточными примечания переводчика, который норовит поспорить с авторами (где они немного облегчили себе работу и решили, например, не реализовывать оператор копирующего присваивания) и перебить их, даже в вопросах философии (особенно в вопросах философии). А примечание на половину разворота, которое начинается со слов «Данное утверждение не выдерживает никакой критики», — это уже как-то неприлично. Даже если замечания дельные, возможно, не следовало выбирать столь надменный тон.

Илья Иосифович Труб. Объектно-ориентированное моделирование на C++

411 страниц. Питер, 2006

Как следует из описания, эта книга излагает методологию объектно-ориентированного программирования применительно к задачам дискретно-событийного моделирования.

Первая часть — немного про C++, генерацию вероятностных распределений и основы моделирования.

Вторая часть — разбор задач. Парочку для примера: «Последовательное обслуживание с блокировками и ограниченным буфером: производственная поточная линия», «Последовательное обслуживание с возвращением: производственная линия с пунктами технического контроля и настройки». Много формул, в меру академично. Часть задач по схеме: формулы, код, график на выходе. Если вам интересны такие задачи, возможно, эта книга для вас. Только вот программная часть — аховая.

На обложке #define N 5. Интуиция не подвела: внутри такого тоже хватает. По большей части будет C с классами (работа с файлами по старинке, глобальные переменные чуть ли не десятками). Допустим, автор хотел использовать собственную очередь, а не очередь из STL, только она (если не считать шаблонов) такая сишная:

ListNode<TV> *queue;

Проектирование «классов» весьма и весьма сомнительное:

 friend class Control;
 friend class Debugger;

Про «правило трёх» автор, вероятно, не слышал. Есть транслит в коде. Где по-английски — местами неправильно. Есть приложения. Код там ужасен.

И́ван Чукич. Функциональное программирование на языке на C++

360 страниц. ДМК Пресс, 2020

Ivan Čukić. Functional Programming in C++. Manning, 2019

Ivan Čukić. Functional reactive programming in C++. 2016

Содержание:

  1. Введение в функциональное программирование
  2. Первые шаги
  3. Функциональные объекты
  4. Средства создания новых функций из имеющихся
  5. Чистота функций
  6. Ленивые вычисления
  7. Диапазоны
  8. Функциональные структуры данных
  9. Алгебраические типы и сопоставление с образцом
  10. Монады
  11. Метапрограммирование на шаблонах
  12. Функциональный дизайн параллельных систем
  13. Тестирование и отладка

Автор объясняет принципы функционального программирования, со вполне доходчивыми картинками; чуть ли не с самого начала показывает, как писать код в функциональном стиле на C++ (и в чём преимущества).

Для людей, далёких от ФП (функционального программирования), какие-то вещи могут показаться очень странными. И даже если идеи, заложенные в основу ФП, могут быть понятными, код на C++ в функциональном стиле может быть слегка многословным: какие-то вещи из-за особенностей языка на первый взгляд требуют от программиста чересчур многого. Вот пример обобщения предиката «старше, чем». Автор показывает, что так (с идеальной передачей) код получается обобщённым и высокопроизводительным.

class older_than {
public:
    older_than(int limit)
        : m_limit(limit)
    {
    }
    
    template <typename T>
    bool operator()(T&& object) const
    {
        return std::forward<T>(object).age() > m_limit;
    }
    
private:
    int m_limit;
}

В итоге можно писать примерно такой код (независимо от того, люди это или машины — коллекция может быть любого типа, лишь бы там было поле «возраст»).

std::count_if(persons.cbegin(), persons.cend(),
              older_than(42));

STL во многом идейно близка идеям ФП. Тут есть композиция функций, частичное применение функций, объекты-обёртки над операциями:

product = std::assumulate(numbers.cbegin(), numbers.cend(), 1,
                          std::multiplies<int>());

Конечно же, автор старается раскрывать все детали. Например, что под капотом у лямбда-функций, как развивается вывод типов с новыми стандартами языка, как происходит захват переменных, как работает mutable с лямбда-функциями.

Автор постарался показать, как и зачем можно на C++ делать даже такие вещи, как каррирование (карринг), подъём функций (lifting), ленивые вычисления. Много практических примеров, есть даже сервер.

В книге я нашёл только одну шероховатость:

«Ключевое слово this означает указатель-константу на (возможно, неконстантный) экземпляр класса, в котором эта функция объявлена».

Вот тут неправда. Указатель this — сам по себе неконстантный, просто он rvalue.

C++ Actor Framework

SObjectizer

Возможно, не стоит всем бросаться писать монады и каррировать функции, но есть более-менее универсальные вещи, такие как диапазоны (вполне практическая вещь) или модель акторов (фреймворки C++ Actor Framework, SObjectizer), которые можно попробовать в деле.

18 марта
Зарегистрируйтесь и войдите, чтобы оставлять комментарии и голосовать.

Книги по C++
Книги Бьерна Страуструпа
Учебная литература. Часть I / Часть II / Часть III. Книги Герберта Шилдта / Часть IV
Русскоязычная литература. Часть I (А—Г) / Часть II (Д—К) / Часть III (Л—О) / Часть IV (П—Я)
Стандартная библиотека шаблонов
Boost
Советы и задачи по языку
Структуры данных, алгоритмы, решение прикладных задач
Парадигмы, идиомы, шаблоны проектирования
Что выбрать? (Обновляется)
Также может быть интересным
На моём YouTube-канале

Бот для Telegram С НУЛЯ на C++. Полный РАЗБОР

Как написать умный указатель unique_ptr с нуля

Такой код на C++ уже не напишешь (спецификации исключений throw)
© MMXI—MMXXVI. RSS
 Boosty
Светлая тема / тёмная тема