C++ coding Conventions

Материал из SRNS
Перейти к: навигация, поиск

Содержание

Правила кодирования с использованием 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).

Пробелы

  • Используйте пустые строки для логической группировки операторов, где это возможно.
  • Всегда используйте одну пустую строку в качестве разделителя
  • Всегда используйте один пробел перед фигурной скобкой
// Неправильно
if(foo){
}
  
// Правильно
if (foo) {
}
  • Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной.
char *x;
const QString &myString;
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` в заголовочный файл.

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

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

Ссылки

http://qt-project.org/wiki/Qt_Coding_Style

Персональные инструменты
Пространства имён

Варианты
Действия
SRNS Wiki
Рабочие журналы
Приватный файлсервер
QNAP Сервер
Инструменты