Попытка использовать любой инструмент, не разобравшись хотя бы в основах того, что он делает и как его
следует использовать, скорее всего, приведет к разочарованию. С другой стороны, если потратить все свое
время на изучение теории о чем-то без практического применения, это будет довольно скучным занятием и
часто приводит к слишком идеалистическому пониманию.
© 2018 Крейг Скотт
Стайл гайд и общий список советов при написании кода на C++ для студентов курса “Программирование на основе классов и шабллонов” кафедры ИУ5 МГТУ им. Н.Э. Баумана.
Общие правила были описаны в Style Guade в 1 семестре.
напомним:
Независимо от ваших предпочтений, следование данному Style Guade абсолютно обязательно.
В названиях должен быть использован грамотный английский язык.
Использование элементов ООП постепенно будет доступно для использования. Уточняйте у ваших преподавателей с какими контейнерами и классами стандартных библиотек в каких лабораторных можно использовать.
Любая компиляция исходного кода должна сопровождаться флагами -Wall, -Wextra, -Werror и -Wpedantic.
Благодаря этим флагам компилятор интерпретирует предупреждения как ошибки компиляции, что заставляет писать более аккуратный и безопасный код.
DRY - Don’t Repeat Yourself. Принцип разработки, согласно которому следует избегать дублирование кода в приложении.
Старайтесь грамотно декомпозировать код на отдельные функции, которые затем можно переиспользовать в разных местах.
Если какая-то часть функциональности повторяется в разных местах - это повод вынести ее в отдельную функцию. В таком случае, если понадобится внести изменения, то их достаточно будет применить в одном месте, вместо нескольких. Это уменьшает вероятность появления ошибки и упрощает разработку.
Следует внимательно относится к данному принципу и не следовать ему слишком фанатично, так как это может привести к усилению зацепления.
KISS - Keep It Simple, Stupid. Принцип разработки, согласно которому следует предпочитать простые конструкции сложным.
По возможности избегайте неоправданного усложнения кода и пишите такой код, который будет понятен постороннему человеку, находящемуся вне контекста.
Это правило проектирования классов в 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 не требуется, если: