Скачать 3 Mb.
|
Содержание ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ, ЧТОБЫ… ВЫСТРЕЛИТЬ СЕБЕ В НОГУ Правила программирования на Си и Си++ Ален И. Голуб Москва 2001 Программисты, инженеры, научные работники, студенты и все, кто работает с Си или Си++! Если вы хотите писать лучший код без блужданий по лабиринтам технической документации, то это краткое, но содержательное руководство является именно тем, что вам нужно. "Веревка достаточной длины, чтобы… выстрелить себе в ногу" предлагает более 100 практических правил, которые вы сможете использовать для создания элегантного, простого в сопровождении кода. А так как книга написана признанным знатоком в этой области, то и вы в ней не заблудитесь. Ален Голуб предлагает необходимый набор пояснений, советов и технических приемов с целью помочь вам полностью использовать возможности этих чрезвычайно мощных языков. Но не бойтесь встретить очередное скучное руководство по программированию. Автору удается сделать изложение столь серьезной темы живым и интересным за счет рассыпанного по тексту юмора и глубокого знания предмета. Голуб рассматривает универсальные правила, форматирование и правильную организацию программ перед тем, как углубиться в такие основополагающие вопросы, как:
Содержание 6 Благодарности 13 Введение 14 Часть 17 Процесс проектирования 17 1. Сущность программирования: без сюрпризов, минимум сцепления и максимум согласованности 19 2. Подавляйте демонов сложности (часть 1) 20 2.1. Не решайте проблем, которых не существует 21 2.2. Решайте конкретную проблему, а не общий случай 21 3. Интерфейс пользователя не должен быть похожим на компьютерную программу (принцип прозрачности) 23 4. Не путайте легкость в изучении с легкостью в использовании 27 5. Производительность может измеряться числом нажатий клавиш 29 6. Если вы не можете сказать это по-английски, то вы не сможете выполнить это и на Си/Си++ 29 6.1. Начинайте с комментариев 32 7. Читайте код 32 7.1. В цехе современных программистов нет места примадоннам 34 8. Разбивайте сложные проблемы на задачи меньшего размера 34 9. Используйте весь язык 35 9.1. Используйте для работы соответствующий инструмент 35 10. Проблема должна быть хорошо продумана перед тем, как она сможет быть решена 36 11. Компьютерное программирование является индустрией обслуживания 37 12. Вовлекайте пользователей в процесс проектирования 38 13. Заказчик всегда прав 38 14. Малое — это прекрасно (большое == медленное) 39 Часть 42 Общие проблемы разработки программ 42 15. Прежде всего, не навреди 43 16. Редактируйте свою программу 43 17. Программа должна быть переписана не менее двух раз 43 18. Нельзя измерять свою производительность числом строк 43 19. Вы не можете программировать в изоляции 44 20. Пустые потери времени 46 21. Пишите программу с учетом сопровождения — вы специалист по сопровождению 47 21.1. Эффективность — часто просто пугало 48 Часть 49 Форматирование и документация 49 22. Программа без комментариев ничего не стоит 51 23. Располагайте программу и документацию вместе 51 24. Комментарии должны быть предложениями 52 25. Пропустите свой исходный тест через систему проверки орфографии 53 26. Комментарий не должен подтверждать очевидное 53 27. Комментарий должен предоставлять только нужную для сопровождения информацию 54 29. Комментарии должны быть выровнены вертикально 57 30. Используйте аккуратные столбцы везде, где можно 61 31. Не располагайте комментариев между именем функции и открывающей скобкой 63 32. Помечайте конец длинного составного оператора чем-нибудь, имеющим смысл 63 33. Располагайте в строке только один оператор 65 34. Указывайте имена аргументов в прототипах функций 67 35. Используйте "предикатную" форму при разбиении длинных выражений 67 36. Подпрограмма должна помещаться на экране 69 37. Нужно обеспечивать возможность распечатки всего текста программы 69 38. Используйте штриховую линию для зрительного разделения подпрограмм 70 39. Пробел — один из наиболее эффективных комментариев 72 40. Используйте отступы в четыре пробела 74 41. Условные операторы выделяются абзацными отступами 76 41.1. Комментарии должны иметь тот же отступ, что и окружающий текст программы 78 42. Выравнивайте скобки вертикально по левой границе 79 43. Используйте скобки, если в условном операторе имеется более, чем одна строка 79 Часть 81 Имена и идентификаторы 81 44. Имена должны быть обычными словами английского языка, описывающими то, что делает функция, аргумент или переменная 82 44.1. Не используйте в качестве имен тарабарщину 83 45. Имена макросов должны записываться ЗАГЛАВНЫМИ_БУКВАМИ 85 45.1. Не используйте заглавных букв для констант перечисления 85 45.2. Не используйте заглавных букв в именах типов, созданных при помощи typedef 85 46. Не пользуйтесь именами из стандарта ANSI Cи 86 47. Не пользуйтесь именами Microsoft 86 48. Избегайте ненужных идентификаторов 88 49. Именованные константы для булевых величин редко необходимы 88 Часть 92 Правила обычного программирования 92 50. Не путайте привычность с читаемостью 93 51. Функция должна делать только одно дело 96 52. Иметь слишком много уровней абстракции или инкапсуляции так же плохо, как и слишком мало 96 53. Функция должна вызываться более одного раза, но… 97 53.1. Код, используемый более одного раза, должен быть помещен в функцию 98 54. Функция должна иметь лишь одну точку выхода 99 54.1. Всегда предусматривайте возврат значения из блока внешнего уровня 100 55. Избегайте дублирования усилий 101 56. Не захламляйте область глобальных имен 102 56.1. Избегайте глобальных идентификаторов 102 56.2. Никогда не требуйте инициализации глобальной переменной при вызове функции 103 56.2.1. Делайте локальные переменные статическими в рекурсивных функциях, если их значения не участвуют в рекурсивном вызове 105 56.3. Используйте счетчик экземпляров объектов вместо инициализирующих функций 106 56.4. Если оператор if завершается оператором return, то не используйте else 107 57. Помещайте более короткий блок условного оператора if/else первым 109 58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции 109 59. Применяйте указатели на функции Си в качестве селекторов 113 60. Избегайте циклов do/while 114 60.1. Никогда не используйте do/while для бесконечного цикла 116 61. В цикле со счетчиком его значение должно по возможности уменьшаться 116 62. Не делайте одно и то же двумя способами одновременно 116 63. Используйте оператор for, если имеются любые два из инициализурующего, условного или инкрементирующего выражений 118 64. То, чего нет в условном выражении, не должно появляться и в других частях оператора for 119 65. Допускайте, что ситуация может измениться в худшую сторону 120 66. Компьютеры не знают математики 121 66.1. Рассчитывайте на невозможное 122 66.2. Всегда проверяйте коды возврата ошибки 123 67. Избегайте явно временных переменных 123 68. Не нужно магических чисел 124 69. Не делайте предположений о размерах 125 70. Опасайтесь приведения типов (спорные вопросы Си) 127 71. Немедленно обрабатывайте особые случаи 130 72. Не старайтесь порадовать lint 131 73. Помещайте код, динамически распределяющий и освобождающий память, в одном и том же месте 132 74. Динамическая память — дорогое удовольствие 134 75. Тестовые подпрограммы не должны быть интерактивными 136 76. Сообщение об ошибке должно подсказывать пользователю, как ее исправить 136 77. Не выводите сообщения об ошибке, если она исправима 137 78. Не используйте системно-зависимых функций для сообщений об ошибках 138 Часть 140 Препроцессор 140 79. Все из одного .h файла должно быть использовано в, по меньшей мере, двух .c файлах 142 80. Используйте вложенные директивы #include 142 81. Вы должны быть всегда способны заменить макрос функцией 144 81.1. Операция ?: не то же самое, что и оператор if/else 151 81.2. Помещайте тело макроса и его аргументы в круглые скобки 152 82. enum и const лучше, чем макрос 153 83. Аргумент параметризированного макроса не должен появляться в правой части более одного раза 154 83.1. Никогда не используйте макросы для символьных констант 155 84. Если все альтернативы отпали, то используйте препроцессор 156 Часть 159 Правила, относящиеся к языку Си 159 85. Подавляйте демонов сложности (часть 2) 160 85.1. Устраняйте беспорядок 160 85.2. Избегайте битовых масок; используйте битовые поля 161 85.3. Не используйте флагов завершения 163 85.4. Рассчитывайте, что ваш читатель знает Си 164 85.5. Не делайте вид, что Си поддерживает булевый тип (#define TRUE) 165 86. Для битового поля размером 1 бит должен быть определен тип unsigned 167 87. Указатели должны указывать на адрес, больший, чем базовый для массива 167 88. Используйте указатели вместо индексов массива 168 89. Избегайте goto, за исключением… 170 Часть 173 Правила программирования на Си++ 173 Часть 8а. Вопросы проектирования и реализации 174 90. Не смешивайте объектно-ориентированное и "структурное" проектирование 174 90.1. Если проект не ориетирован на объекты, то используйте Си 174 91. Рассчитывайте потратить больше времени на проектирование и меньше на разработку 177 92. Библиотеки классов Си++ обычно не могут быть использованы неискушенными пользователями 178 93. Пользуйтесь контрольными таблицами 180 94. Сообщения должны выражать возможности, а не запрашивать информацию 183 95. Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную 184 96. Объект производного класса является объектом базового класса 186 97. Наследование — это процесс добавления полей данных и методов-членов 186 98. Сначала проектируйте объекты 190 99. Затем проектируйте иерархию снизу вверх 190 99.1. Базовые классы должны иметь более одного производного объекта 191 100. Возможности, определенные в базовом классе, должны использоваться всеми производными классами 192 101. Си++ — это не Smalltalk: избегайте общего класса object 192 102. Смешения не должны наследоваться от чего попало 198 103. Смешения должны быть виртуальными базовыми классами 198 104. Инициализируйте виртуальные базовые классы при помощи конструктора, используемого по умолчанию 198 105. Наследование не подходит, если вы никогда не посылаете сообщения базового класса объекту производного класса 200 106. Везде, где можно, предпочитайте включение наследованию 200 107. Используйте закрытые базовые классы лишь когда вы должны обеспечить виртуальные замещения 200 108. Проектируйте структуры данных в последнюю очередь 202 109. Все данные в определении класса должны быть закрытыми 202 110. Никогда не допускайте открытого доступа к закрытым данным 202 110.1. Не пользуйтесь функциями типа get/set (чтения и присваивания значений) 208 111. Откажитесь от выражений языка Си, когда программируете на Си++ 210 112. Проектируйте с учетом наследования 211 112.1. Функция-член должна обычно использовать закрытые поля данных класса 213 113. Используйте константы 214 114. Используйте структуры только тогда, когда все данные открытые и нет функций-членов 215 115. Не размещайте тела функций в определениях классов 216 116. Избегайте перегрузки функций и аргументов, используемых по умолчанию 221 Часть 8б. Проблемы сцепления 224 117. Избегайте дружественных классов 224 118. Наследование — это форма сцепления 225 119. Не портьте область глобальных имен: проблемы Си++ 227 Часть 8в. Ссылки 231 120. Ссылочные аргументы всегда должны быть константами 231 121. Никогда не используйте ссылки в качестве результатов, пользуйтесь указателями 231 122. Не возвращайте ссылки (или указатели) на локальные переменные 236 123. Не возвращайте ссылки на память, выделенную оператором new 237 Часть 8г. Конструкторы, деструкторы и operator=( ) 239 124. Операция operator=( ) должна возвращать ссылку на константу 240 125. Присваивание самому себе должно работать 240 126. Классы, имеющие члены-указатели, должны всегда определять конструктор копии и функцию operator=() 242 127. Если у вас есть доступ к объекту, то он должен быть инициализирован 243 128. Используйте списки инициализации членов 243 129. Исходите из того, что члены и базовые классы инициализируются в случайном порядке 243 130. Конструкторы копий должны использовать списки инициализации членов 245 131. Производные классы должны обычно определять конструктор копии и функцию operator=( ) 246 132. Конструкторы, не предназначенные для преобразования типов, должны иметь два или более аргумента 250 133. Используйте счетчики экземпляров объектов для инициализации на уровне класса 251 134. Избегайте инициализации в два приема 253 135. Суперобложки на Си++ для существующих интерфейсов редко хорошо работают 253 Часть 8д. Виртуальные функции 258 136. Виртуальные функции — это те функции, которые вы не можете написать на уровне базового класса 258 137. Виртуальная функция не является виртуальной, если вызывается из конструктора или деструктора 259 138. Не вызывайте чисто виртуальные функции из конструкторов 264 139. Деструкторы всегда должны быть виртуальными 265 140. Функции базового класса, имеющие то же имя, что и функции производного класса, обычно должны быть виртуальными 266 141. Не делайте функцию виртуальной, если вы не желаете, чтобы производный класс получил контроль над ней 267 142. Защищенные функции обычно должны быть виртуальными 267 143. Опасайтесь приведения типов (спорные вопросы Си++) 269 144. Не вызывайте конструкторов из операции operator=( ) 270 |
![]() |
Основы информатики и вычислительной техники системы программирования Рассматриваются основные понятия языков программирования. Излагаются процедурный и объектный подходы в программировании. Более подробно... |
![]() |
Рабочая программа по курсу «основы Программирования на языке ассемблер» Программа предназначена для обучения основам программирования на языке низкого уровня Ассемблере учащихся средних школ, учреждений... |
![]() |
Конспект лекций доцента и. А. Волковой по курсу «системы программирования» Система программирования – комплекс программных инструментов и библиотек, который поддерживает создание и существование программного... |
![]() |
Практикум на ЭВМ технология программирования в среде С++ Трунов К. В., Рыков В. И. Методы и технологии С++. Технология программирования в среде С++. /Издание Башкирского ун-та. Уфа 2007.... |
![]() |
Гигиенические требования к условиям обучения в общеобразовательных... Настоящие Санитарно-эпидемиологические правила(далее — Санитарные правила) направлены на предотвращение неблагоприятного воздействия... |
![]() |
Среда программирования Visual C++ 0 Общий вид окна Совокупность средств и правил для представления алгоритма в виде пригодном для выполнения вычислительной машиной называется языком... |
![]() |
Обоснование выбора средств и методов разработки На данный момент существует огромное множество языков программирования с помощью которых можно написать данную дипломную работу.... |
![]() |
Учебно-методический комплекс по дисциплине «Технологии программирования» Техническое задание по разработке дизайнерского проекта приложения «умк – учебно-методический комплекс по дисциплине «Технологии... |
![]() |
Создание диалектов языков программирования с использованием грамматических аспектов Такие языки называют диалектами. Диалекты языков программирования встречаются довольно часто: практически каждая субд использует... |
![]() |
Календарно тематическое планирование по литературному чтению 2 класс ... |
Поиск на сайте Главная страница Литература Доклады Рефераты Курсовая работа Лекции |