Русский English Spanish 简体中文

Правила кодирования с использованием Qt

Ниже представлен обзор соглашений по написанию кода с использованием Qt. Эта информация была собрана здесь из разных источников: документации по Qt, тематических формуов, e-mail списков рассылки и опыта различных разработчиков.

Отступы

  • Для обозначения отступа используйте 4 пробела подряд
  • Используйте проблелы, а не табуляцию!

Объявление переменных

  • Объявляйте по одной переменной в строке.
  • Избегайте, если это возможно, коротких и запутанных названий переменных (Например: “a”, “rbarr”, “nughdeget”).
  • Односимвольные имена переменных подходят только для итераторов циклов, небольшого локального контекста и временных переменных. В остальных случаях имя переменной должно отражать ее назначение.
  • Заводите переменные только по мере необходимости.

  1.         // Так не правильно
  2.         int a, b;
  3.         char *c, *d;
  4.    
  5.         // А так - правильно
  6.         int height;
  7.         int width;
  8.         char *nameOfThis;
  9.         char *nameOfThat;

  • Функции и переменные должны именоваться с прописной буквы, а если имя переменной или функции состоит из нескольких слов, то первое слово должно начинаться с прописной буквы, остальные – со строчных.
  • Избегайте аббревиатур

  1.         // Не правильно
  2.         short Cntr;
  3.         char ITEM_DELIM = '\t';
  4.    
  5.         // Правильно
  6.         short counter;
  7.         char itemDelimiter = '\t';

  • Имена классов всегда начинаются с заглавной буквы. Public-классы начинаются с буквы ‘Q’ (QRgb). Public-функции должны начинаться с прописной буквы ‘q’ (qRgb).

Пробелы

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

  1.         // Wrong
  2.         if(foo){
  3.         }
  4.    
  5.         // Correct
  6.         if (foo) {
  7.         }

  • Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной.

  1.         char *x;
  2.         const QString &myString;
  3.         const char * const y = "hello";

  • Бинарные операции отделяются пробелами с 2-х строн.
  • После преобразования типов не ставьте пробелов.
  • Избегайте проеобразования типов в стиле C.

  1.         // Неправильно
  2.         char* blockOfMemory = (char* ) malloc(data.size());
  3.    
  4.         // Правильно
  5.         char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));

Фигурные скобки

  • Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют

  1.         // Неправильно
  2.         if (codec)
  3.         {
  4.         }
  5.    
  6.         // Правильно
  7.         if (codec) {
  8.         }

  • Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке

  1.         static void foo(int g)
  2.         {
  3.             qDebug("foo: %i", g);
  4.         }
  5.    
  6.         class Moo
  7.         {
  8.         };

  • Используйте фигурные скобки в условиях, если тело условия в размере превышает одну линию, или тело условия достаточное сложное и выделение скобками действительно необходимо

  1.         // Неправильно
  2.         if (address.isEmpty()) {
  3.             return false;
  4.         }
  5.    
  6.         for (int i = 0; i < 10; ++i) {
  7.             qDebug("%i", i);
  8.         }
  9.    
  10.         // Правильно
  11.         if (address.isEmpty())
  12.             return false;
  13.    
  14.         for (int i = 0; i < 10; ++i)
  15.             qDebug("%i", i);

  • Исключение 1: Используйте скобки, если родительское выражение состоит из нескольких строк / оберток

  1.         // Правильно
  2.         if (address.isEmpty() || !isValid()
  3.             || !codec) {
  4.             return false;
  5.         }

  • Исключение 2: Используйте фигурные скобки, когда тела ветвлений if-then-else занимают несколько строчек

  1.         // Неправильно
  2.         if (address.isEmpty())
  3.             return false;
  4.         else {
  5.             qDebug("%s", qPrintable(address));
  6.             ++it;
  7.         }
  8.    
  9.         // Правильно
  10.         if (address.isEmpty()) {
  11.             return false;
  12.         } else {
  13.             qDebug("%s", qPrintable(address));
  14.             ++it;
  15.         }
  16.    
  17.         // Неправильно
  18.         if (a)
  19.             if (b)
  20.                 ...
  21.             else
  22.                 ...
  23.    
  24.         // Правильно
  25.         if (a) {
  26.             if (b)
  27.                 ...
  28.             else
  29.                 ...
  30.         }

  • Используйте фигурные скобки для обозначения пустого тела условия

  1.         // Неправильно
  2.         while (a);
  3.    
  4.         // Правильно
  5.         while (a) {}

Круглые скобки

  • Используйте круглые скобки для группировки выражений:

  1.         // Неправильно
  2.         if (a && b || c)
  3.    
  4.         // Правильно
  5.         if ((a && b) || c)
  6.    
  7.         // Неправильно
  8.         a + b & c
  9.    
  10.         // Правильно
  11.         (a + b) & c

Использование конструкции switch

  • Операторы case должны быть в одном столбце со switch
  • Каждый оператор case должен иметь закрывающий break (или return) или комментарий, котрой предполагает намеренное отсутсвие break & return.

  1.         switch (myEnum) {
  2.         case Value1:
  3.             doSomething();
  4.             break;
  5.         case Value2:
  6.             doSomethingElse();
  7.             // проходим дальше
  8.         default:
  9.             defaultHandling();
  10.             break;
  11.         }

Разрыв строк

  • Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки.
  • Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть.

  1.         // Правильно
  2.         if (longExpression
  3.             + otherLongExpression
  4.             + otherOtherLongExpression) {
  5.         }
  6.    
  7.         // Неправильно
  8.         if (longExpression +
  9.             otherLongExpression +
  10.             otherOtherLongExpression) {
  11.         }

Наследование и ключево слово `virtual`

  • При переопредлении virtual-метода, ни за что не помещайте слово `virtual` в заголовочный файл.

Главное исключение

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

Categories: