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

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

Помните о подводных камнях в присваивании явных значений элементам перечисления Некоторые языки позволяют присваивать конкретные значения элементам перечисления:

Пример явного присваивания значений элементам перечисления (С++)

enum Color {

Color InvaliclFirst = О, Color First = 1, Color Recl = 1, Color Green = 2, Color Blue = 4, Color Black = 8, Color Last = 8

Если в этом примере вы объявите переменную цикла типа Color и попробуете пройти по всем элементам Color, то этой переменной наряду с допустимыми значениями 1, 2, 4 и 8 будут присваиваться и недопустимые - 3, 5, 6 и 7.

Г1е1«1фе1т1а11ш ЕСЛИ ВЭШ ЯЗЫК Нб ПОДДерЖИВЭеТ

цьттш атой шш Java не ПврвЧИСЛИМЫе ТИПЫ

поддерживает пщтттт

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

Java:

Пример имитации перечислимых типов (Java)

Создание перечислимого типа Country, class Country {

private CountryO {}

public static final Country China = new CountryO; public static final Country England = new CountryO; public static final Country France = new CountryO; public static final Country Germany = new CountryO; public static final Country India = new CountryO; public static final Country Japan = new CountryO;

Создание перечислимого типа Output.

class Output {

private OutputO {}

public static final Output Screen = new OutputO; public static final Output Printer = new OutputO; public static final Output File = new OutputO;



Такие перечислимые типы делают вашу программу читабельнее, поскольку вы можете использовать открытые члены класса, например. Country,England и Out-putScreen, вместо именованных констант. Именно такой способ создания перечислимых типов еще и обеспечивает безопасность типов, так как каждый тип объявлен как класс и компилятор будет проверять некорректные присваивания вроде Output output = Country.England (Bloch, 2001).

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

12.7. Именованные константы

Именованные константы аналогичны переменным за исключением того, что вы не можете изменить значение константы после ее инициализации. Именованные константы позволяют ссылаться на постоянные величины, например, максимальное количество работников, используя имя, а не чисяо - MAXIMUM EMPLOYEES, а не 1000.

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

Используйте именованные константы в объявлениях данных Именованные константы повышают читабельность и удобство сопровождения объявлений данных и выражений, которым необходимо знать размеры обрабатываемых данных. В следующем примере для описания длины телефонных номеров работников лучше использовать LOCALNUMBERLENGTH, а не число 7.

Хороший пример применения именованных констант в объявлениях данных (Visual Basic)

Const AREA CODE LENGTH = 3

- LOCAL NUMBER LEN GTH здесь объявляется как константа.

->Const LOCAL NUMBER LENGTH = 7

Type PHONE NUMBER

areaCocle( AREA CODE LENGTH ) As String

- A здесь используется.

localNumber( LOCAL NUMBER LENGTH ) As String End Type



Убедимся, что все символы в телефонном номере - это цифры.

- И здесь тоже используется.

->For iDigit = 1 To LOCAL NUMBER LENGTH

If ( phoneNumber.localNumber( iDigit ) < "0" ) Or ( "9" < phoneNumber.localNumber( iDigit ) ) Then Выполняем обработку ошибок.

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

На момент создания программы все работники живут в одной стране, поэтому вам нужно только семь цифр для их телефонных номеров. По мере расширения компании ее филиалы открываются в разных странах, и вам понадобятся более длинные телефонные номера. Если вы параметризовали эту длину, вам надо сделать изменение только в одном месте - в определении именованной константы LOCAL NUMBERLENGTH.

Лопол1И1Ш111111С сишнип о ]д наверное, поняли, именованные константы делают

чши{шгралшшйоту1»* сопровождение программы удобнее. Как правило, любая imm с». Щ. 5М0 в шшь технология, централизующая управление объектами, подвер-1$«Ш»атСап«(Шш, Ш). женными изменениям, - это хороший способ уменьшить

затраты на сопровождение (Glass, 1991).

Избегайте литеральных значений, даже <безопасных Как вы думаете, что

в следующем цикле означает число /2?

Пример непонятного кода (Visual Basic)

For i = 1 To 12

profit( i ) - revenue( i ) - expense( i ) Next

Исходя из специфического содержимого кода, можно предположить, что выполняется цикл по 12 месяцам в году. Но вы уверены? Вы поставите на это свое собрание «Монти Пайтон»?

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

Пример более понятного кода (Visual Basic)

For i = 1 To NUM MONTHS IN YEAR

profit( i ) = revenue( i ) - expense( i ) Next

Это уже лучше, но для завершения примера индекс цикла тоже нужно назвать более информативно:



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