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

© 2018 Крейг Скотт

BMSTU CS Style Guide

Стайл гайд и общий список советов при написании кода на C++ для студентов курса “Программирование на основе классов и шабллонов” кафедры ИУ5 МГТУ им. Н.Э. Баумана.

Содержание

Общие правила

Общие правила были описаны в Style Guade в 1 семестре.

напомним:

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


STL и ООП

Использование элементов ООП постепенно будет доступно для использования. Уточняйте у ваших преподавателей с какими контейнерами и классами стандартных библиотек в каких лабораторных можно использовать.


Компиляция

Любая компиляция исходного кода должна сопровождаться флагами -Wall, -Wextra, -Werror и -Wpedantic.

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


DRY

DRY - Don’t Repeat Yourself. Принцип разработки, согласно которому следует избегать дублирование кода в приложении.

Старайтесь грамотно декомпозировать код на отдельные функции, которые затем можно переиспользовать в разных местах.

Если какая-то часть функциональности повторяется в разных местах - это повод вынести ее в отдельную функцию. В таком случае, если понадобится внести изменения, то их достаточно будет применить в одном месте, вместо нескольких. Это уменьшает вероятность появления ошибки и упрощает разработку.

Следует внимательно относится к данному принципу и не следовать ему слишком фанатично, так как это может привести к усилению зацепления.


KISS

KISS - Keep It Simple, Stupid. Принцип разработки, согласно которому следует предпочитать простые конструкции сложным.

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


Rule of Five

Это правило проектирования классов в C++, актуальное для C++11 и выше (включая C++20), которое применяется, если класс управляет ресурсами вручную (динамическая память, файлы, сокеты и т.п.).

Суть Rule of Five

Если в классе явно реализован хотя бы один из следующих методов, то скорее всего необходимо реализовать все пять:

Зачем это нужно

При наличии ресурсов (например, char*) компилятор не может автоматически корректно управлять копированием и освобождением памяти.
Без Rule of Five возникают:

Полный список методов Rule of Five (C++20)

class MyClass {
private:
    char* data;

public:
    // 1. Конструктор по умолчанию
    MyClass() noexcept;

    // 2. Конструктор копирования
    MyClass(const MyClass& other);

    // 3. Оператор копирующего присваивания
    MyClass& operator=(const MyClass& other);

    // 4. Конструктор перемещения
    MyClass(MyClass&& other) noexcept;

    // 5. Оператор перемещающего присваивания
    MyClass& operator=(MyClass&& other) noexcept;

    // 6. Деструктор
    ~MyClass();
};

Несмотря на название, методов шесть, но правило называется Rule of Five, так как конструктор по умолчанию не всегда обязателен.

Кратко о каждом методе

Создаёт поразрядную копию объекта.

MyClass(const MyClass& other);

Используется при:

MyClass a;
MyClass b = a;

Заменяет содержимое уже существующего объекта.

MyClass& operator=(const MyClass& other);

Используется при:

b = a;

«Забирает» ресурсы у временного объекта.

MyClass(MyClass&& other) noexcept;

Передаёт ресурсы существующему объекту.

MyClass& operator=(MyClass&& other) noexcept;

Освобождает ресурсы.

~MyClass();

Rule of Three, Rule of Five и Rule of Zero

Правило Когда применяется Необходимые методы
Rule of Three Класс владеет ресурсами (до C++11) Деструктор, конструктор копирования, оператор копирующего присваивания
Rule of Five Класс владеет ресурсами (C++11+) Rule of Three + конструктор перемещения и оператор перемещающего присваивания
Rule of Zero Класс не управляет ресурсами напрямую Специальные методы не реализуются вручную

Когда Rule of Five НЕ нужен

Rule of Five не требуется, если: