Правила программирования на Си и Си++ Ален И. Голуб




НазваниеПравила программирования на Си и Си++ Ален И. Голуб
страница1/18
Дата01.09.2012
Размер3.01 Mb.
ТипРеферат
  1   2   3   4   5   6   7   8   9   ...   18



Содержание

ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ, ЧТОБЫВЫСТРЕЛИТЬ СЕБЕ В НОГУ

Правила программирования на Си и Си++

Ален И. Голуб

Москва 2001

Программисты, инженеры, научные работники, студенты и все, кто работает с Си или Си++! Если вы хотите писать лучший код без блужданий по лабиринтам технической документации, то это краткое, но содержательное руководство является именно тем, что вам нужно. "Веревка достаточной длины, чтобы выстрелить себе в ногу" предлагает более 100 практических правил, которые вы сможете использовать для создания элегантного, простого в сопровождении кода. А так как книга написана признанным знатоком в этой области, то и вы в ней не заблудитесь.

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

Голуб рассматривает универсальные правила, форматирование и правильную организацию программ перед тем, как углубиться в такие основополагающие вопросы, как:

  • Практические способы организации и написания сопровождаемого кода.

  • Объектно-ориентированное программирование и методы абстракции данных.

  • Как избежать проблем, специфических для Си и Си++.

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

    © Original copyright. McGraw–Hill, 1995

    © Перевод с английского языка. В.Зацепин, 1996

    © Редакция и текст примечаний. В.Базаров, 1998

    © Оформление Интернет–версии. В.Зацепин, 2001



    Посвящается Аманде

    Содержание

Содержание 4

Благодарности 11

Введение 12

Часть 15

Процесс проектирования 15

1. Сущность программирования: без сюрпризов, минимум сцепления и максимум согласованности 16

2. Подавляйте демонов сложности (часть 1) 17

2.1. Не решайте проблем, которых не существует 17

2.2. Решайте конкретную проблему, а не общий случай 17

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

4. Не путайте легкость в изучении с легкостью в использовании 22

5. Производительность может измеряться числом нажатий клавиш 23

6. Если вы не можете сказать это по-английски, то вы не сможете выполнить это и на Си/Си++ 23

6.1. Начинайте с комментариев 25

7. Читайте код 25

7.1. В цехе современных программистов нет места примадоннам 26

8. Разбивайте сложные проблемы на задачи меньшего размера 26

9. Используйте весь язык 26

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

10. Проблема должна быть хорошо продумана перед тем, как она сможет быть решена 27

11. Компьютерное программирование является индустрией обслуживания 28

12. Вовлекайте пользователей в процесс проектирования 29

13. Заказчик всегда прав 29

14. Малое — это прекрасно (большое == медленное) 30

Часть 32

Общие проблемы разработки программ 32

15. Прежде всего, не навреди 33

16. Редактируйте свою программу 33

17. Программа должна быть переписана не менее двух раз 33

18. Нельзя измерять свою производительность числом строк 33

19. Вы не можете программировать в изоляции 34

20. Пустые потери времени 35

21. Пишите программу с учетом сопровождения — вы специалист по сопровождению 36

21.1. Эффективность — часто просто пугало 36

Часть 38

Форматирование и документация 38

22. Программа без комментариев ничего не стоит 39

23. Располагайте программу и документацию вместе 39

24. Комментарии должны быть предложениями 40

25. Пропустите свой исходный тест через систему проверки орфографии 40

26. Комментарий не должен подтверждать очевидное 40

27. Комментарий должен предоставлять только нужную для сопровождения информацию 41

29. Комментарии должны быть выровнены вертикально 44

30. Используйте аккуратные столбцы везде, где можно 47

31. Не располагайте комментариев между именем функции и открывающей скобкой 49

32. Помечайте конец длинного составного оператора чем-нибудь, имеющим смысл 49

33. Располагайте в строке только один оператор 51

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

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

36. Подпрограмма должна помещаться на экране 53

37. Нужно обеспечивать возможность распечатки всего текста программы 53

38. Используйте штриховую линию для зрительного разделения подпрограмм 54

39. Пробел — один из наиболее эффективных комментариев 55

40. Используйте отступы в четыре пробела 56

41. Условные операторы выделяются абзацными отступами 57

41.1. Комментарии должны иметь тот же отступ, что и окружающий текст программы 58

42. Выравнивайте скобки вертикально по левой границе 59

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

Часть 61

Имена и идентификаторы 61

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

44.1. Не используйте в качестве имен тарабарщину 63

45. Имена макросов должны записываться ЗАГЛАВНЫМИ_БУКВАМИ 64

45.1. Не используйте заглавных букв для констант перечисления 64

45.2. Не используйте заглавных букв в именах типов, созданных при помощи typedef 64

46. Не пользуйтесь именами из стандарта ANSI Cи 65

47. Не пользуйтесь именами Microsoft 65

48. Избегайте ненужных идентификаторов 67

49. Именованные константы для булевых величин редко необходимы 67

Часть 71

Правила обычного программирования 71

50. Не путайте привычность с читаемостью 72

51. Функция должна делать только одно дело 74

52. Иметь слишком много уровней абстракции или инкапсуляции так же плохо, как и слишком мало 74

53. Функция должна вызываться более одного раза, но… 75

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

54. Функция должна иметь лишь одну точку выхода 76

54.1. Всегда предусматривайте возврат значения из блока внешнего уровня 77

55. Избегайте дублирования усилий 78

56. Не захламляйте область глобальных имен 79

56.1. Избегайте глобальных идентификаторов 79

56.2. Никогда не требуйте инициализации глобальной переменной при вызове функции 80

56.2.1. Делайте локальные переменные статическими в рекурсивных функциях, если их значения не участвуют в рекурсивном вызове 81

56.3. Используйте счетчик экземпляров объектов вместо инициализирующих функций 82

56.4. Если оператор if завершается оператором return, то не используйте else 83

57. Помещайте более короткий блок условного оператора if/else первым 86

58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции 86

59. Применяйте указатели на функции Си в качестве селекторов 87

60. Избегайте циклов do/while 89

60.1. Никогда не используйте do/while для бесконечного цикла 90

61. В цикле со счетчиком его значение должно по возможности уменьшаться 90

62. Не делайте одно и то же двумя способами одновременно 90

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

64. То, чего нет в условном выражении, не должно появляться и в других частях оператора for 93

65. Допускайте, что ситуация может измениться в худшую сторону 93

66. Компьютеры не знают математики 94

66.1. Рассчитывайте на невозможное 95

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

67. Избегайте явно временных переменных 96

68. Не нужно магических чисел 97

69. Не делайте предположений о размерах 97

70. Опасайтесь приведения типов (спорные вопросы Си) 99

71. Немедленно обрабатывайте особые случаи 101

72. Не старайтесь порадовать lint 103

73. Помещайте код, динамически распределяющий и освобождающий память, в одном и том же месте 104

74. Динамическая память — дорогое удовольствие 105

75. Тестовые подпрограммы не должны быть интерактивными 107

76. Сообщение об ошибке должно подсказывать пользователю, как ее исправить 107

77. Не выводите сообщения об ошибке, если она исправима 108

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

Часть 111

Препроцессор 111

79. Все из одного .h файла должно быть использовано в, по меньшей мере, двух .c файлах 113

80. Используйте вложенные директивы #include 113

81. Вы должны быть всегда способны заменить макрос функцией 115

81.1. Операция ?: не то же самое, что и оператор if/else 121

81.2. Помещайте тело макроса и его аргументы в круглые скобки 122

82. enum и const лучше, чем макрос 123

83. Аргумент параметризированного макроса не должен появляться в правой части более одного раза 124

83.1. Никогда не используйте макросы для символьных констант 125

84. Если все альтернативы отпали, то используйте препроцессор 126

Часть 129

Правила, относящиеся к языку Си 129

85. Подавляйте демонов сложности (часть 2) 130

85.1. Устраняйте беспорядок 130

85.2. Избегайте битовых масок; используйте битовые поля 131

85.3. Не используйте флагов завершения 133

85.4. Рассчитывайте, что ваш читатель знает Си 134

