Главная - Литература

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 [76] 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

Интерпретировать результаты можно примерно так.

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

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

20-24 Вы - эксперт в программировании. Вероятно, на вашей полке уже стоят книги, указанные ниже.

25-29 Вы знаете о типах данных больше, чем я. Может, напишете собственную книгу (пришлите мне экземпляр!)?

30-32 Вы - тщеславный мошенник Термины «удлиненный поток», «ретроактивный синапс» и «цепочка начисления стоимости» не имеют никакого отношения к типам данных - я их выдумал! Прочитайте раздел «Профессиональная честность» в главе 33!

Дополнительные ресурсы

Хорошими источниками информации о типах данных являются следующие книги:

Gormen, Н. Thomas, Charles Е. Leiserson, Ronald L Rivest. Introduction to Algorithms. New York, NY: McGraw Hill. 1990.

Sedgewick, o>tn.Algonthms in C-\-+, Parts 1-4, 3d ed. Boston, MA: Addison-Wesley, 1998. Sedgewick, Robert. Algorithms in C+, Part 5, 3d ed. Boston, MA: Addison-Wesley, 2002.

10.2. Грамотное объявление переменных

ЙОЦШфОШЦ ш\ш о форма этом разделе описаны способы оптимизации объявления

riiMt* переменных. Строго говоря, это не такая уж и крупная за-

ш щтштй дача, и вы могли бы подумать, что она не заслуживает соб-

ртщтшЬУ,аодорш- ственного раздела. И все же создавать переменные прихо-

1щт»т--тШШ дится очень часто, и приобретение правильных привычек

шх» ряэдШ1а 32$ поможет вам сэкономить время и исключить ненужные

разочарования.

Неявные объявления

Некоторые языки поддерживают неявное объявление переменных. Так, если, программируя на Microsoft Visual Basic, вы попытаетесь использовать необъявленную переменную, компилятор может автоматически объявить ее для вас (это зависит от параметров компилятора).

Неявное объявление переменных - одна из самых опасных возможностей языка. Если вы программировали на Visual Basic, то знаете, как жаль времени, потраченного на поиск причины неправильного значения acctNo, если в итоге обнаруживается, что вы по ошибке вызвали переменную acctNum, которая была инициализирована нулем. Если язык не заставляет объявлять переменные, подобную ошибку допустить очень легко.



зовать две переменные там, где предполагается одна, задайте узари сокращений имен см. конвенцию употребления популярных суффиксов в именах подраздел «Обсциб шеты по переменных. Скажем, конвенция может требовать примене- щцштт шт* разрш 1 ния директивы Option Explicit On и суффикса No.

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

10.3. Принципы инициализации переменных

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

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

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

Значение переменной устарело. Когда-то переменной илольтавия, т. тщшт

«Тестирование, основанное на

было присвоено значение, но оно утратило свою акту- щ-щ данных» щтг ttt альность.

Одним частям переменной были присвоены значения, а другим нет.

Последняя причина имеет несколько вариаций. Вы можете инициализировать несколько членов объекта, но не все. Вы можете забыть выделить память и инициализировать «переменную», на которую указывает неинициализированный указатель. При этом на самом деле вы занесете некоторое значение в случайный блок памяти. Им может оказаться область памяти, содержащая данные. Им может ока-

Если язык требует объявления переменных, для столкновения с данной проблемой нужно сделать две ошибки: во-первых, использовать в теле метода и acctNum, и acctNo, ну, а во-вторых, объявить в методе обе эти переменные. Такую ошибку допустить сложнее, что практически устраняет проблему похожих имен переменных. По сути языки, требующие явного объявления переменных, заставляют более внимательно использовать данные, что является одним из важнейших достоинств таких языков. А если язык поддерживает неявные объявления? Несколько советов я привел ниже.

Отключите неявные объявления Некоторые компиляторы позволяют запретить неявные объявления. Например, в Visual Basic для этого служит директива Option Explicit On, которая заставляет объявлять все используемые переменные.

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

Используйте конвенции именования Чтобы не исполь-



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

Ниже описаны способы предотвращения проблем, связанных с инициализацией.

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

Пример инициализации массива при его объявлении (С++)

float studentGradesC MAX STUDENTS ] = { 0.0 };

Перехреошая свьшка Проверка Инициализируйте каждую переменную там, где она

входных параметров является используется в первый раз Visual Basic и некоторые еще одной формой защитного другие языки не позволяют инициализировать переменные программирования (см. главу 8). при их объявлении. В результате код может принимать вид,

при котором сначала выполняется объявление нескольких переменных, а потом эти переменные инициализируются - и то и другое происходит вдали от места фактического использования переменных в первый раз:

ЙПример плохой инициализации переменных (Visual Basic)

объявление всех переменных Dim accountlndex As Integer Dim total As Double Dim done As Boolean

инициализация всех переменных accountlndex = О total =0.0 done = False

использование переменной accountlndex

использование переменной total

использование переменной done While Not done

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 [76] 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294



0.0118