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

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

Упрощение сложных выражений

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

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

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

Пример проверки сложного условия (Visual Basic)

If ( ( document.AtEndOfSt ream ) And ( Not inputError ) ) And

( ( MIN LINES lineCount ) And ( lineCount <= MAX LINES ) ) And

( Not ErrorProcessing( ) ) Then

Делаем то или иное.

End If

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

Пример сложного условия, помещенного

в логическую функцию и использующего для ясности новые кв!!!!лмГ

промежуточные переменные (Visual Basic) L переменнш J

Function DocumentIsValid( mxwmmt щшт

ByRef documentToCheck As Document, подраздел «йспошуйте доги-

lineCount AS Integer, " "««"««

, ментирования программы» рвз-

inputError As Boolean деяа125

) As Boolean

Dim allDataRead As Boolean Dim legalLineCount As Boolean

- Промежуточные переменные добавлены для упрощения проверки в самой последней строке.

"->[ allDataRead = ( documentToCheck. AtEndOf Stream ) And ( Not inputError )

legalLineCount = ( MIN LINES <= lineCount ) And ( lineCount <= MAX LINES ) DocumentlsValid = allDataRead And legalLineCount And ( Not ErrorProcessing() )

End Function

Здесь предполагается, что ErrorProcessing() - это некоторая логическая функция, определяющая текущее состояние обработки документа. Теперь, когда вы читаете основной ход алгоритма, вам не надо разбираться со сложным условием:



Пример основного хода алгоритма, не содержащего сложное условие (Visual Basic)

If ( DocumentlsValicIC document, lineCount, inputError ) ) Then Делаем то или иное.

End If

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

Иерекршиая тшм Об но* Используйте таблицы решений для замены сложных

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

Составление позитивных логических выражений

- . Не немногие люди не имеют проблем с непониманием не-

коротких неположительных фраз, т. е. большинство людей (Иотвг Simpson) трудности с пониманием большого количества отрицаний. Вы можете предпринять какие-то действия, чтобы избежать кодирования сложных отрицательных логических выражений в программе.

В операторах if заменяйте негативные выражения позитивными, меняя местами блоки if и else Вот пример негативного условия:

Пример сбивающего с толку отрицательного логического условия (Java)

- Здесь оператор отрицания.

L>if ( ! StatusOK ) { Делаем что-то.

else {

Делаем что-то еще.



Это условие можно заменить другим, выраженным положительно:

Пример более понятного логического условия на Java

- Условие в этой строке было заменено на противоположное.

if ( StatusOK ) {

Делаем что-то еще.

- Код в этом блоке был поменян местами...

-> ...

else {

г- ...с кодом в этом блоке.

-> Делаем что-то.

Второй фрагмент кода логически совпадает с первым, но его легче читать, потому что отрицательное выражение было изменено на положительное.

дацйя по составлению положи-1бльиш логичешх еыражешй иногда идет щтрт с р$шт тцШ коррошь нттть-ный тшг а блоке if, а не в блоке 0Ш {т. ртт 15.1). В эюм случае ш нужно весить ирмущеетва Kaxgisro по{хо и решить, какой щтт е ешией ситуации будет наилучшим.

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

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

Пример условия с отрицанием (Java)

if ( IdisplayOK 1 IprinterOK ) ...

Это условие логически эквивалентно следующему:

Пример после применения теорем Деморгана (Java)

if ( !( displayOK && printerOK ) ) ...

В данном случае вам не надо менять местами блоки ifw else - выражения в двух последних фрагментах кода логически эквивалентны. Для применения теорем Деморгана к логическому оператору and или or и паре операндов вы инвертируете оба операнда, меняете местами операторы and и or и инвертируете все выражение целиком. Табл. 19-1 обобщает возможные преобразования в соответствии с теоремами Деморгана.



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