Skip to content

Latest commit

 

History

History

part2

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Разбор типовых ошибок на примерах Code Review

Оглавление

  1. Что такое Code Review
  2. Основные принципы написания корректного кода на C++
  3. Дополнительные материалы

Code Review - это проверка кода на ошибки, неточности и общий стиль программирования. Ситуация: вы разработчик. Вы отвечаете за свой фронт работы, например, за отправку данных на сервер. У команды уже есть готовый проект, вы вместе его поддерживаете и постоянно улучшаете. Новая функция не попадает сразу в проект. Вместо этого ваш код отправляется на Code Review.

1. Минимизируйте глобальные и совместно используемые данные

Избегайте совместного использования данных, в особенности глобальных данных. Совместно используемые данные усиливают связность, что приводит к снижению сопровождаемости, а зачастую и производительности.

2. Используйте RAII

Идиома С++ "выделение ресурса есть инициализация" (resource acquisition is initialization - RAII) представляет собой мощный инструмент для корректной работы с ресурсами. При выделении ресурса передайте его объекту-владельцу.

3. Активно используйте const

Неизменяемые значения проще понимать, отслеживать и мотивировать, т.е. там, где это целесообразно, лучше использовать константы вместо переменных.

4. Избегайте макросов

Не используйте макросы в C++ без крайней на то необходимости. C++ предоставляет богатый инструментарий, такой как шаблонные функции, автоматический вывод типов (auto, decltype), constexpr functions.

5. Избегайте магических чисел

Избегайте использования в коде литеральных констант наподобие 42 или 3.1415926. Такие константы не самоочевидны и усложняют сопровождение кода.

6. Объявляйте переменные как можно локальнее

Избегайте "раздувания" областей видимости. Переменных должно быть как можно меньше, а время их жизни - как можно короче.

7. Всегда инициализируйте переменные

Неинициализированные переменные - распространенный источник ошибок в программах на С и С++.

8. Сохраняйте естественную семантику перегруженных операторов

Перегружайте операторы только в случае веских на то оснований, и сохраняйте при этом их естественную семантику. Если это оказывается сложным, возможно, вы неверно используете перегрузку операторов.

9. Избегайте перегрузки &&, || и , (запятой)

Встроенные операторы &&, || и , (запятая) трактуются компилятором специальным образом. После перегрузки они становятся обычными функциями с весьма отличной семантикой.

10. Предпочитайте минимальные классы монолитным

Небольшие классы легче писать, тестировать и использовать. Они также применимы в большем количестве ситуаций.

11. Предпочитайте композицию наследованию

Сильные связи нежелательны, и их следует избегать везде, где только можно. Следует предпочитать композицию наследованию, кроме случаев, когда вы точно знаете, что делаете и какие преимущества дает наследование в вашем проекте.

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

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

13. Не допускайте вмешательства во внутренние дела

Избегайте возврата дескрипторов внутренних данных, управляемых вашим классом, чтобы клиенты не могли неконтролируемо изменять состояние вашего объекта, как своего собственного.

14. Определяйте и инициализируйте переменные-члены в одном порядке

Переменные-члены всегда инициализируются в том порядке, в котором они объявлены при определении класса; порядок их упоминания в списке инициализации конструктора игнорируется.

15. Избегайте вызовов виртуальных функций в конструкторах и деструкторах

Внутри конструкторов и деструкторов виртуальные функции теряют виртуальность.

16. Для Проектируйте и пишите безопасный в отношении ошибок код

Убедитесь, что при любых ошибках ваша программа всегда остается в корректном состоянии (в этом и заключается базовая гарантия). Остерегайтесь ошибок, нарушающих инвариант (включая утечки, но не ограничиваясь ими).

17. Для уведомления об ошибках следует использовать исключения

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

18. Генерируйте исключения по значению, перехватывайте — по ссылке

Генерируйте исключения по значению (не через указатель) и перехватывайте их как ссылки (обычно константные). Эта комбинация наилучшим образом соответствует семантике исключений.

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

Вызов алгоритма вместо самостоятельно разработанного цикла может оказаться более выразительным, легче сопровождаемым, менее подверженным ошибкам и не менее эффективным.

20. Избегайте явного выбора типов — используйте полиморфизм

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

21. Не используйте преобразование типов в стиле C

Старое преобразование типов в стиле С имеет различную (и часто опасную) семантику в зависимости от контекста, спрятанную за единым синтаксисом. Замена преобразования типов в стиле С преобразованиями С++ поможет защититься от неожиданных ошибок.

  1. H. Sutter, A. Alexandrescu “C++ Coding Standards. 101 Rules, Guidelines, and Best Pracitces”
  2. CppCoreGuidelines/CppCoreGuidelines.md at master • isocpp/CppCoreGuidelines (github.com)
  3. Google C++ Style Guide