C++ coding Conventions — различия между версиями
Материал из SRNS
Ippolitov (обсуждение | вклад) (→Объявление переменных) |
Ippolitov (обсуждение | вклад) |
||
Строка 45: | Строка 45: | ||
*Всегда используйте один пробел перед фигурной скобкой | *Всегда используйте один пробел перед фигурной скобкой | ||
− | + | <source lang="cpp"> // Неправильно | |
if(foo){ | if(foo){ | ||
} | } | ||
Строка 51: | Строка 51: | ||
// Правильно | // Правильно | ||
if (foo) { | if (foo) { | ||
− | } | + | }</source> |
*Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной. | *Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной. | ||
− | + | <source lang="cpp"> char *x; | |
const QString &myString; | const QString &myString; | ||
− | const char * const y = "hello"; | + | const char * const y = "hello";</source> |
*Бинарные операции отделяются пробелами с 2-х сторон. | *Бинарные операции отделяются пробелами с 2-х сторон. | ||
Строка 63: | Строка 63: | ||
*Избегайте преобразования типов в стиле C. | *Избегайте преобразования типов в стиле C. | ||
− | // Неправильно | + | <source lang="cpp">// Неправильно |
char* blockOfMemory = (char* ) malloc(data.size()); | char* blockOfMemory = (char* ) malloc(data.size()); | ||
// Правильно | // Правильно | ||
− | char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size())); | + | char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));</source> |
=Фигурные скобки= | =Фигурные скобки= | ||
Строка 73: | Строка 73: | ||
*Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют | *Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют | ||
− | // Неправильно | + | <source lang="cpp">// Неправильно |
if (codec) | if (codec) | ||
{ | { | ||
Строка 81: | Строка 81: | ||
if (codec) { | if (codec) { | ||
} | } | ||
− | + | </source> | |
*Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке | *Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке | ||
− | + | <source lang="cpp"> static void foo(int g) | |
{ | { | ||
qDebug("foo: %i", g); | qDebug("foo: %i", g); | ||
Строка 92: | Строка 92: | ||
{ | { | ||
}; | }; | ||
− | + | </source> | |
*Используйте фигурные скобки в условиях, если тело условия в размере превышает одну линию, или тело условия достаточное сложное и выделение скобками действительно необходимо | *Используйте фигурные скобки в условиях, если тело условия в размере превышает одну линию, или тело условия достаточное сложное и выделение скобками действительно необходимо | ||
− | + | <source lang="cpp"> // Неправильно | |
if (address.isEmpty()) { | if (address.isEmpty()) { | ||
return false; | return false; | ||
Строка 108: | Строка 108: | ||
for (int i = 0; i < 10; ++i) | for (int i = 0; i < 10; ++i) | ||
− | qDebug("%i", i); | + | qDebug("%i", i);</source> |
*Исключение 1: Используйте скобки, если родительское выражение состоит из нескольких строк / оберток | *Исключение 1: Используйте скобки, если родительское выражение состоит из нескольких строк / оберток | ||
− | + | <source lang="cpp"> // Правильно | |
if (address.isEmpty() || !isValid() | if (address.isEmpty() || !isValid() | ||
|| !codec) { | || !codec) { | ||
return false; | return false; | ||
− | } | + | }</source> |
Исключение 2: Используйте фигурные скобки, когда тела ветвлений if-then-else занимают несколько строчек | Исключение 2: Используйте фигурные скобки, когда тела ветвлений if-then-else занимают несколько строчек | ||
− | + | <source lang="cpp"> // Неправильно | |
if (address.isEmpty()) | if (address.isEmpty()) | ||
return false; | return false; | ||
Строка 146: | Строка 146: | ||
else | else | ||
... | ... | ||
− | } | + | }</source> |
*Используйте фигурные скобки для обозначения пустого тела условия | *Используйте фигурные скобки для обозначения пустого тела условия | ||
− | + | <source lang="cpp">// Неправильно | |
while (a); | while (a); | ||
// Правильно | // Правильно | ||
while (a) {} | while (a) {} | ||
− | + | </source> | |
=Круглые скобки= | =Круглые скобки= | ||
*Используйте круглые скобки для группировки выражений: | *Используйте круглые скобки для группировки выражений: | ||
− | + | <source lang="cpp"> // Неправильно | |
if (a && b || c) | if (a && b || c) | ||
Строка 167: | Строка 167: | ||
// Правильно | // Правильно | ||
− | (a + b) & c | + | (a + b) & c</source> |
=Использование конструкции switch= | =Использование конструкции switch= | ||
Строка 173: | Строка 173: | ||
*Операторы case должны быть в одном столбце со switch | *Операторы case должны быть в одном столбце со switch | ||
*Каждый оператор case должен иметь закрывающий break (или return) или комментарий, котрой предполагает намеренное отсутсвие break & return. | *Каждый оператор case должен иметь закрывающий break (или return) или комментарий, котрой предполагает намеренное отсутсвие break & return. | ||
− | + | <source lang="cpp"> switch (myEnum) { | |
case Value1: | case Value1: | ||
doSomething(); | doSomething(); | ||
Строка 184: | Строка 184: | ||
break; | break; | ||
} | } | ||
− | + | </source> | |
=Разрыв строк= | =Разрыв строк= | ||
*Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки. | *Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки. | ||
*Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть. | *Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть. | ||
− | + | <source lang="cpp"> // Правильно | |
if (longExpression | if (longExpression | ||
+ otherLongExpression | + otherLongExpression | ||
Строка 200: | Строка 200: | ||
otherOtherLongExpression) { | otherOtherLongExpression) { | ||
} | } | ||
− | + | </source> | |
=Наследование и ключевое слово `virtual`= | =Наследование и ключевое слово `virtual`= | ||
Версия 13:42, 11 июля 2013
Содержание |
Правила кодирования с использованием Qt
Ниже представлен обзор соглашений по написанию кода с использованием Qt. Эта информация была собрана здесь из разных источников: документации по Qt, тематических форумов, e-mail списков рассылки и опыта различных разработчиков.
Отступы
- Для обозначения отступа используйте 4 пробела подряд
- Используйте пробелы, а не табуляцию!
Объявление переменных
- Объявляйте по одной переменной в строке.
- Избегайте, если это возможно, коротких и запутанных названий переменных (Например: “a”, “rbarr”, “nughdeget”).
- Односимвольные имена переменных подходят только для итераторов циклов, небольшого локального контекста и временных переменных. В остальных случаях имя переменной должно отражать ее назначение.
- Заводите переменные только по мере необходимости.
// Так не правильно
int a, b;
char *c, *d;
// А так - правильно
int height;
int width;
char *nameOfThis;
char *nameOfThat;
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';
short Cntr;
char ITEM_DELIM = '\t';
// Правильно
short counter;
char itemDelimiter = '\t';
- Имена классов всегда начинаются с заглавной буквы. Public-классы начинаются с буквы ‘Q’ (QRgb). Public-функции должны начинаться с прописной буквы ‘q’ (qRgb).
Пробелы
- Используйте пустые строки для логической группировки операторов, где это возможно.
- Всегда используйте одну пустую строку в качестве разделителя
- Всегда используйте один пробел перед фигурной скобкой
// Неправильно
if(foo){
}
// Правильно
if (foo) {
}
if(foo){
}
// Правильно
if (foo) {
}
- Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной.
char *x;
const QString &myString;
const char * const y = "hello";
const QString &myString;
const char * const y = "hello";
- Бинарные операции отделяются пробелами с 2-х сторон.
- После преобразования типов не ставьте пробелов.
- Избегайте преобразования типов в стиле C.
// Неправильно
char* blockOfMemory = (char* ) malloc(data.size());
// Правильно
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
char* blockOfMemory = (char* ) malloc(data.size());
// Правильно
char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
Фигурные скобки
- Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют
// Неправильно
if (codec)
{
}
// Правильно
if (codec) {
}
if (codec)
{
}
// Правильно
if (codec) {
}
- Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке
static void foo(int g)
{
qDebug("foo: %i", g);
}
class Moo
{
};
{
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);
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;
}
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
...
}
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) {}
while (a);
// Правильно
while (a) {}
Круглые скобки
- Используйте круглые скобки для группировки выражений:
// Неправильно
if (a && b || c)
// Правильно
if ((a && b) || c)
// Неправильно
a + b & c
// Правильно
(a + b) & c
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;
}
case Value1:
doSomething();
break;
case Value2:
doSomethingElse();
// проходим дальше
default:
defaultHandling();
break;
}
Разрыв строк
- Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки.
- Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть.
// Правильно
if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
// Неправильно
if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) {
}
// Неправильно
if (longExpression +
otherLongExpression +
otherOtherLongExpression) {
}
Наследование и ключевое слово `virtual`
- При переопределении virtual-метода, ни за что не помещайте слово `virtual` в заголовочный файл.
Главное исключение
- Не бойтесь нарушать описанные выше правила, если вам кажется, что они только запутают ваш код.