Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

CodeRules.M101

.pdf
Скачиваний:
13
Добавлен:
20.04.2015
Размер:
235.04 Кб
Скачать

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 11 из 23

45.Пишите идентификаторы переменных в смешанном регистре начиная с символа нижнего

регистра.

 

 

ПРАВИЛЬНО

 

НЕПРАВИЛЬНО

 

 

 

strMessage

strmessage

 

 

 

 

 

str_message

 

 

 

 

 

StrMessage

 

 

 

 

46.Если в качестве имен (части имен) используются аббревиатуры и акронимы, то последние должны подчиняться общим правилам (а не писаться полностью в верхнем регистре).

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

exportHtmlSource();

exportHTMLSource();

 

 

openDvdPlayer();

openDVDPlayer();

 

 

47.Пишите макроопределения в верхнем регистре с использованием подчеркивания в качестве разделителя.

48.Пишите именованные константы (включая значения перечислений) в верхнем регистре с использованием подчеркивания в качестве разделителя.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

MAX_ITERATIONS

MaxIterations

 

 

COLOR_RED

max_iterations

 

 

PI

MAXITERATIONS

 

 

49.Пишите имена функций в смешанном регистре начиная с символа нижнего регистра. Рекомендуется начинать имя функции с глагола (английского).

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

getName

GetName

 

 

computeTotalWidth

widthCompute

 

 

50.Пишите имена пространств имен в нижнем регистре с использованием подчеркивания в качестве разделителя.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

std

SAMPLE

 

 

model::analyzer

Model::analyzer

 

 

common::math_geometry

common::mathGeometry

 

 

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

ПРИМЕР

template<class T>

template<typename C, typename D>

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 12 из 23

Частные правила

52.Используйте префикс "p" для переменных-указателей.

ПРИМЕР

int* pValues(0);

53.Используйте префикс "s_" для неконстантных статичских переменных.

ПРИМЕР

static int s_nCall(0);

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

ПРИМЕР

int pValues[] = {0};

vector<Point> points;

55.Используйте префикс "n" для переменных, определяющих число некоторых объектов.

ПРИМЕР

nPoint = points.size();

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

ПРИМЕР

iPoint

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

ПРИМЕР

chapterNo

58.Используйте префиксы is, has, can, should для имен переменных и функций, определяющих логические свойства некоторого объекта.

ПРИМЕР

isBook

canMove()

59.Для парных функций используйте парные имена

get/set, add/remove, create/destroy, start/stop, insert/delete, increment/decrement, old/new, begin/end, first/last, up/down, min/max, next/previous, old/new, open/close, show/hide, suspend/resume, etc.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

addPage

addPage

removePage

destroyPage

 

 

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.) 05.02.10 стр. 13 из 23

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

 

ПРАВИЛЬНО

 

НЕПРАВИЛЬНО

 

 

 

 

bool

isError(false);

bool

isNotError(true);

 

 

 

 

bool

canMove(true);

bool

cantMove(false);

 

 

!isError

!isNotError

 

 

 

 

61.Давайте функциям (возвращают некоторое значение) имена в соответствии с тем, что они возвращают. Давайте процедурам (ничего не возвращают) имена в соответствии с тем, что они делают

Ответственное программирование

62.Следуйте стандарту языка С++, используйте стандартную библиотеку и избегайте расширений. При невозможности решить задачу стандартными средствами максимально локализуйте использование нестандартных возможностей.

63.Используйте константность (const) везде, где только это возможно.

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

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

64.При выборе между указателем и ссылкой предпочитайте ссылку. Указатель используйте только в тех случаях, когда объект, на который ссылаетесь, может не существовать (нулевой указатель).

65.Избегайте функций с неопределенным числом параметров (эллипсис).

66.Объявляйте статическими все функции с областью видимости уровня файла (объявление размещено файле срр).

67.Используйте операторы new и delete для динамической работы с памятью и соблюдайте парность (new/delete и new[]/delete[]). Избегайте использования функций malloc, realloc, free Си-

подмножества стандартной библиотеки.

 

ПРАВИЛЬНО

 

НЕПРАВИЛЬНО

 

 

 

 

 

int

pData = new

[SIZE];

int

pData = new [SIZE];

...

 

 

...

 

delete[] pData;

 

delete pData;

 

 

 

 

 

68.Избегайте "волшебных чисел" и "волшебных строк" в исходных текстах. Для отличных от 0 и 1 числовых значений в используйте именованные константные значения (переменная, член перечисления, вызов статической функции).

69.Используйте символы верхнего регистра для записи значений литералов (шестнадцатиричные символы и суффиксы типов).

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

long frame(64L);

long frame(64l);

 

 

int count(0x00AA);

int count(0x00aa);

 

 

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 14 из 23

