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

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

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

В С++ рассмотрите вопрос подстановки маффосов препроцессора вместо операторов &&, и == (но только как последнее средство) Если у вас возникают такие трудности, то можно создать макросы define для логических операций and йоги использовать ЛМ) и OR вместо и . Точно так же очень легко написать =, имея в виду ==. Если вы часто с этим сталкиваетесь, можете создать макрос EQUALS для логического равенства(==).

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

В языке Java учитывайте разницу между а==Ь и a.equals(b) В Java a==b проверяет, ссылаются лиаиЬнг один и тот же объект, тогда как a£quals(b) проверяет, имеют ли объекты одно и то же логическое значение. В общем случае программы на Java должны использовать выражения вроде a.equals(b), а не а==Ь.

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

«Составной оператор» или «блок» - это набор операторов, который с точки зрения управления ходом программы рассматривается как один оператор. Составные операторы создаются с помощью добавления скобок {и / вокруг группы выражений в языках С++, С*, С и Java. Иногда они задаются с помощью ключевых слов команды, как, например. For и Next в Visual Basic.

Пвщ1шаш ишт Многие Пишите обе скобки одновременно Заполняйте внутрен-хттт% щтшщ, щутп- нее содержимое по-сле того, как напишете открывающую ровшые на щйгштт, со- и закрывающую часть блока. Люди часто жалуются, как тя-джат ттт 1Щ шш пар- жело не ошибиться с парными скобками или словами begin-ных клых, квадратных и фи* совершенно излишняя проблема. Если вы пос-

гурных скооок {см. подразд8Л J

«Реда8тиювание» раздала 30.2), ледуете этому совету, у вас никогда больше не будет трудностей в поиске соответствующих пар скобок.

Сначала напишите:

for ( i = 0; i < maxLines; i++ )

Потом:

for ( i = 0; i < maxLines; i++ ) { } И наконец:

for ( i = 0; i < maxLines; i++ ) { Bee что угодно



Это относится ко всем блоковым структурам, включая операторы if, for и while в С++ и Java и сочетания If-Then-Else, For-Next и While-Wend в Visual Basic.

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

Для пояснения ваших намерений используйте блок независимо от того, сколько в нем строк кода: 1 или 20.

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

В С++ допустимо использования пустого оператора, состоящего исключительно из точки с запятой, например:

Пример традиционного пустого выражения (С++)

while ( recordArray.Read( index++ ) != recordArray.EmptyRecord() )

В С++ после while должно следовать выражение, но оно может быть пустым. Отдельная точка с запятой и является пустым оператором. Далее приведены принципы работы с пустыми выражениями в С++:

Привлекайте внимание к пустым выражениям Пус- перекрестная ссылка 8озшж-тые выражения не являются широко распространенными, 0 лучший способ обраШы-поэтому сделайте их очевидными. Один из способов - вы- вать пустые операторы ~ это делить точке с запятой, представляющей собой пустой one- избегать йх (см, подраздел «Из-ратор, отдельную строку Этот подход показан в предыду- g) щем примере. В качестве альтернативы можно использовать пустые скобки, чтобы подчеркнуть это выражение. Приведем два примера:

Примеры выделения пустых выражений (С++)

[- Это один из способов выделить пустое выражение.

->while ( recordArray.Read( index++ ) ) != recordArray.EmptyRecord() ) {} [- Это еще один способ сделать это.

while ( recordArray.Read( index++ ) != recordArray.EmptyRecord() ) {

Создайте для пустых выражений макрос препроцессора или встроенную функцию DoNothingO Это выражение не делает ничего, кроме бесспорного подтверждения того факта, что никакие действия предприниматься не должны. Это похоже на пометку пустых страниц документа фразами «Эта страница намеренно оставлена пустой». На самом деле страница не совсем пустая, но вы знаете, что ничего другого на ней быть не должно.



Вот как создать собственный пустой оператор в С++ с помощью define, (Вы также можете создать ш/ш-функцию, которая дает тот же эффект.)

Пример пустого выражения, выделенного с помощью DoNothlngO (С++)

#define DoNothingO

while ( recordArray. Reacl( index++ ) recordArray. EmptyRecord() ) { DoNothingO;

В дополнение к использованию DoNothingO в пустых циклах while и for можно задействовать ее в несущественных вариантах оператора switch - добавление DoNothingO делает очевидным тот факт, что вариант был рассмотрен и никаких действий предприниматься не должно.

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

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

Пример более очевидного цикла с непустым телом (С++)

RecordType record - recordArray.Read( index ); index++;

while ( record != recordArray.EmptyRecord() ) { record = recordArray.Read( index ); index++;

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

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

Чрезмерные отступы (или «вложенность») осуждаются в компьютерной ли тературе уже на протяжении 25 лет и все еще являются главными обвиняемыми в создании запутанного кода. В работах Ноума Чомски и Джеральда Вейнберга (Noam Chomsky and Gerald Weinberg) высказывалось предположение, что немногие люди способны понять более трех уровней вложенных (Yourdon, 1986а), и многие исследователи рекомендуют избегать вложенности, превышающей три или четыре уровня (Myers, 1976; Магса, 1981; Ledgard and Tauer, 1987а). Глубокая вложенность противоречит описанному в главе 5 Главному Техническому Императиву ПО (управлению сложностью). Это достаточная причина для отказа от глубокой вложенности.



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