Соглашения о стиле кодирования на C++




НазваниеСоглашения о стиле кодирования на C++
Дата публикации17.10.2016
Размер9.76 Kb.
ТипДокументы

Соглашения о стиле кодирования на C++ ver.1.2.(public)

Соглашения о стиле кодирования на C++


Следует понимать, что стандарт создается вовсе не для того, что бы усложнить кому-то жизнь. Обычно к подобному стандарту достаточно просто привыкнуть и он быстро перестает быть обременительным. При этом сильно повышает читабельность кода внутри команды. Благодаря ему, не только другие могут читать твой код, но и ты сам сможешь без труда читать чужой. Так же упрощается процесс сопровождения.


  1. Правило имен

    1. Все глобальные и статические(public) константы должны называться большими буквами

    2. Если имя составлено из нескольких слов, то каждое из них должно начинаться с заглавной буквы.

    3. Все имена методов с доступом public должны начинаются с большой буквы.

Все имена методов с доступом private и protected должны начинать с маленькой буквы

Все переменные-члены класа должны начинаться с префикса m_

Все имена должны быть осмысленными. Для определения степени осмысленности следует предположить, сможет ли сторонний разработчик без документции только лишь по имени определить «что это такое». Необходимо стремиться что бы код докумнетировал сам себя.

Имя класса должно быть существительным и характеризовать совокупность имплементируемых им объектов. Может быть выбрано из словаря предметной области.

Имя переменной должно быть существительным и характеризовать выполняемую ей роль.

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

  1. Оформление и структура программы.

Одна строчка – один оператор. Есть исключения, описанные ниже.

Разделители ставятся непосредственно после имени или закрывающей скобки, а перед следующим именем необходим пробел. Это касается всех разделителей, за исключением математических операций, правила для которых будут оговорены отдельно(в следующих версиях). После закрывающей скобки ; ставится только в декларациях.