70.Константы с плавающей точкой всегда пишите с разделителем разрядов и хотя бы одним

разрядом до и после разделителя.

 

 

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

 

 

float height(0.5);

float height(.5);

 

 

 

 

double weight(0.0);

double weight(0);

 

 

 

 

double quality = 3.0e8;

double quality = 3e8;

 

 

 

 

;double sum(0);

double sum(0);

 

// ...

// ...

 

sum = (a + b) * 10.0;

sum = (a + b) * 10;

 

 

 

 

71.Всегда явно специфицируйте тип возвращаемого функцией значения.

 

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

 

 

int getWidth();

getWidth();

 

 

 

 

Использование типов данных

72.Избегайте отличных от public секций и функций в структурах. 73.Локальные для одного файла типы определяйте внутри этого файла. 74.Используйте С++ преобразования типов (а не С).

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

static_cast<int>(floatValue)

int(floatValue)

 

 

const_cast<char*>(pConstStr)

(char*)pConstStr

 

 

reinterpret_cast<char*>(pVoidData)

char*(pVoidData)

 

 

dynamic_cast<CBase*>(pChild)

CBase*(pChild)

 

 

75.Всегда явно специфицируйте преобразования типов не полагаясь на неявные преобразования.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

floatValue =

floatValue = intValue;

static_cast<float>(intValue);

 

 

 

Использование переменных

76.Определяйте переменные в минимально возможной области видимости. Рекомендуется делать объявление непосредственно перед первым использованием переменной.

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 15 из 23

77.Инициализируйте переменные при определении. Если начальное значение переменной не

определено из контекста, используйте 0 (ноль) в качестве начального значения.

 

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

 

 

double* pVolume = 0;

double *pVolume;

 

 

 

 

int nPage(0);

int nPage;

 

 

 

 

int indexes[MAX_INDEX] = {0};

int indexes[MAX_INDEX];

 

 

 

 

struct student

struct student

 

{

{

 

char* m_name;

char* m_name;

 

int m_group;

int m_group;

 

};

};

 

// ...

// ...

 

student pdv = { "Polevoy D.V.", 876};

student lastStudent;

 

student lastStudent = {0};

 

 

 

 

 

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

79.Минимизируйте число глобальных переменных. При необходимости использования глобальных данных рассмотрите другие возможные реализации (класса со статическими данными и функциями доступа, шаблон Singleton). Если глобальные данные реализуются в виде глобальной переменной, то доступ к ее значениям осуществляйте только через функции вида set/get.

80.Для указателей и ссылок спецификатор (символ '*' или '&') ставьте сразу после типа, без пробелов (а не перед именем переменной).

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

 

 

double* pVolume =

0;

double *pVolume = 0;

 

 

 

 

 

std::string& path

= filePath;

std::string & path =

filePath;

 

 

 

 

81.Всегда явно сравнивайте с нулем переменные типов отличных от bool в логических выражениях. Избегайте сравнений с отличными от нуля значениями, если подразумеваете проверку логического условия.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

if (0 != nLine)

if (nLine)

 

 

if (0 == nLine)

if (!nLine)

 

 

82.Для сравнения указателей с нулем используйте 0.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

if (0 == pData)

if (NULL == pData)

{

{

// ...

// ...

}

}

 

 

if (0 != pData)

if (pData)

{

{

// ...

// ...

}

}

 

 

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 16 из 23

83.Запрещено использовать глобальные переменные для инициализации глобальных переменных.

Управление потоком исполнения

84.Максимальная вложенность управляющих структур не больше 3. Конструкция else if не считается следующим уровнем вложения.

85.Используйте цикл for в качестве основного варианта типа цикла.

86.Включайте в инструкцию цикла for только управляющие циклом конструкции. Избегайте побочных вычислений.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

sum = 0;

for (int i(0), sum = 0; i < nRows;

for (int i(0); i < nRows; ++i)

++i, ++sum)

{

{

sum += row[i];

sum += row[i];

}

}

 

 

87.Всегда инициализируйте управляющие переменные цикла непосредственно перед циклом.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

bool canMove(true);

bool canMove(true);

...

...

canMove = true

while (canMove)

while (canMove)

{

{

"statements";

"statements";

}

}

 

 

 

bool canMove(true);

 

while (canMove)

 

{

 

"statements";

 

}

 

 

 

88.Избегайте использования цикла do-while.

Цикл do-while сложен для чтения, поскольку при чтении тела цикла условие неизвестно. В большинстве случаев do-while цикл может быть заменен циклом for.

89.Минимизируйте использование инструкций break и continue в циклах. Используйте эти инструкции только для существенного улучшения читабельности (структурированости) исходного кода.

90.Избегайте использования бесконечных циклов.

