Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_c+.doc
Скачиваний:
18
Добавлен:
04.11.2018
Размер:
464.38 Кб
Скачать

4. Инструкция программиста

Хороший стиль программирования – это залог успеха разработки программы. Мало написать просто текст, необходимо, чтобы он был удобочитаем, понятен для разработчика, снабжен подробными комментариями.

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

4.1. Форматирование текста

Необходимо строго соблюдать два аспекта основного правила отступов:

  • Каждая вложенность операторов должна быть отражена соответствующим количеством отступов. Отступ каждого последующего уровня вложенности – 2 символа. Все уровни вложенности размещаются только с нечетной позиции 1, 3, 5, …;

  • Одинаковые по уровню вложенности операторы должны стоять на одном уровне.

Пример плохого стиля:

for(i=0; i<x; i++){ //вывод элементов

for(j=0; j<y; j++){ //исходной матрицы

printf(" %6d",mat[i][j]);

printf("\n");

}

for(i=0; i<x; i++){ //изменение номера строки

a=b=1;

for(j=2; j<y; j++){ //изменение номера столбца

mat[i][j]=a*mat[i][0]+b*mat[i][1]; //сумирование

temp=a;

a=b;

b+=temp;

}

}

Компилятору все равно, в каком стиле Вы напишите программу – хоть все в одну строку. Однако сами Вы в такой программе вряд ли разберетесь. Да и ошибки могут встретиться в самых неожиданных местах. Если внимательно присмотреться, то они там есть. Избежать их было бы возможно, используя правило отступов:

for(i=0; i<x; i++)

{ // Вывод элементов исходной матрицы

for(j=0; j<y; j++)

printf(" %6d", mat[i][j]);

printf("\n");

}

for(i=0; i<x; i++)

{ // Редактирование матрицы

a=b=1;

for(j=2; j<y; j++)

{

mat[i][j] = a*mat[i][0]+b*mat[i][1];

temp=a;

a=b;

b += temp;

}

}

Объём текста не изменился, но зато можно точно определить, что в выводе элементов исходной матрицы отсутствовала скобка, а перевод каретки должен осуществляться только после завершения цикла по j.

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

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

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

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

Оператор if следует писать в стиле:

if (condition)

{ // Комментарий

// Операторы

}

else

{ // Комментарий

// Операторы

}

Целесообразно написание цепных условий в следующем формате:

if (condition1)

{ // Комментарий

// Операторы

}

else if (condition2)

{ // Комментарий

// Операторы

}

else if (condition3)

{ // Комментарий

// Операторы

}

Оператор while следует писать в стиле:

while (condition)

{ // Комментарий

// Операторы

}

Если тело цикла пустое, то пустой оператор следует писать на следующей строке:

while (*dest++ = *source++)

;

for (; *dest = *source; dest++, *source++)

;

Оператор do… while следует писать в следующем стиле. Размещение слова while на той же строке после скобки подчеркивает, что это продолжение оператора do, а не начало самостоятельного оператора while.

do

{ // Комментарий

// Операторы

} while (condition)

Оператор switch следует писать в стиле:

switch(type)

{ // Образование нового элемента

case _CUT1: // Простой одиночный контакт

// Операторы

breake;

case _TRAN: // Транзистор

// Операторы

breake;

//...

default:

FATSI_("Element: несуществующий тип элемента ", type);

}

Если операторы в каждом случае короткие, то допустимо отводить на каждый case одну строку:

switch(sim)

{ // Преобразование вида транзистора в текстовую строку

case SIMMET : return "Simmetric";

case NI_LEFT : return "Ni+Left";

case NI_RIGHT : return "Ni+Right";

default : return "?";

}

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

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

if (pcomb->y1 <= y2 && y2 <= pcomb->y2 ||

pcomb->y1 <= y1 && y1 <= pcomb->y2)

{ // Частичное включение слева

if (pcomb->y1 <= y2 && y2 <= pcomb->y2)

y2 = pcomb->y1;

if (pcomb->y1 <= y1 && y1 <= pcomb->y2)

y1 = pcomb->y2;

//...

}

Допускается использование пустых строк только для разделения логически законченных блоков. Не стоит увеличивать объём вашей программы пустыми строками – меньше информации поместится на одном экране. Стоящие на отдельных строках фигурные скобки и так зрительно выполняют функцию разделения.

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

Пример плохого стиля:

for(t=0;t<SIZE;t++){temp[t]=0;tekst[t]=0;}

kn=lyto-lwy-1;kk=lyto-lwy+lwp;

if(kn==-1)kn=0;

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

for (t=0; t<SIZE; t++)

{

temp[t]=0;

tekst[t]=0;

}

kn = lyto-lwy-1;

kk = lyto-lwy+lwp;

if(kn==-1)

kn=0;

Рекомендуется также использовать следующий стиль написания выражений:

  • После символов ',' и ';' рекомендуется ставить пробел, перед ними – никогда.

  • Операторы присваивания целесообразно выделять пробелами с двух сторон, кроме самых коротких типа a=b=1;.

  • Унарные операции пишутся слитно с операндами.

  • Бинарные операции (кроме ‘->’, ‘.’, ‘::’, ‘.*’, ‘->*’) с двух сторон выделяются пробелами.

  • Операция '?' пишется с пробелами вокруг ‘?’ и ‘:’.

  • В объявлении переменных знаки ‘*’ и ‘&’ примыкают к типу.