Директивы включения следует сортировать (по месту в иерархии системы, ниже уровень — выше позиция) и группировать. Оставляйте пустую строку между группами
#include <fstream>
#include <iomanip>
#include <qt/qbutton.h>
#include <qt/qtextfield.h>
#include "com/company/ui/PropertiesDialog.h"
#include "com/company/ui/MainWindow.h"
Пути включения не должны быть абсолютными. Вместо этого следует использовать директивы компилятора.
Директивы включения должны располагаться только в начале файла.
Общая практика. Избегайте нежелательных побочных эффектов, которые может вызвать «скрытое» включение где-то в середине файла исходного кода.
5.1
43. Локальные типы, используемые в одном файле, должны быть объявлены только в нём.
Улучшает сокрытие информации.
44. Разделы классаpublic, protected иprivate должны быть отсортированы. Все разделы должны быть явно указаны.
Сперва должен идти раздел public, что избавит желающих ознакомиться с классом от чтения разделов protected/private.
Приведение типов должно быть явным. Никогда не полагайтесь на неявное приведение типов.
floatValue = static_cast<float>(intValue); // НЕЛЬЗЯ: floatValue = intValue;
Этим программист показывает, что ему известно о различии типов, что смешение сделано намеренно.
5.2
46. Следует инициализировать переменные в месте их объявления.
Это даёт гарантию, что переменные пригодны для использования в любой момент времени. Но иногда нет возможности осуществить это:
int x, y, z;
getCenter(&x, &y, &z);
В этих случаях лучше оставить переменные неинициализированными, чем присваивать им какие-либо значения.
Переменные никогда не должны иметь двойной смысл.
Улучшайте читаемость, убеждаясь, что все представленные концепции не предполагают разночтений. Сокращайте возможность ошибки из-за побочных эффектов.
Следует избегать использования глобальных переменных.
Не существует причины использовать глобальные переменные в C++ (на самом деле существует.— Примечание переводчика). То же касается глобальных функций и (статических) переменных, область видимости которых — весь файл.
49. Не следует объявлять переменные класса как public.
Эти переменные нарушают принципы сокрытия информации и инкапсуляции. Вместо этого используйте переменные с модификатором private и соответствующие функции доступа. Исключение — класс без поведения, практически структура данных (эквивалент структур языка C). В этом случае нет смысла скрывать эти переменные.
Обратите внимание, что структуры в языке C++ оставлены только для совместимости с C; их использование ухудшает читаемость кода. Вместо структур используйте классы.
(Пункт № 50 отсутствует.— Примечание переводчика.)
51. Символ указателя или ссылки в языке C++ следует ставить сразу после имени типа, а не с именем переменной.
float* x; // НЕ РЕКОМЕНДУЕТСЯ: float *x;
int& y; // НЕ РЕКОМЕНДУЕТСЯ: int &y;
То, что переменная — указатель или ссылка, относится скорее к её типу, а не к имени. Программисты на C часто используют другой подход, но в C++ лучше придерживаться этой рекомендации.
53. Следует избегать неявного сравнения булевых (логических) переменных и указателей с нулём.
if (nLines != 0) // НЕ РЕКОМЕНДУЕТСЯ: if (nLines)
if (value != 0.0) // НЕ РЕКОМЕНДУЕТСЯ: if (value)
Стандарт C++ не гарантирует, что значения переменных int и float, равные нулю, будут представлены как бинарный 0. Также при явном сравнении видно сравниваемый тип.
Логично было бы предположить, что также и указатели не следует неявно сравнивать с нулём, например, if (line == 0) вместо if (line). Последнее является очень распространённой практикой в C/C++, поэтому также может быть использовано.
Переменные следует объявлять в как можно меньшей области видимости.
Это упрощает контроль над действием переменной и сторонними эффектами.
5.3
55. Нельзя включать в конструкцию for() выражения, не относящиеся к управлению циклом.
sum = 0; // НЕЛЬЗЯ: for (i = 0, sum = 0; i < 100; i++)
for (i = 0; i < 100; i++) sum += value[i];
sum += value[i];
Улучшайте поддержку и читаемость. Строго разделяйте контроль над циклом и то, что в нём содержится.