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

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

End Structure

Dim newEmployee As Employee Dim oldEmployee As Employee Dim previousOldEmployee As Employee

Теперь вы можете поменять элементы в старой и новой структуре с помощью трех операторов:

Пример более легкого способа обмена двух групп данных (Visual Basic)

previousOldEmployee = oldEmployee oldEmployee = newEmployee newEmployee = previousOldEmployee

Если вы хотите добавить новое поле, например numWithholdings, вы просто вносите его в объявление Structure. Ни одно из вышеприведенных выражений не потребует никаких изменений. С++ и другие языки также содержат подобные возможности.

Используйте структуры для упрощения списка па йервкршиая ссылка О том как раметров Сократить список параметров метода позволя- распределять данные между ют структурированные переменные. Технология похожа на «етодаи, см. подраздея «Под-только что продемонстрированную. Вместо того чтобы пе- держивайте сопряжение сла-редавать параметры по одному, можно объединить взаимо- " раздела 5.3. связанные элементы в структуру и передать все скопом. Вот пример утомительного способа передачи группы общих параметров:

Пример громоздкого вызова метода, не использующего структуру (Visual Basic)

HardWayRoutine( name, address, phone, ssn, gender, salary )

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

Пример элегантного вызова метода, использующего структуру (Visual Basic)

EasyWayRoutine( employee )

Если вы хотите добавить numWithholdings к первому варианту программы, вам придется прочесать весь код и изменить каждый вызов HardWayRoutineQ- Если же вы добавите элемент к структуре Employee, вам совсем не придется изменять параметры вызова EasyWayRoutineO-

Вы можете довести эту идею до крайности, поместив все . ...

врв1ср00тна» ссмяка ио опас

переменные вашей программы в одну большую, жирную ностях лередачи слишком боль-структуру и передавая ее всюду. Аккуратные программисты щого объема данных см. под-избегают объединения большего количества данных, чем это раздел «Поддержиеайте солря-необходимо логически. Более того, аккуратисты стараются " слабым» раздела 6,3. не передавать параметры в виде структур, если нужны лишь

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



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

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

13.2. Указатели

Использование указателей - одна из наиболее подверженных ошибкам областей программирования. Это привело к тому, что современные языки, такие как Java, С* и Visual Basic, не предоставляют указатель в качестве типа данных. Применять указатели и так сложно, а правильное применение требует от вас отличного понимания того, как ваш компилятор управляет распределением памяти. Многие общие проблемы с безопасностью, особенно случаи переполнения буфера, могут быть сведены к ошибочному использованию указателей. (Howard and LeBlanc, 2003).

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

Парадигма для понимания указателей

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

Область памяти

Область памяти - это адрес, часто представленный в шестнадцатеричном виде. В 32-разрядном процессоре адрес будет 32-битным числом, например 0x0001ЕЛ40. Сам по себе указатель содержит только этот адрес. Чтобы обратиться к данным, на которые этот указатель указывает, надо пойти по этому адресу и как-то интерпретировать содержимое памяти в этой области. Сам по себе этот участок памяти - просто набор битов. Чтобы он обрел смысл, его надо как-то истолковать.



Знание, как интерпретировать содержимое

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

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

Рис. 13-1. содержит несколько представлений одной и той же области памяти, интерпретированной разными способами.

Рассматривается как: Сплошной участок памяти для последующих примеров Интерпретируется как: Интерпретация невозможна без соответствующей переменной-указателя

Рассматривается как: String[10] (в формате Visual Basic с длиной строки в начале) Интерпретируется как: abcdefghij

Рассматривается как: 2-байтное целое Интерпретируется как: 24842

Рассматривается как: 4-байтное число с плавающей запятой Интерпретируется как: 4.17595656202980Е+0021

Рассматривается как: 4-байтное целое Интерпретируется как: 1667391754

Рассматривается как: char

Интерпретируется как: Символ перевода строки (код ASCII OA шестнадцатеричное или 10 десятичное)

Рис. 15-1 Объем памяти, используемый каждым типом данньлх, показан двойной линией

В каждом случае на рис. 13-1 указатель ссылается на область памяти, содержащую шестнадцатеричное значение ОхОА. Количество байт, используемых после OA, зависит от того, как память интерпретируется. Содержимое памяти также зависит от ее интерпретации. (Еще содержимое зависит и от используемого процессора, так что не забудьте об этом, если будете пытаться повторить эти результаты на вашем Сгау-десктопе.) Одна и та же необработанная область памяти может быть представлена как строка, целое число, число с плавающей точкой или иначе - все зависит от основного типа указателя, ссылающегося на эту область памяти.



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.0095