Стандарты программирования на С++

Стандарты программирования на С++

Стандарты программирования на C++101 правило и рекомендация
Предисловие
Как пользоваться этой книгой
Стандарты кодирования и вы
Об этой книге
Благодарности
Вопросы организации и стратегии

Примеры
Компилируйте без замечаний при максимальном уровне предупреждений
Обсуждение


Используйте автоматические системы сборки программ

Используйте систему контроля версий
Одна голова хорошо, а две — лучше
Стиль проектирования

Один объект — одна задача
Главное — корректность, простота и ясность
Кодирование с учетом масштабируемости

Не оптимизируйте преждевременно
Не пессимизируйте преждевременно

Минимизируйте глобальные и совместно используемые данные
Сокрытие информации
Кодирование параллельных вычислений

Ресурсы должны быть во владении объектов

Стиль кодирования
Предпочитайте ошибки компиляции и компоновки ошибкам времени выполнения
Активно используйте const
Избегайте макросов
Избегайте магических чисел

Объявляйте переменные как можно локальнее
Всегда инициализируйте переменные
Избегайте длинных функций и глубокой вложенности
Избегайте зависимостей инициализаций между единицами компиляции
Минимизируйте зависимости определений и избегайте циклических зависимостей
Исключения

Делайте заголовочные файлы самодостаточными
Используйте только внутреннюю, но не внешнюю защиту директивы #include
Функции и операторы

Передача параметров по значению, (интеллектуальному) указателю или ссылке
Сохраняйте естественную семантику перегруженных операторов
Отдавайте предпочтение каноническим
Предпочитайте канонический вид ++ и --, и вызов префиксных операторов
Используйте перегрузку, чтобы избежать неявного преобразования типов
Избегайте перегрузки , || и , (запятой)

Не пишите код, который зависит от порядка вычислений аргументов функции
Проектирование классов и наследование
Ясно представляйте, какой вид класса вы создаете
Предпочитайте минимальные классы монолитным
Предпочитайте композицию наследованию

Избегайте наследования от классов, которые не спроектированы для этой цели

Стандарты программирования на С++

Предпочитайте предоставление абстрактных интерфейсов
Открытое наследование означает
Обсуждение
Практикуйте безопасное перекрытие
Виртуальные функции стоит делать неоткрытыми, а открытые — невиртуальными

Избегайте возможностей неявного преобразования типов
Делайте данные-члены закрытыми (кроме случая агрегатов в стиле структур C)
Не допускайте вмешательства во внутренние дела
Разумно пользуйтесь идиомой Pimpl
Предпочитайте функции, которые не являются ни членами, ни друзьями
New и delete всегда должны разрабатываться вместе

При наличии пользовательского
Конструкторы, деструкторы и копирование
Определяйте и инициализируйте переменные-члены в одном порядке
В конструкторах предпочитайте инициализацию присваиванию
Избегайте вызовов виртуальных функций в конструкторах и деструкторах
Делайте деструкторы базовых

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

Обеспечьте бессбойную функцию обмена
Пространства имен и модули
Храните типы и их свободный интерфейс в одном пространстве имен
Храните типы и функции в разных
Не используйте using для пространств

Избегайте выделения и освобождения памяти в разных модулях
Не определяйте в заголовочном файле объекты со связыванием
Не позволяйте исключениям пересекать границы модулей

Используйте достаточно переносимые типы в интерфейсах модулей
Шаблоны и обобщенность
Разумно сочетайте статический и динамический полиморфизм
Выполняйте настройку явно и преднамеренно
Не специализируйте шаблоны функций

Пишите максимально обобщенный код
Обработка ошибок и исключения
Широко применяйте assert для документирования внутренних допущений и инвариантов
Определите разумную стратегию обработки ошибок и строго ей следуйте
Отличайте ошибки от ситуаций, не являющихся ошибками

Стандарты программирования на С++

Проектируйте и пишите безопасный в отношении ошибок код
Для уведомления об ошибках следует использовать исключения
Генерируйте исключения по значению, перехватывайте — по ссылке
Уведомляйте об ошибках, обрабатывайте и преобразовывайте их там, где следует

Избегайте спецификаций исключений
STL: контейнеры
По умолчанию используйте vector
Вместо массивов используйте vector и string
Используйте vector (и string::c_str) для обмена данными с API на других языках
Храните в контейнерах только значения или интеллектуальные указатели

Предпочитайте push_back другим способам расширения последовательности
Предпочитайте операции с диапазонами операциям с отдельными элементами
Используйте подходящие идиомы
STL: алгоритмы
Используйте отладочную реализацию STL

Предпочитайте вызовы алгоритмов самостоятельно разрабатываемым циклам
Пользуйтесь правильным алгоритмом поиска
Пользуйтесь правильным алгоритмом сортировки
Делайте предикаты чистыми функциями
В качестве аргументов алгоритмов

Корректно пишите функциональные объекты
Безопасность типов
Избегайте явного выбора типов — используйте полиморфизм

Работайте с типами, а не с представлениями
Избегайте reinterpret_cast
Избегайте применения static_cast к указателям
Обсуждение
Ссылки

Избегайте преобразований, отменяющих const
Не используйте преобразование типов в стиле С
Не применяйте memcpy или memcmp к не-POD типам

Не используйте объединения для преобразований
Не используйте неизвестные аргументы (троеточия)
Не используйте недействительные объекты и небезопасные функции
Не рассматривайте массивы полиморфно
Список литературы
из Вопросы организации и стратегии
Стиль проектирования

Стиль кодирования
Функции и операторы
Проектирование классов и наследование
Конструкторы, деструкторы и копирование
Пространства имен и модули

Шаблоны и обобщенность
Обработка ошибок и исключения - 2
STL: Контейнеры
STL: алгоритмы
Безопасность типов
От издательского дома "Вильямс"
Предметный указатель