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

Курс ПЯВУ 2 сем / Лекции 2 сем / Л№30.Другие директивы препроцессора / Правила и стандарты написания программ

.odt
Скачиваний:
12
Добавлен:
17.04.2015
Размер:
23.43 Кб
Скачать

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

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

1. Первое и, пожалуй, самое важное правило - это отступы, а точнее горизонтальные отступы. У нас в университете даже отказывались принимать листинги программ, в которых нет отступов, либо они сделаны не правильно. Зачем нужны отступы мы рассмотрим на следующем примере

Первым привожу код программы без отступов, оцените его удобство. Программа сортирует строки двумерного массива по возрастанию (каждую строку в отдельности).

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

02.#include <iostream>

03.#include <iomanip>

04.#include <stdlib.h>

05.#include <time.h>

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

07.using namespace std;

08.int main()

09.{

10.const int SIZE = 10;

11.int matrix[SIZE][SIZE];

12.int temp;

13.srand(time(NULL));

14.//заполняем массив случайным образом

15.for(int i = 0; i < SIZE; i++)

16.for(int j = 0; j < SIZE; j++)

17.matrix[i][j] = 1 + rand() % 100;

18.//сортируем пузырьком

19.for(int N = 1; N < SIZE * SIZE; N++)

20.{

21.for(int i = 0; i < SIZE; i++)

22.{

23.for(int j = 0; j < SIZE - 1; j++)

24.{

25.if(matrix[i][j + 1] < matrix[i][j])

26.{

27.temp = matrix[i][j + 1];

28.matrix[i][j + 1] = matrix[i][j];

29.matrix[i][j] = temp;

30.}

31.}

32.}

33.}

34.printMatrix(matrix, SIZE);

35.return 0;

36.}

37.//печать массива

38.void printMatrix(int mx[][12], const int SIZE)

39.{

40.for(int i = 0; i < SIZE; i++)

41.{

42.cout << endl;

43.for(int j = 0; j < SIZE; j++)

44.cout << setw(4) << mx[i][j];

45.cout << endl;

46.}

47.}

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

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

02.

03.#include <iostream>

04.#include <iomanip>

05.#include <stdlib.h>

06.#include <time.h>

07.

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

09.

10.using namespace std;

11.

12. int main()

13. {

14. const int SIZE = 10;

15. int matrix[SIZE][SIZE];

16. int temp;

17. srand(time(NULL));

18.

19. //заполняем массив случайным образом

20. for(int i = 0; i < SIZE; i++)

21. for(int j = 0; j < SIZE; j++)

22. matrix[i][j] = 1 + rand() % 100;

23.

24. //сортируем пузырьком

25. for(int N = 1; N < SIZE * SIZE; N++)

26. {

27. for(int i = 0; i < SIZE; i++)

28. {

29. for(int j = 0; j < SIZE - 1; j++)

30. {

31. if(matrix[i][j + 1] < matrix[i][j])

32. {

33. temp = matrix[i][j + 1];

34. matrix[i][j + 1] = matrix[i][j];

35. matrix[i][j] = temp;

36. }

37. }

38. }

39. }

40.

41. printMatrix(matrix, SIZE);

42.

43. return 0;

44. }

45.

46. //печать массива

47. void printMatrix(int mx[][12], const int SIZE)

48. {

49. for(int i = 0; i < SIZE; i++)

50. {

51. cout << endl;

52.

53. for(int j = 0; j < SIZE; j++)

54 cout << setw(4) << mx[i][j];

55.

56. cout << endl;

57. }

58. }

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

P.S. Отступы делаются с помощью табуляции (клавиша TAB). По стандарту отступ равен 4 пробелам. Посмотреть и изменить настройки можно в настройках редактора вашей среды разработки.

2. Ко второму правилу отнесятся тоже отступы, только уже не горизонтальные, а вертикаль-ные отступы. Разницу между их отсутствием и присутствием также можно рассмотреть на примере предыдущих двух листингов программ. Скажу лишь то, что логические блоки ну-жно для ясности разделять одним вертикальным отступом (т.е. одной пустой строкой). К та-ким логическим блокам можно, к примеру, отнести блок подключения заголовочных файлов, блок объявления переменных, блоки операторов выбора и циклов, функции и так далее.

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

  1. Пробелы в коде. Сравните два кусочка кода ниже, и вы поймете о чем идет речь.

01.//печать массива

02.void printMatrix(int mx[][12],const int SIZE)

03. {

04. for(int i=0;i<SIZE;i++)

05. {

06. cout<<endl;

07.

08. for(int j=0;j<SIZE;j++)

09. cout<<setw(4)<<mx[i][j];

10.

11. cout<<endl;

12. }

13. }

01.//печать массива

02.void printMatrix(int mx[][12], const int SIZE)

03. {

04. for(int i = 0; i < SIZE; i++)

05. {

06. cout << endl;

07.

08 .for(int j = 0; j < SIZE; j++)

09. cout << setw(4) << mx[i][j];

10.

11. cout << endl;

12. }

13. }

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

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

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

Все объекты программы должны быть названы обоснованными именами, говорящими о назначении того или иного объекта.

1.counter, increment – счетчик

2.name, lastName - имя, фамилия

3.phone – телефон

4.city - город

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

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

  1. matrica – matrix

  1. stroka – str

  1. razmer – size

  1. maksimum - maximum, max

5. parametr - value

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

1. SIZE, POINT, BOOK

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

  1. playSong()

  1. printArray()

3. readString()

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

  1. getTime();

  1. setTime();

Верблюжья нотация

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

  1. lastName

  1. userName

  1. copyText()

4. firstTimermySecondBook

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

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

  1. string sLastName;

  1. int nBook, iMonth;

  1. bool bState;

  1. int* pCell, ptrRow;

  1. class CWocker;

6. void vPrintMatrix();