Стандарты программирования на С++
Стандарты программирования на 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: алгоритмы
Безопасность типов
От издательского дома "Вильямс"
Предметный указатель