Написание качественного кода на C++ не должно быть трудной задачей. Если разработчик будет следовать рекомендациям, приведенным в C++ Core Guidelines, то он будет писать исключительно надежные, эффективные и прекрасно работающие программы на C++. Но руководство настолько переполнено советами, что порой трудно понять, с чего начать. Начните с «Красивого C++»!
Опытные программисты Гай Дэвидсон и Кейт Грегори выбрали 30 основных рекомендаций, которые посчитали особенно ценными, и дают подробные практические советы, которые помогут улучшить ваш стиль разработки на C++. Для удобства книга структурирована в точном соответствии с официальным веб-сайтом C++ Core Guidelines.
Author(s): Дж. Гай Дэвидсон, Кейт Грегори
Series: Для профессионалов
Edition: 1
Publisher: Питер
Year: 2023
Language: Russian
Commentary: Publisher's PDF
Pages: 368
City: СПб.
Tags: C++; Design Patterns; Best Practices; Object-Oriented Programming; Style
Избранные рекомендации по C++
Предисловие
Вступление
О книге
Доступность кода примеров
Благодарности
Об авторах
От издательства
Часть I. Bikeshedding — это плохо
Глава 1.1. P.2. Придерживайтесь стандарта ISO C++
Что такое стандарт ISO C++
История С++
Инкапсуляция вариаций
Вариации в окружении времени выполнения
Вариации на уровне языка C++ и компилятора
Расширения для С++
Защита заголовочных файлов
Вариации в основных типах
Нормативные ограничения
Изучение старых способов
Обратная совместимость в C++
Прямая совместимость и Y2K
Следите за последними изменениями в стандарте
IsoCpp
Конференции
Другие источники
Глава 1.2. F.51. Если есть выбор, используйте аргументы по умолчанию вместо перегрузки
Введение
Доработка ваших абстракций: дополнительные аргументы или перегрузка?
Тонкости разрешения перегрузки
Вернемся к примеру
Однозначная природа аргументов по умолчанию
Альтернативы перегрузке
Иногда без перегрузки не обойтись
Подведем итог
Глава 1.3. C.45. Не определяйте конструктор по умолчанию, который просто инициализирует переменные-члены; для этой цели лучше использовать внутриклассовые инициализаторы членов
Зачем нужны конструкторы по умолчанию
Как инициализируются переменные-члены
Что может случиться, если поддерживать класс будут два человека?
Сборная солянка из конструкторов
Аргументы по умолчанию могут запутать ситуацию в перегруженных функциях.
Подведем итог
Глава 1.4. C.131. Избегайте тривиальных геттеров и сеттеров
Архаичная идиома
Абстракции
Простая инкапсуляция
Инварианты класса
Существительные и глаголы
Подведем итог
Глава 1.5. ES.10. Объявляйте имена по одному в каждом объявлении
Позвольте представить
Обратная совместимость
Пишите более ясные объявления
Структурное связывание
Подведем итог
Глава 1.6. NR.2. Функции необязательно должны иметь только один оператор возврата
Правила меняются
Гарантия очистки
Идиома RAII
Пишите хорошие функции
Подведем итог
Часть II. Не навредите себе
Глава 2.1. P.11. Инкапсулируйте беспорядочные конструкции, а не разбрасывайте их по всему коду
Все одним глотком
Что означает инкапсулировать запутанную конструкцию
Назначение языка и природа абстракции
Уровни абстракции
Абстракция путем рефакторинга и проведения линии
Подведем итог
Глава 2.2. I.23. Минимизируйте число параметров в функциях
Сколько они должны получать?
Упрощение через абстрагирование
Делайте так мало, как возможно, но не меньше
Примеры из реальной жизни
Подведем итог
Глава 2.3. I.26. Если нужен кросс-компилируемый ABI, используйте подмножество в стиле C
Создавайте библиотеки
Что такое ABI
Сокращайте до абсолютного минимума
Распространение исключений
Подведем итог
Глава 2.4. C.47. Определяйте и инициализируйте переменные-члены в порядке их объявления
Подведем итог
Глава 2.5. CP.3. Сведите к минимуму явное совместное использование записываемых данных
Традиционная модель выполнения
Подождите, это еще не все
Предотвращение взаимоблокировок и гонок за данными
Отказ от блокировок и мьютексов
Подведем итог
Глава 2.6. Т.120. Используйте метапрограммирование шаблонов, только когда это действительно необходимо
std::enable_if => requires
Подведем итог
Часть III. Прекратите использовать это
Глава 3.1. I.11. Никогда не передавайте владение через необработанный (простой) указатель (T*) или ссылку (T&)
Использование области свободной памяти
Производительность интеллектуальных указателей
Использование простой семантики ссылок
gsl::owner
Подведем итог
Глава 3.2. I.3. Избегайте синглтонов
Глобальные объекты — это плохо
Шаблон проектирования «Синглтон»
Фиаско порядка статической инициализации
Как скрыть синглтон
Только один из них должен существовать в каждый момент работы кода
Подождите минутку...
Подведем итог
Глава 3.3. C.90. Полагайтесь на конструкторы и операторы присваивания вместо memset и memcpy
В погоне за максимальной производительностью
Ужасные накладные расходы конструкторов
Самый простой класс
О чем говорит стандарт?
А как же memcpy?
Никогда не позволяйте себе недооценивать компилятор
Подведем итог
Глава 3.4. ES.50. Не приводите переменные с квалификатором const к неконстантному типу
Работа с большим количеством данных
Брандмауэр const
Реализация двойного интерфейса
Кэширование и отложенные вычисления
Два вида const
Сюрпризы const
Подведем итог
Глава 3.5. E.28. При обработке ошибок избегайте глобальных состояний (например, errno)
Обрабатывать ошибки сложно
Язык C и errno
Коды возврата
Исключения
Boost.Outcome
Почему обрабатывать ошибки так сложно?
Свет в конце туннеля
Подведем итог
Глава 3.6. SF.7. Не используйте using namespace в глобальной области видимости в заголовочном файле
Не делайте этого
Неоднозначность
Использование using
Куда попадают символы?
Еще более коварная проблема
Решение проблемы операторов разрешения области видимости
Искушение и расплата
Подведем итог
Часть IV. Используйте эту новую особенность правильно
Глава 4.1. F.21. Для возврата нескольких «выходных» значений используйте структуры или кортежи
Форма сигнатуры функции
Документирование и аннотирование
Теперь можно вернуть объект
Также можно вернуть кортеж
Передача и возврат по неконстантной ссылке
Подведем итог
Глава 4.2. Enum.3. Старайтесь использовать классы-перечисления вместо «простых» перечислений
Константы
Перечисления с заданной областью видимости
Базовый тип
Неявное преобразование
Подведем итог
Глава 4.3. ES.5. Минимизируйте области видимости
Природа области видимости
Область видимости блока
Область видимости пространства имен
Область видимости класса
Область видимости параметров функции
Область видимости перечисления
Область действия параметра шаблона
Область видимости как контекст
Подведем итог
Глава 4.4. Con.5. Используйте constexpr для определения значений, которые можно вычислить на этапе компиляции
От const к constexpr
С++ по умолчанию
Использование constexpr
inline
consteval
constinit
Подведем итог
Глава 4.5. T.1. Используйте шаблоны для повышения уровня абстрактности кода
Повышение уровня абстракции
Шаблоны функций и абстракция
Шаблоны классов и абстракция
Выбор имени — сложная задача
Подведем итог
Глава 4.6. T.10. Задавайте концепции для всех аргументов шаблона
Как мы здесь оказались?
Ограничение параметров
Как абстрагировать свои концепции
Разложение на составляющие через концепции
Подведем итог
Часть V. Пишите хороший код по умолчанию
Глава 5.1. P.4. В идеале программа должна быть статически типобезопасной
Безопасность типов — это средство защиты в C++
Объединения
Приведение
Целые без знака
Буферы и размеры
Подведем итог
Глава 5.2. P.10. Неизменяемые данные предпочтительнее изменяемых
Неправильные значения по умолчанию
const в объявлениях функций
Подведем итог
Глава 5.3. I.30. Инкапсулируйте нарушения правил
Сокрытие неприглядных вещей
Поддержание видимости, что все в порядке
Подведем итог
Глава 5.4. ES.22. Не объявляйте переменные, пока не получите значения для их инициализации
Важность выражений и операторов
Объявление в стиле C
Объявление с последующей инициализацией
Максимальное откладывание объявления
Локализация контекстно-зависимой функциональности
Устранение состояния
Подведем итог
Глава 5.5. Per.7. При проектировании учитывайте возможность последующей оптимизации
Максимальная частота кадров
Работа вдалеке от железа
Оптимизация через абстракцию
Подведем итог
Глава 5.6. E.6. Используйте
идиому RAII для предотвращения утечек памяти
Детерминированное уничтожение
Утечка файлов
Почему это так важно?
Все это выглядит чересчур сложным: будущие возможности
Где все это получить?
Заключение
Послесловие