Table of Content
Правила кодирования с использованием Qt
Ниже представлен обзор соглашений по написанию кода с использованием Qt. Эта информация была собрана здесь из разных источников: документации по Qt, тематических формуов, e-mail списков рассылки и опыта различных разработчиков.
Отступы
- Для обозначения отступа используйте 4 пробела подряд
- Используйте проблелы, а не табуляцию!
Объявление переменных
- Объявляйте по одной переменной в строке.
- Избегайте, если это возможно, коротких и запутанных названий переменных (Например: “a”, “rbarr”, “nughdeget”).
- Односимвольные имена переменных подходят только для итераторов циклов, небольшого локального контекста и временных переменных. В остальных случаях имя переменной должно отражать ее назначение.
- Заводите переменные только по мере необходимости.
- // Так не правильно
- int a, b;
- char *c, *d;
- // А так - правильно
- int height;
- int width;
- char *nameOfThis;
- char *nameOfThat;
- Функции и переменные должны именоваться с прописной буквы, а если имя переменной или функции состоит из нескольких слов, то первое слово должно начинаться с прописной буквы, остальные – со строчных.
- Избегайте аббревиатур
- // Не правильно
- short Cntr;
- char ITEM_DELIM = '\t';
- // Правильно
- short counter;
- char itemDelimiter = '\t';
- Имена классов всегда начинаются с заглавной буквы. Public-классы начинаются с буквы ‘Q’ (QRgb). Public-функции должны начинаться с прописной буквы ‘q’ (qRgb).
Пробелы
- Используйте пустые строки для логической группировки операторов, где это возможно.
- Всегда используйте одну пустую строку в качестве разделителя
- Всегда используйте один пробел перед фигурной скобкой
- // Wrong
- if(foo){
- }
- // Correct
- if (foo) {
- }
- Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной.
- char *x;
- const char * const y = "hello";
- Бинарные операции отделяются пробелами с 2-х строн.
- После преобразования типов не ставьте пробелов.
- Избегайте проеобразования типов в стиле C.
- // Неправильно
- char* blockOfMemory = (char* ) malloc(data.size());
- // Правильно
- char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
Фигурные скобки
- Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют
- // Неправильно
- if (codec)
- {
- }
- // Правильно
- if (codec) {
- }
- Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке
- static void foo(int g)
- {
- qDebug("foo: %i", g);
- }
- class Moo
- {
- };
- Используйте фигурные скобки в условиях, если тело условия в размере превышает одну линию, или тело условия достаточное сложное и выделение скобками действительно необходимо
- // Неправильно
- if (address.isEmpty()) {
- return false;
- }
- for (int i = 0; i < 10; ++i) {
- qDebug("%i", i);
- }
- // Правильно
- if (address.isEmpty())
- return false;
- for (int i = 0; i < 10; ++i)
- qDebug("%i", i);
- Исключение 1: Используйте скобки, если родительское выражение состоит из нескольких строк / оберток
- // Правильно
- if (address.isEmpty() || !isValid()
- || !codec) {
- return false;
- }
- Исключение 2: Используйте фигурные скобки, когда тела ветвлений if-then-else занимают несколько строчек
- // Неправильно
- if (address.isEmpty())
- return false;
- else {
- qDebug("%s", qPrintable(address));
- ++it;
- }
- // Правильно
- if (address.isEmpty()) {
- return false;
- } else {
- qDebug("%s", qPrintable(address));
- ++it;
- }
- // Неправильно
- if (a)
- if (b)
- ...
- else
- ...
- // Правильно
- if (a) {
- if (b)
- ...
- else
- ...
- }
- Используйте фигурные скобки для обозначения пустого тела условия
- // Неправильно
- while (a);
- // Правильно
- while (a) {}
Круглые скобки
- Используйте круглые скобки для группировки выражений:
- // Неправильно
- if (a && b || c)
- // Правильно
- if ((a && b) || c)
- // Неправильно
- a + b & c
- // Правильно
- (a + b) & c
Использование конструкции switch
- Операторы case должны быть в одном столбце со switch
- Каждый оператор case должен иметь закрывающий break (или return) или комментарий, котрой предполагает намеренное отсутсвие break & return.
- switch (myEnum) {
- case Value1:
- doSomething();
- break;
- case Value2:
- doSomethingElse();
- // проходим дальше
- default:
- defaultHandling();
- break;
- }
Разрыв строк
- Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки.
- Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть.
- // Правильно
- if (longExpression
- + otherLongExpression
- + otherOtherLongExpression) {
- }
- // Неправильно
- if (longExpression +
- otherLongExpression +
- otherOtherLongExpression) {
- }
Наследование и ключево слово `virtual`
- При переопредлении virtual-метода, ни за что не помещайте слово `virtual` в заголовочный файл.
Главное исключение
- Не бойтесь нарушать описанные выше правила, если вам кажется, что они только запутают ваш код.