Бесконечный цикл на самом деле таковым не является, так как содержит в теле условие выхода и инструкцию break. Следовательно условие выхода из цикла может быть вынесено в инструкцию цикла (часто это требует введения дополнительной управляющей циклом переменной).

91.Избегайте сложных условных выражений. При необходимости вводите дополнительные временные логические переменные.

ПРАВИЛЬНО

bool isFinished((elementNo < 0) || (elementNo > maxElement)); bool isRepeatedEntry(elementNo == lastElement);

if (isFinished || isRepeatedEntry)

{

"statements";

}

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 17 из 23

НЕПРАВИЛЬНО

if (((elementNo < 0) || (elementNo > maxElement)) || elementNo == lastElement))

{

"statements";

}

92.Помещайте основную ветвь исполнения в основной блок if инструкции, а для исключительную ветвь в else блок.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

bool isReady(file.read());

bool isReady(file.read());

if (isReady)

if (!isReady)

// Система протоколирования готова.

// Система протоколирования не готова.

{

{

"statements";

// Обработаем отказ.

}

"statements";

else

}

// Система протоколирования не готова.

else

{

// Система протоколирования готова.

// Обработаем отказ.

{

"statements";

"statements";

}

}

 

 

93.Избегайте исполняемых инструкций (в т.ч. присваиваний) в логических выражениях.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

pReport = fopen(fileName, "w");

if (!(pReport = fopen(fileName, "w")))

if (0 != pReport)

{

{

"statements";

"statements";

}

}

 

 

 

94.Избегайте использования операции безусловного перехода goto.

Использование библиотек

95.Отдавайте предпочтения функциям стандартной библиотеки

96.Используйте только безопасные функции

-контролирующие размеры буферов (всегда)

-потокобезопасные (при возможности)

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

strncpy(pRes, pSrc, sizeRes);

strcpy(pRes, pSrc);

 

 

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 18 из 23

Оптимизация

97.Оптимизируйте код только при необходимости.

98.Избегайте заведомой пессимизации.

99.Избегайте создания временных объектов и ненужных копирований. 100.Избегайте передачи объектов по значению, а не по ссылке или указателю.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

bool find(const CBookShelf& books);

bool find(CBookShelf books);

 

 

101.Используйте префиксную форму инкремента и декремента. Постфиксную форму используйте только в том случае, если вам нужно начальное значение объекта.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

++i;

i++;

 

 

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

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

a += b

a = a + b

 

 

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 19 из 23

ООП (часть 2)

Операторы

103.Сохраняйте семантику операторов.

104.Запрещается перегружать операторы '&' и ','.

105.Избегайте пользовательских операторов приведения к типу.

106.Для автономных версий операторов a@b всегда предоставляйте присваивающую версию @= 107.Присваивайте значения всем членам класса в operator=.

Классы

108.Пишите имена классов в смешанном регистре начиная с символа 'C' верхнего регистра. 109.Соблюдайте следующий порядок секций в объявлении класса.

ШАБЛОН

class СSomeClass

{

public:

protected:

private:

};

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

ШАБЛОН

class

СSomeClass

:

public "FirstBaseClassName"

,

private "SecondBaseClassName"

 

 

 

 

 

ПРИМЕР

 

 

class

СSomeClass

:

public CPublicBase

,

private CPrivateBase

 

 

111.В реализации конструктора обязательно инициализируйте все члены класса через список инициализации (в порядке их определения в классе).

ПРИМЕР

СSomeClass::СSomeClass() : m_size()

,m_weight()

,m_name()

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

M101 (Правила кодирования,Полевой Д.В.)

05.02.10

стр. 20 из 23

112.В объявлении класса всегда явно указывайте тип доступа.

 

 

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

 

 

 

class CIndex

 

class CIndex

 

{

 

{

 

public:

 

int m_start;

 

int

next();

int m_finish;

 

private:

 

public:

 

int

m_start;

int next();

 

int

m_finish;

};

 

};

 

 

 

 

 

 

 

113.Минимизируйте видимость данных класса, все переменные размещайте в private (или protected, если есть обоснованная потребность) секции.

114.Объявляйте каждый класс в собственном заголовочном файле, имя которого совпадает с именем класса.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

// In creportgenerator.h

// In crepgen.h

class CReportGenerator

class CReportGenerator

{

{

public:

//...

CReportGenerator();

};

//...

 

};

 

 

 

115.Используйте префикс m_ для членов структур.

ПРАВИЛЬНО

НЕПРАВИЛЬНО

 

 

struct SSomeData

class SSomeData

{

{

...

...

int m_size;

int size;

};

};

 

 

предложения/пожелания и сообщения об очепятках присылать на oop.misis [тузик] gmail.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]