Директивы включения следует сортировать (по месту в иерархии системы, ниже уровень — выше позиция) и группировать. Оставляйте пустую строку между группами

#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];


Улучшайте поддержку и читаемость. Строго разделяйте контроль над циклом и то, что в нём содержится.