C++ coding Conventions — различия между версиями

Материал из SRNS
Перейти к: навигация, поиск
м (Ippolitov переименовал страницу C++ coding Conentions в C++ coding Conventions)
 
(не показаны 9 промежуточных версий 2 участников)
Строка 1: Строка 1:
=Правила кодирования с использованием Qt=
+
==Общее==
  
Ниже представлен обзор соглашений по написанию кода с использованием Qt. Эта информация была собрана здесь из разных источников: документации по Qt, тематических форумов, e-mail списков рассылки и опыта различных разработчиков.
+
Данный свод правил основан на [http://qt-project.org/wiki/Qt_Coding_Style Qt Coding Convention]. Она собрана из разных источников: документации по Qt, тематических форумов, e-mail списков рассылки и опыта различных разработчиков.
  
=Отступы=
+
== Отступы ==
  
 
*Для обозначения отступа используйте 4 пробела подряд
 
*Для обозначения отступа используйте 4 пробела подряд
 
*Используйте пробелы, а не табуляцию!
 
*Используйте пробелы, а не табуляцию!
  
=Объявление переменных=
+
==Объявление переменных==
  
 
*Объявляйте по одной переменной в строке.
 
*Объявляйте по одной переменной в строке.
Строка 15: Строка 15:
 
*Заводите переменные только по мере необходимости.
 
*Заводите переменные только по мере необходимости.
  
 
+
<source lang="cpp"> // Так не правильно
// Так не правильно
+
 
  int a, b;
 
  int a, b;
 
  char *c, *d;
 
  char *c, *d;
Строка 24: Строка 23:
 
  int width;
 
  int width;
 
  char *nameOfThis;
 
  char *nameOfThis;
  char *nameOfThat;
+
  char *nameOfThat;</source>
  
 
*Функции и переменные должны именоваться с прописной буквы, а если имя переменной или функции состоит из нескольких слов, то первое слово должно начинаться с прописной буквы, остальные – со строчных.
 
*Функции и переменные должны именоваться с прописной буквы, а если имя переменной или функции состоит из нескольких слов, то первое слово должно начинаться с прописной буквы, остальные – со строчных.
 
*Избегайте аббревиатур
 
*Избегайте аббревиатур
  
// Не правильно
+
<source lang="cpp"> // Не правильно
 
  short Cntr;
 
  short Cntr;
 
  char ITEM_DELIM = '\t';
 
  char ITEM_DELIM = '\t';
Строка 35: Строка 34:
 
  // Правильно
 
  // Правильно
 
  short counter;
 
  short counter;
  char itemDelimiter = '\t';
+
  char itemDelimiter = '\t';</source>
  
 
*Имена классов всегда начинаются с заглавной буквы. Public-классы начинаются с буквы ‘Q’ (QRgb). Public-функции должны начинаться с прописной буквы ‘q’ (qRgb).
 
*Имена классов всегда начинаются с заглавной буквы. Public-классы начинаются с буквы ‘Q’ (QRgb). Public-функции должны начинаться с прописной буквы ‘q’ (qRgb).
  
=Пробелы=
+
==Пробелы==
  
 
*Используйте пустые строки для логической группировки операторов, где это возможно.
 
*Используйте пустые строки для логической группировки операторов, где это возможно.
Строка 45: Строка 44:
 
*Всегда используйте один пробел перед фигурной скобкой
 
*Всегда используйте один пробел перед фигурной скобкой
  
// Неправильно
+
<source lang="cpp"> // Неправильно
 
  if(foo){
 
  if(foo){
 
  }
 
  }
Строка 51: Строка 50:
 
  // Правильно
 
  // Правильно
 
  if (foo) {
 
  if (foo) {
  }
+
  }</source>
  
 
*Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной.
 
*Всегда ставьте один пробел после ‘*’ или ‘&’, если они стоят перед описанием типов. Но никогда не ставьте пробелы после ‘*’ или ‘&’ и именем переменной.
  
char *x;
+
<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: Строка 62:
 
*Избегайте преобразования типов в стиле 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>
  
=Фигурные скобки=
+
==Фигурные скобки==
  
 
*Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют
 
*Возьмите за основу расстановку открывающих фигурных скобок на одной строке с выражением, которому они предшествуют
  
  // Неправильно
+
  <source lang="cpp">// Неправильно
 
  if (codec)
 
  if (codec)
 
  {
 
  {
Строка 81: Строка 80:
 
  if (codec) {
 
  if (codec) {
 
  }
 
  }
 
+
</source>
 
*Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке
 
*Исключение: Тело функции и описание класса всегда открывается фигурной скобкой, стоящей на новой строке
  
static void foo(int g)
+
<source lang="cpp"> static void foo(int g)
 
  {
 
  {
 
  qDebug("foo: %i", g);
 
  qDebug("foo: %i", g);
Строка 92: Строка 91:
 
  {
 
  {
 
  };
 
  };
 
+
</source>
 
*Используйте фигурные скобки в условиях, если тело условия в размере превышает одну линию, или тело условия достаточное сложное и выделение скобками действительно необходимо
 
*Используйте фигурные скобки в условиях, если тело условия в размере превышает одну линию, или тело условия достаточное сложное и выделение скобками действительно необходимо
        // Неправильно
+
      <source lang="cpp"> // Неправильно
 
         if (address.isEmpty()) {
 
         if (address.isEmpty()) {
 
             return false;
 
             return false;
Строка 108: Строка 107:
 
    
 
    
 
         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: Строка 145:
 
             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: Строка 166:
 
    
 
    
 
         // Правильно
 
         // Правильно
         (a + b) & c
+
         (a + b) & c</source>
  
=Использование конструкции switch=
+
==Использование конструкции switch==
  
 
*Операторы case должны быть в одном столбце со switch
 
*Операторы case должны быть в одном столбце со switch
 
*Каждый оператор case должен иметь закрывающий break (или return) или комментарий, котрой предполагает намеренное отсутсвие break & return.
 
*Каждый оператор case должен иметь закрывающий break (или return) или комментарий, котрой предполагает намеренное отсутсвие break & return.
        switch (myEnum) {
+
      <source lang="cpp">  switch (myEnum) {
 
         case Value1:
 
         case Value1:
 
             doSomething();
 
             doSomething();
Строка 184: Строка 183:
 
             break;
 
             break;
 
         }
 
         }
 
+
</source>
=Разрыв строк=
+
==Разрыв строк==
  
 
*Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки.
 
*Длина строки кода не должна превышать 100 символов. Если надо – используйте разрыв строки.
 
*Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть.
 
*Запятые помещаются в конец разорванной линии; операторы помещаются в начало новой строки. В зависимости от используемой вами IDE, оператор на конце разорванной строки можно проглядеть.
        // Правильно
+
      <source lang="cpp"> // Правильно
 
         if (longExpression
 
         if (longExpression
 
             + otherLongExpression
 
             + otherLongExpression
Строка 200: Строка 199:
 
             otherOtherLongExpression) {
 
             otherOtherLongExpression) {
 
         }
 
         }
 
+
</source>
=Наследование и ключевое слово `virtual`=
+
==Наследование и ключевое слово `virtual`==
  
 
*При переопределении virtual-метода, ни за что не помещайте слово `virtual` в заголовочный файл.
 
*При переопределении virtual-метода, ни за что не помещайте слово `virtual` в заголовочный файл.
  
=Главное исключение=
+
==Главное исключение==
  
 
*Не бойтесь нарушать описанные выше правила, если вам кажется, что они только запутают ваш код.
 
*Не бойтесь нарушать описанные выше правила, если вам кажется, что они только запутают ваш код.
  
=Ссылки=
+
[[Категория:Импала]]
http://qt-project.org/wiki/Qt_Coding_Style
+
[[Категория:Разработка]]

Текущая версия на 14:47, 11 ноября 2013

Содержание

[править] Общее

Данный свод правил основан на Qt Coding Convention. Она собрана из разных источников: документации по 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` в заголовочный файл.

[править] Главное исключение

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

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