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

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

else if ( IsPunctuation( inputCharacter ) ) { CharacterType = CharacterType Punctuation;

else if ( IsDigit( inputCharacter ) ) { CharacterType = CharacterType Digit;

- Этот случай наиболее редкий, поэтому проверяем его последним.

->else if ( IsControl( inputCharacter ) ) {

CharacterType = CharacterType ControlCharacter;

Пшс стная «сшка Это так Убедитесь, что учтены все варианты Закодируйте в же хор0ший пртьр того, как последнем блоке else сообщение об ошибке или утвержде-исйояьзовать последователь- ние, чтобы отловить ситуации, которые вы не планирова-ность iNft0fi-$ts$ вместо кода ли. Это сообщение об ошибке предназначено скорее вам, а глубокой вложенности. 06 этой „е пользователю, так что сформулируйте его соответственно, методике см, раздел 19.4. модифицировать пример классификации символов

для выполнения проверки «других вариантов»:

Пример использования варианта по умолчанию для перехвата ошибок (С++)

if ( IsLetter( inputCharacter ) ) {

CharacterType = CharacterType Letter;

else if ( IsPunctuation( inputCharacter ) ) { CharacterType = CharacterType Punctuation;

else if ( IsDigit( inputCharacter ) ) { CharacterType = CharacterType Digit;

else if ( IsControl( inputCharacter ) ) {

CharacterType = CharacterType ControlCharacter;

else {

DisplayInternalError( "Unexpected type of character detected." );

Замените последовательности if-then-else другими конструкциями, которые поддерживает ваш язык программирования Некоторые языки, скажем, Microsoft Visual Basic и Ada, предоставляют операторы case, поддерживающие строки, перечисления и логические функции. Используйте их - они проще в написании и чтении, чем цепочки if-tben-else. Код классификации типов символов, написанный на Visual Basic с помощью оператора case, может выглядеть так:

Пример использования оператора case

вместо последовательности INhen-else (Visual Basic)

Select Case inputCharacter Case "a" To "z"

characterType = CharacterType Letter



Case " ", "!", "(", ")", "?", "-"

characterlype = CharacterType Punctuation Case "О" To "9"

CharacterType = CharacterType Digit Case FIRST CONTROL CHARACTER To LAST CONTROL CHARACTER

CharacterType = CharacterType Control Case Else

DisplayInternalError( "Unexpected type of character detected." ) End Select

15.2. Операторы case

Оператор case или switch - конструкция, сильно варьирующаяся от языка к языку С++ и Java поддерживают case только для порядковых типов, рассматривая по одному значению за раз. Visual Basic поддерживает case для порядковых типов и предоставляет мощные средства для обозначения диапазонов и комбинаций значений. Многие языки сценариев вообще не поддерживают case.

Следующие разделы представляют основные принципы эффективного использования операторов case.

Выбор наиболее эффективного порядка вариантов

Организовать порядок следования вариантов в операторе case можно по-разному Если выражение case невелико и содержит только три варианта и три соответствующих строки кода, то выбранный порядок большого значения не имеет. Однако в случае длинного оператора case (скажем, обрабатывающего десятки различных событий в программе, управляемой событиями) порядок следования достаточно важен. Давайте рассмотрим способы упорядочения.

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

Поместите правильный вариант первым Если у вас есть один корректный вариант и несколько исключений, поместите правильное значение первым. Отметьте в комментариях, что этот вариант является нормальным, а все остальные - исключительными.

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

Советы по использованию операторов case

Далее перечислены советы по применению операторов case.

Перекрестная есмлка Другие

Сделайте обработку каждого варианта простой стш т упрощению кода см. Код, связанный с каждым вариантом, должен быть корот- 8 главе 24.



КИМ. Краткость позволяет сделать структуру оператора case прозрачнее. Если действия, предпринимаемые для какого-то варианта слишком сложны, напишите метод и вызывайте его, а не размещайте весь этот код прямо в блоке case.

Не конструируйте искусственные переменные с целью получить возможность использовать оператор case Оператор case следует применять для простых данных, которые легко разбить на категории. Если ваши данные нельзя назвать простыми, используйте цепочки if-tben-else. Фальшивые переменные сбивают с толки, и их следует избегать. Например, не делайте так:

Пример создания искусственной переменной для оператора case - плохая практика (Java)

action = userCommancl[ О ]; switch ( action ) { case с:

CopyO;

break; case d:

DeleteCharacterO;

break; case f:

FormatO;

break; case h:

HelpO;

break;

default:

HandleUserInputError( ErrorType.InvalidUserCommand );

Переменная action управляет оператором case. В данном случае action конструируется с помощью первого символа строки userCommand, которая вводится пользователем.

11грг»ггт1ии ттт 8 пщш- потенциально опасный код может привести к пробле-

щттттть шщ ceeiy мам. Вообще, если вы фабрикуете специальную переменную

11Ш0 тшт щтть «шга* для case, реальные данные могут не вписываться в данное вы-

Шттщшштштт ражение так, как вы это себе представляете. В приведенном

штшй ащтш хорошо примере, если пользователь набирает сору, в операторе case

JNdHlliOff н130П19Ш1Й 10{М1еН*

НОЙ Ийи <ж(1и«1 ш йодраз* отрезается первый символ «с», и корректно вызывается ме-Й№Ущве1Я1Ш1ШУХШра- тод Сору О- С другой стороны, если пользователь набирает штку раадш 19,1). cement overshoes, clambake или cellulite, case точно также

отрежет символ «с» и вызовет CopyQ- Проверка ошибочных команд в блоке else оператора case не будет нормально функционировать, так как будет обрабатывать только неправильные первые буквы, а не команды целиком.

Вместо создания искусственной переменной в этом коде лучше использовать последовательность if-then-else-if и проверять целую строку. Вот как эффективно переписать код:



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