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

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

ГЛАВА 19

Общие вопросы управления

Содержание

19.1. Логические выражения

19.2. Составные операторы (блоки)

19.3. Пустые выражения

19.4. Укрощение опасно глубокой вложенности

19.5. Основа программирования: структурное программирование

19.6. Управляющие структуры и сложность

Связанные темы

Последовательный код: глава 14

Код с условными операторами: глава 15

Код с циклами: глава 16

Нестандартные управляющие структуры: глава 17

Сложность в разработке ПО: подраздел «Главный Технический Императив Разработки ПО: управление сложностью» раздела 5.2

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

19.1. Логические выражения

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



Использование true и false в логических проверках

в логических выражениях следует использовать идентификаторы true и false, а не значения О и 1. Большинство современных языков реализует логический тип данных и предоставляет предопределенные идентификаторы для значений «истина» и «ложь». В таких языках все просто: они даже не позволят вам присвоить логическим переменным другие значения, кроме tme или false. В языках, не содержащих встроенного логического типа, от вас требуется большая дисциплинированность, чтобы сделать логические выражения читабельными. Приведем пример:

Примеры использования неоднозначных флажков для логических значений (Visual Basic)

Dim printerError As Integer Dim reportSelected As Integer Dim summarySelected As Integer

If printerError = 0 Then InitializePrinter() If printerError = 1 Then NotifyUserOfError()

If reportSelected = 1 Then PrintReport() If summarySelected = 1 Then PrintSummary()

If printerError = 0 Then CleanupPrinter()

Если использование флажков О и 1 - общая практика, то чем она плоха? При чтении кода неочевидно, когда выполняются вызовы функций: когда проверки условия истинны или когда они ложны. Ничего в этом фрагменте не говорит о том, представляет ли 1 «истину», а - «ложь» или же все наоборот. Нельзя даже утверждать, что 1 иО служат в качестве значений «истина» и «ложь». Например, в строке If reportSelected = I число / может легко обозначать первый отчет, 2 - второй, 3 - третий; ничто в коде не наводит на мысль, что I означает либо «истину», либо «ложь». Кроме того, легко можно написать О, имея в виду I, и наоборот.

Используйте термины true и false для проверки логических выражений. Если ваш язык не поддерживает их напрямую, создайте их с помощью макросов препроцессора или глобальных переменных. Вот как можно переписать предыдущий пример, используя встроенные идентификаторы True и False языка Visual Basic:

Хорошие, но не превосходные примеры использования True

и False вместо числовых значений для проверок условий (Visual Basic)

Dim printerError As Boolean

Dim reportSelected As ReportType

Dim summarySelected As Boolean

If ( printerError = False ) Then InitializePrinter() If ( printerError - True ) Then NotifyUserOf Error()

If ( reportSelected = ReportType First ) Then PrintReport() If ( summarySelected = True ) Then PrintSummary()

Пвихйесшя ttMuu Еще лучший подход к выполнению тех же проверок можно найти в следующем примере кода.



If ( printerError = False ) Then CleanupPrinter()

Применение констант True и False проясняет назначение кода. Вам не нужно помнить, что обозначают / и О, и вы не сможете их случайно перепутать. Более того, в переписанном коде стало понятно, что в некоторых случаях / и О в исходном примере на Visual Basic не являлись логическими флагами. Выражение If report-Selected = / было не проверкой логического значения, а проверкой того, выбран ли первый отчет.

Этот подход сообщает читателю, что вы выполняете логическую проверку. Кроме того, сложнее написать true, подразумевая false, чем /, подразумевая 0. Также вы избежите распространения магических чисел О w 1 по всему коду. Далее приведены советы по использованию true и false в логических проверках.

Используйте неявное сравнение логических величин с true или false Вы

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

while ( not done ) . .. while ( a > b ) ...

вместо:

while ( done - false ) ... while ( (a > b) = true ) ...

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

Улучшенные примеры неявных проверок True или False (Visual Basic)

Dim printerError As Boolean

Dim reportSelected As ReportType

Dim summarySelected As Boolean

If ( Not printerError ) Then InitializePrinter() If ( printerError ) Then NotifyUserOfError()

If ( reportSelected = ReportType First ) Then PrintReport() If ( summarySelected ) Then PrintSummary()

If ( Not printerError ) Then CleanupPrinter()

ттшаи ееуш 0 mm- " поддерживает логические переменные и чтт перемшух ом. раздел приходится их эмулировать, то, вероятно, вы не смо-

12д жете использовать эту технологию, поскольку искусствен-

ные true и false не всегда могут проверяться в таких выражениях, как 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.0027