{lang: ‘ru’}

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

1. На первом месте будут отступы по горизонтали.  Для чего же нужны отступы? Чтобы лучше понять, давайте рассмотрим это на примере.

Внимательно посмотрите на код и отметьте то, что Вам не понравилось.

//Сортируем пузырьком строки двумерного массива
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
void printMatrix(int[][10], const int);
using namespace std;
int main()
{
const int SIZE = 10;
int matrix[SIZE][SIZE];
int temp;
srand(time(NULL));
//заполняем массив случайным образом
for(int i = 0; i < SIZE; i++)
for(int j = 0; j < SIZE; j++)
matrix[i][j] = 1 + rand() % 100;
//сортируем пузырьком
for(int N = 1; N < SIZE * SIZE; N++)
{
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE - 1; j++)
{
if(matrix[i][j + 1] < matrix[i][j])
{
temp = matrix[i][j + 1];
matrix[i][j + 1] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
}
printMatrix(matrix, SIZE);
return 0;
}
//печать массива
void printMatrix(int mx[][12], const int SIZE)
{
for(int i = 0; i < SIZE; i++)
{
cout << endl;
for(int j = 0; j < SIZE; j++)
cout << setw(4) << mx[i][j];
cout << endl;
}
}

И как Вам такой вид программы? Лично меня такое оформление исходного кода не располагает к его изучению, потому что его очень тяжело читать. А все из-за того, что нет отступов.  Теперь рассмотрим форматированный код.

//Сортируем пузырьком строки двумерного массива

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>

void printMatrix(int[][10], const int);

using namespace std;

int main()
{
    const int SIZE = 10;
    int matrix[SIZE][SIZE];
    int temp;
    srand(time(NULL));

    //заполняем массив случайным образом
    for(int i = 0; i < SIZE; i++)
   		for(int j = 0; j < SIZE; j++)
   			matrix[i][j] = 1 + rand() % 100;

	//сортируем пузырьком
   	for(int N = 1; N < SIZE * SIZE; N++)
   	{
   		for(int i = 0; i < SIZE; i++)
   		{
   			for(int j = 0; j < SIZE - 1; j++)
   			{
   				if(matrix[i][j + 1] < matrix[i][j])
   				{
                   temp = matrix[i][j + 1];
                   matrix[i][j + 1] = matrix[i][j];
                   matrix[i][j] = temp;
   				}
   			}
   		}
	}

	printMatrix(matrix, SIZE);

	return 0;
}

//печать массива
void printMatrix(int mx[][12], const int SIZE)
{
   	for(int i = 0; i < SIZE; i++)
   	{
   		cout << endl;

		for(int j = 0; j < SIZE; j++)
   			cout << setw(4) << mx[i][j];

		cout << endl;
    }
}

Этот код более понятен, чем предыдущий, ведь любой блок четко выделяется на фоне остальных. Внимательно изучите, как здесь применяется форматирование и в дальнейшем соблюдайте эти правила. К хорошему тону нужно приучаться сразу  или потом войдет в привычку.

P.S. Чтобы сделать отступ, достаточно нажать клавишу TAB. Если придерживаться стандартов, то 1 отступ = 4 пробелам.

2. На втором месте будут отступы, но уже вертикальные. На предыдущих примерах можно заметить разницу между присутствием и отсутствием. Логические блоки необходимо для большей ясности отделять 1 отступом. Логические блоки могут быть разными: подключение заголовочных файлов, объявление переменных, операторы выбора и циклы, функции и т.д.

3. На третьем месте будут комментарии. При выполнении сложных действий в программе, обязательно нужно комментировать эти участки кода, в первую очередь это нужно для себя, чтобы быстро вспомнить что Вы делали и, собственно говоря, для чего.  Так же нужно не забывать о других программистах, если Вы работает в команде, то комментарии в коде — это самое необходимое.

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

//печать массива
void printMatrix(int mx[][12],const int SIZE)
{
   	for(int i=0;i<SIZE;i++)
   	{
   		cout<<endl;

		for(int j=0;j<SIZE;j++)
   			cout<<setw(4)<<mx[i][j];

		cout<<endl;
   }
}
//печать массива
void printMatrix(int mx[][12], const int SIZE)
{
   	for(int i = 0; i < SIZE; i++)
   	{
   		cout << endl;

		for(int j = 0; j < SIZE; j++)
   			cout << setw(4) << mx[i][j];

		cout << endl;
   }
}

Как Вы могли заметить 2 вариант кода смотрится намного лучше. Одним словом, по стандарту после запятых должен быть пробел, между логическими и арифметическими блоками также.

5.  Теперь перейдем к именованию объектов программы (функций, методов,  классов, переменных и так далее).

Стиль именования

Все имена объектов должны быть обоснованными и должны указывать на то, какую информацию хранит в себе объект.

counter, increment - счетчик
name, lastName - имя, фамилия
phone - телефон
city - город

 

Не стоит именовать объекты транслитом — это плохо. Лучше давать имена объектам на английском. Если это вызывает затруднения, то Вы можете воспользоваться онлайн-переводчиками. Я пользуюсь переводчиком от гугла, в последнее время они неплохо его доработали.

Неправильно — правильно

matrica - matrix
stroka - str
razmer - size
maksimum - maximum, max
parametr - value

Константы  рекомендовано именовать в верхнем регистре.

SIZE, POINT, BOOK

Имена для переменных — это существительные, а для функций — глаголы или глагол и существительное, так как это действие. Примеры функций

playSong()
printArray()
readString()

Методы, которые что-нибудь возвращают, должны начинаться с префикса get (получить), а те, которые задают — set (установить).

getNext();
setNext();

Что такое верблюжья нотация

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

lastName
userName
copyText()
firstTimer
mySecondBook

Что такое венгерская нотация

Венгерская нотация основана на добавлении префиксов к началу имени объекта. Такие префиксы указывают на тип объекта. Эта нотация не является частью стандарта языка и её можно не применять. Ниже Вы увидите пример, как нужно применять венгерскую нотацию.

string sLastName;
int nBook, iMonth;
bool bState;
int* pCell, ptrRow;
class CWocker;
void vPrintMatrix();


Получайте новые статьи блога прямо себе на почту