Запрещается гасить warnings прагмами, кроме случаев, когда это невозможно сделать другими способами, а Вы точно знаете, что делаете. (одн из разрешенных случаев возникает при множестенном наследовании: #pragma warning (disable:4250) //via dominance)

Не рекомендуется использовать конструкции вида

pBM->GetClass(i)->GetProperty(i)->GetName();

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

  1. Конструкции языка должны подчиняться следующим правилам:

    1. Определение классов.

class cMyClass : public iMyParentAbstractClass

{

friend class cFirstFriendClass;

friend class cSecondFriendClass;

private:

// private attributes and operations

protected:

// protected attributes and operations

public:

// public constructors

virtual ~cMyClass();

// public attributes and operations

};
ЛИБО
class cMyClass : public iMyParentAbstractClass

{

friend class cFirstFriendClass;

friend class cSecondFriendClass;

private:

// private attributes

protected:

// protected attributes

public:

// public attributes
private:

// private operations

protected:

// protected operations

public:

// public constructors

virtual ~cMyClass();

// public operations

};
Всегда следует делать деструктор виртуальным. Исключения могут составить только те случаи, когда наличие именно виртуального деструктора нарушает логику уничтожения объектов.
В случае наличия в реализации класса конструкции:

delete this;

деструктор не должен быть открытым. Это гарантирует, что экземпляр не будет создан в стэке.
Если экземпляр класса может быть создаваться и удаляться в рзаличных пространствах имен, то он должен иметь вируальную функцию удаления, типа:

virtual void Release()

{

//Do something

delete this;

}

И закрытый дестуктор.
Имя класса должно начинаться с буквы «c», «t»(шаблон), «i»(асбтрактный класс). Оно может содержать абривиатуру продукта, маленькими буквами начиная с заглавной например:

cClObject (CL-абривиатура продукта.)

cGlShape(GL-Graphics Library)
Список друженственных классов должен быть описаны вверху, до деклараций области видимости.

Не допускается при декларации атрибутов класса, перечислять их через запятую в одной строке. Надо делать так:

long m_x, ///Позиция объекта по горизонтали

m_y; ///Позиция объекта по вертикали

либо так:

long m_x; ///Позиция объекта по горизонтали

long m_y; ///Позиция объекта по вертикали


    1. Определение структур.

Структуры определяются аналогично классам.

    1. Определение перечисляемых типов.

еnum ePropertyType ///Список типов свойств

{

PT_Unknown = 0, ///Неизвестный тип свойства

PT_WideString, ///Тип свойства- строка

PT_Long4 ///Тип свойства- целое число
};
Имя каждого элемента должно начинаться с префикса, составленного из начальных букв слов, составляющих имя типа и знака «подчеркивание».

^ Пример: ePropertyType состоит из двух слов: Property и Type. Следовательно профекс будет PT_

Для eVariantType, VT_

Следует явно указывать значение первого элемента перечисления.

Имя перечисления должно начинаться с буквы «e» и может содержать аббревиатуру продукта.

    1. Определение переменных.

bool bReadOnly;

cString ClassName; //либо sClassName

unsigned i, n;

long PropertiesCount = 0;

char *pFirstString, *pSecondString;

cClassInfo *pCI;

cMeta *pMeta; //либо просто Meta
Допускается указание нескольких переменных в одном определении, а также инициализация в определении. Однако не следует этим злоупотреблять — код должен оставаться легко читаемым.

    1. Определение констант

Вcе константы именоваться заглавными буквами. Слова разделяются знаком подчеркивания

    1. Обработка исключений

try

{

if (/*some_condition*/)

throw /*some_exception*/;

}

catch (exType1 &ex)

{

}

catch (exType2 &ex)

{

}

catch (…)

{

}


    1. Условный оператор

if (/*some_condition*/)

{

// code

}

else

{

// code

}
if (/*some_condition*/)

/*simple_operator*/;

На равенство нулю приверяем так: if (!some_variable)

На неравенство нулю приверяем так: if (some_variable)

При сравнении на равенство, во избежание ошибки имеет смысл помещать константу слева от опрератора сравнения: if (3 == some_variable)


    1. Оператор выбора

switch (/*constant_expression*/)

{

case Value1:

some_operators;

break;

case Value2:

{

variable_declaration;

some_operators;

break;

}

default:

default_operator;

}
switch (/*constant_expression*/)

{

case Value1 : short_operator; break;

case Value2 : short_operator; break;

default : default_operator;

}

  1. Переменные.

Следует употреблять только осмысленные имена переменных. Исключение составляют единичные переменные:

  • счетчик цикла — i;

  • обозначения количества объектов — n;

  • обозначения временной строковой переменной — s, str.

Если счётчиков или временных переменных несколько — используются общие правила.
В именах допускаются сокращения, однозначные в данном контексте. Сокращения строятся из названия типа переменной следующим образом:
cClassInfo -> CI

cPropertyInfoPath -> PIP

cAssociationInfo -> AI
Если возможно неоднозначное прочтение, следует использовать полные имена:
cPropertyInfo *pPropertyInfo;

cParameterInfo *pParameterInfo;
Описание прификсов смотри в приложении A.

Переменная должна иметь минимальное время жизни. (см. приложение D)



  1. Функции и операторы

    1. Указывайте имена аргументов в прототипах функций

    2. Функция должна решать одну задачу, иначе должна разбиваться на несколько функций

    3. Всегда проверяйте коды возврата ошибки

  2. Ошибки

    1. Если требуется вернуть более 1 типа ошибок, то коды ошибок должны быть enum-ом

    2. Не используйте системно-зависимых функций для сообщений об ошибках.

    3. Для сообщение о критических ошибок использовать ErrorManager. Под критической ошибкой понимается ошибка после которой не может быть продолжена корректная работа приложения.

    4. Текст ошибки должен быть информативным

  3. Комментарии

Основное назначение комментариев- основа для формирования докумнетации.

Документирование кода это не только комментарии, но и сам код. Правильно выбранное имя функции, класса, переменной гораздо эффективнее длинного описания. Необходимо стараться кодировать таким образом, что(в теории) комментраий был не нужен.

Документирование кода является частью процесса разработки и должно опережать кодирование (а не наоборот). Пишите прототипы, документируйте их, и лишь затем приступайте к кодированию.

Помнить, что комментарии писать всё равно придется, и чем быстрее, тем легче это дастся.

Перед прототипом функции может быть сделан простой комментарий

Перед реализацией функции должно быть ее описание в нотации Doxygen

Все атрибуты класса должны быть описаны в нотации Doxygen

  1. Типы переменных

    1. Запрещается использование типа int, по причине его компилятора – зависимости. Вместо него должны использоваться следующие целые типы:

      • char – 1 байт, со знаком

      • uchar – 1 байт, без знака

      • short – 2 байт, со знаком

      • ushort – 2 байт, без знака

      • long – 4 байт, со знаком

      • ulong – 4 байт, без знака

      • llong – 8 байт, со знаком

      • ullong – 8 байт, без знака


Приложение A. Префиксы


Префиксы для именования типов:

Префикс

Описание

Важность

c[ClassName]

c[StructName]

имя класcа или структуры




i[Longerface]

Имя интерфейса




t[TemplateClass]

Класс шаблон




ex[ExcaptionName]

Имя исключения




e[EnumName]

Имя перечисления




c[ClassName]Impl







P[ClassName]

Тип- указатель на класс

Необязательно



^ Префиксы для именования переменных, аргументов и атрибутов класса:

Префикс

Описание

Важность

m_[имя переменной]

это член класса




pimpl_[ClassName]

Указатель на экземпляр impl




p[имя переменной]

Указатель, кроме строк(char*)




b[имя переменной]

Переменная типа bool

Необязательно

s[имя переменной]

Переменная типа строка

Необязательно

n[имя переменной]

Целое

Необязательно

f[имя переменной]

Вещественное

Необязательно

g_[имя переменной]

Глобальная перемнная

Необязательно


Примеры:
class cBaseObject;

void DoSomething (cObject *Object);
cSubject * m_pClient;

cProducts *pCurrentProduct=0;
Приложение B. Формат комментария (Нотация Doxygen)

На основе документации и правил комментирования из пакета авто-документации DOXYGEN.

^ Приложение C. Время жизни переменной

Переменная должна иметь минимальное время жизни.

Что касается объявления переменных перед использованием, то лучше действительно объявлять перед использованием. "Расстояние" (в SLOC обычно) между объявлением переменной и первым ее использованием называется "пробегом" и учитывается в некоторых метриках "поддерживаемости" и "надежности" кода. Чем меньше суммарный пробег по программе, тем лучше.

Особенно это существенно для объектов

Локализация переменных. Возможность использования переменной в явном контексте функции, избегая ее использования (в том числе и случайного - сколько раз такое было!) вне конкретного блока, цикла и т.д.

Оптимизация. Возможность создания и уничтожения классов, структур, их экземпляров, переменных и т.п. в нужных местах, т.е. экономия памяти, времени, оптимизация и т.п.

Удобочитаемость. Если переменная i используется только в цикле, так давайте использовать ее только там. В пользу этого говорят оба предыдущих пункта. Кроме того, в начале функции рекомендуется собирать только те объявления, которые наиболее существенны для всей функции, отражают ее смысл и вариант реализации. Какой автор театральной пьесы будет вписывать в "действующие лица" всех собак и кошек, участвующих в действии, или молчаливого кучера?

Пример: Требуеться посчитать сумму

Не правильно (время жизни больше чем нужно)

Правильно (время жизни минимально)

int i;

double d;

double s=0;

for(i=0,i
{

d=sqrt(a[i]);

s+=d*sin(d);

}

double s=0;

for(int i=0,i
{

double d=sqrt(a[i]);

s+=d*sin(d);

}





--



Похожие:

Соглашения о стиле кодирования на C++ iconТермины и определения
Иное лицо, пользующееся жилым помещением на основании соглашения с Собственником данного помещения, имеет права, несет обязанности...
Соглашения о стиле кодирования на C++ iconСущественные условия Дополнительного соглашения №3 к договору №409-211 от 20. 08. 2007 г
«Об одобрении заключения дополнительного соглашения к договору на выполнении проектных работ между зао «Лонас технология» и ОАО «Хибинская...
Соглашения о стиле кодирования на C++ iconРешение о заключении мирового соглашения со стороны конкурсных кредиторов...
Мировое соглашение процедура банкротства, применяемая на любой стадии рассмотрения дела о банкротстве в целях прекращения производства...
Соглашения о стиле кодирования на C++ iconСоциальное партнерство главная идеология профсоюзного движения
Республики Татарстан, Кабинетом Министров Республики Татарстан о проведении социально-экономической политики и развитии социальною...
Соглашения о стиле кодирования на C++ icon1. Производится двухканальная (стерео) звукозапись с частотой дискретизации...
Гц и глубиной кодирования 24 бита. Запись длится 2 минуты, ее результаты записываются в файл, сжатие данных не производится. Какое...
Соглашения о стиле кодирования на C++ icon1. Производится одноканальная (моно) звукозапись с частотой дискретизации...
Гц и глубиной кодирования 16 бита. Запись длится 2 минуты, ее результаты записываются в файл, сжатие данных не производится. Какое...
Соглашения о стиле кодирования на C++ iconПроизводится двухканальная (стерео) звукозапись с частотой дискретизации...
Гц и глубиной кодирования 16 бит. Запись длится 6 минут, ее результаты записываются в файл, сжатие данных не производится. Какое...
Соглашения о стиле кодирования на C++ iconУрок изо в 3 классе тема: «Наряд для куклы в стиле русского народного костюма»
Тема: «Наряд для куклы в стиле русского народного костюма». Тема проектной деятельности: «Весёлый хоровод». Цели и задачи
Соглашения о стиле кодирования на C++ icon1. Производится одноканальная (моно) звукозапись с частотой дискретизации...
Производится одноканальная (моно) звукозапись с частотой дискретизации 11 кГц и глубиной кодирования 24 бита. Запись длится 7 минут,...
Соглашения о стиле кодирования на C++ iconТема: «Проект соглашения об уплате алиментов на двух несовершеннолетних детей»
Задание: Составьте проект соглашения об уплате алиментов на двух несовершеннолетних детей
Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
dopoln.ru
Главная страница