85.5. Не делайте вид, что Си поддерживает булевый тип (#define TRUE) 134

86. Для битового поля размером 1 бит должен быть определен тип unsigned 136

87. Указатели должны указывать на адрес, больший, чем базовый для массива 136

88. Используйте указатели вместо индексов массива 137

89. Избегайте goto, за исключением… 138

Часть 142

Правила программирования на Си++ 142

Часть 8а. Вопросы проектирования и реализации 143

90. Не смешивайте объектно-ориентированное и "структурное" проектирование 143

90.1. Если проект не ориетирован на объекты, то используйте Си 143

91. Рассчитывайте потратить больше времени на проектирование и меньше на разработку 145

92. Библиотеки классов Си++ обычно не могут быть использованы неискушенными пользователями 146

93. Пользуйтесь контрольными таблицами 148

94. Сообщения должны выражать возможности, а не запрашивать информацию 150

95. Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную 150

96. Объект производного класса является объектом базового класса 152

97. Наследование — это процесс добавления полей данных и методов-членов 152

98. Сначала проектируйте объекты 155

99. Затем проектируйте иерархию снизу вверх 155

99.1. Базовые классы должны иметь более одного производного объекта 156

100. Возможности, определенные в базовом классе, должны использоваться всеми производными классами 156

101. Си++ — это не Smalltalk: избегайте общего класса object 156

102. Смешения не должны наследоваться от чего попало 161

103. Смешения должны быть виртуальными базовыми классами 161

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

105. Наследование не подходит, если вы никогда не посылаете сообщения базового класса объекту производного класса 163

106. Везде, где можно, предпочитайте включение наследованию 163

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

108. Проектируйте структуры данных в последнюю очередь 164

109. Все данные в определении класса должны быть закрытыми 164

110. Никогда не допускайте открытого доступа к закрытым данным 165

110.1. Не пользуйтесь функциями типа get/set (чтения и присваивания значений) 169

111. Откажитесь от выражений языка Си, когда программируете на Си++ 171

112. Проектируйте с учетом наследования 172

112.1. Функция-член должна обычно использовать закрытые поля данных класса 173

113. Используйте константы 174

114. Используйте структуры только тогда, когда все данные открытые и нет функций-членов 175

115. Не размещайте тела функций в определениях классов 176

116. Избегайте перегрузки функций и аргументов, используемых по умолчанию 180

Часть 8б. Проблемы сцепления 182

117. Избегайте дружественных классов 182

118. Наследование — это форма сцепления 183

119. Не портьте область глобальных имен: проблемы Си++ 184

Часть 8в. Ссылки 188

120. Ссылочные аргументы всегда должны быть константами 188

121. Никогда не используйте ссылки в качестве результатов, пользуйтесь указателями 188

122. Не возвращайте ссылки (или указатели) на локальные переменные 192

123. Не возвращайте ссылки на память, выделенную оператором new 192

Часть 8г. Конструкторы, деструкторы и operator=( ) 194

124. Операция operator=( ) должна возвращать ссылку на константу 195

125. Присваивание самому себе должно работать 195

126. Классы, имеющие члены-указатели, должны всегда определять конструктор копии и функцию operator=() 196

127. Если у вас есть доступ к объекту, то он должен быть инициализирован 197

128. Используйте списки инициализации членов 197

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

130. Конструкторы копий должны использовать списки инициализации членов 199

131. Производные классы должны обычно определять конструктор копии и функцию operator=( ) 200

132. Конструкторы, не предназначенные для преобразования типов, должны иметь два или более аргумента 203

133. Используйте счетчики экземпляров объектов для инициализации на уровне класса 204

134. Избегайте инициализации в два приема 205

135. Суперобложки на Си++ для существующих интерфейсов редко хорошо работают 205

Часть 8д. Виртуальные функции 210

136. Виртуальные функции — это те функции, которые вы не можете написать на уровне базового класса 210

137. Виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора 211

138. Не вызывайте чисто виртуальные функции из конструкторов 215

139. Деструкторы всегда должны быть виртуальными 215

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

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

142. Защищенные функции обычно должны быть виртуальными 218

143. Опасайтесь приведения типов (спорные вопросы Си++) 219

144. Не вызывайте конструкторов из операции operator=( ) 221

  1   2   3   4   5   6   7   8   9   ...   18

Похожие:

Правила программирования на Си и Си++ Ален И. Голуб iconПрограмма элективного курса для 9 класса Тема: «Начала программирования»
Данный курс направлен на знакомство со средой программирования qbasic и рассматривает основные правила составления программы. Для...
Правила программирования на Си и Си++ Ален И. Голуб iconУрок Развитие языков программирования. Система программирования VisualBasic. Net

Правила программирования на Си и Си++ Ален И. Голуб iconПодготовил Гунько А. В
Предмет Web-программирования. Программирование на стороне клиента и сервера. Инструменты и технологии программирования
Правила программирования на Си и Си++ Ален И. Голуб iconУрок 1, Информатика 11 класс Тема: «Повторение. Способы организации данных в языке программирования»
Работа учащихся за пк в среде программирования Acces по выполнению заданий из контрольного материала
Правила программирования на Си и Си++ Ален И. Голуб iconУсвоить понятие программы, структуры программы на языке Turbo Pascal, научить создавать простые программы на языке программирования Turbo Pascal
Что такое язык программирования? Любая задача, которую решает компьютер, записывается в виде последовательности команд. Такая последовательность...
Правила программирования на Си и Си++ Ален И. Голуб iconПрактика программирования на языке pascal
Высшей Политехнической Школы в Цюрихе. Назван в честь французского математика и философа Блеза Паскаля (1623-1662). Паскаль был создан...
Правила программирования на Си и Си++ Ален И. Голуб iconУчитель информатики маоу сош №35 г. Улан-Удэ учебное пособие улан-Удэ 2010
Бейсику простому, дешевому и легко понимаемому. Паскаль же был аппаратно зависимым, дорогим и сложным в обращении. С появлением Турбо...
Правила программирования на Си и Си++ Ален И. Голуб iconТема урока сабақ тың тақырыбы: Язык программирования. Основы языка Бейсик
В итоге получается текст программы полное, законченное и детальное описание алгоритма на языке программирования. Затем этот текст...
Правила программирования на Си и Си++ Ален И. Голуб iconPhp 5 последнее воплощение php (php: Hypertext Preprocessor) языка программирования, который был первоначально создан в 1994 году Расмусом Лердорфом (Rasmus
Расмусом Лердорфом (Rasmus Lerdorf) для разработки динамических, интерактивных Web-сайтов. С тех пор php благодаря усилиям многих...
Правила программирования на Си и Си++ Ален И. Голуб iconАльянс Франсез Иркутск http :// afrus ru / irkoutsk / ru
Далида, Катрин Денев, Ален Делон, Джейн Биркин Десятки звезд, а также пилоты, стюардессы, пассажиры, сфотографированные во время...
Разместите кнопку на своём сайте:
Руководства



База данных защищена авторским правом ©do.znate.ru 2012
При копировании укажите ссылку
обратиться к администрации
Руководства
Главная страница