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

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

Листинг 31-19. Пример применения begin и end в качестве границ блока switch/case (С++)

switch ( pixelColor ) {

case Color Recl: statementi; statement2;

break; case Color Green: statementi; statement2;

break; default:

statementi; statement2;

break;

Такой стиль выравнивания также вполне функционален и согласуется с Основной теоремой форматирования (напомним: он показывает логическую структуру, лежащую в основе данного кода). Единственное его ограничение в том, что его нельзя применять буквально в операторах switch/case в С++ и Java, что показано в листинге 31-19. (Ключевое слово break служит заменой закрывающей скобке, а у открывающей скобки нет эквивалента.)

Форматирование в конце строки

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

Листинг 31-20. Абстрактный пример стиля форматирования в конце строки

в этом примере оператор А начинает управляющую конструкцию, а оператор D завершает. Операторы В, С и D выровнены под ключевым словом, с которого начинается блок в операторе А. Одинаковые отступы В, С и D показывают, что эти операторы сгруппированы вместе. Листинг 31-21 содержит менее абстрактный пример кода, отформатированного в соответствии с этой стратегией:



Листинг 31-21. Пример форматирования в конце строки в блоке while (Visual Basic)

While ( pixelColor = Color Reci ) statementi; statement2;

Wend

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

Стиль форматирования в конце строки иногда работает вполне удовлетворительно. Листинг 31-22 демонстрирует пример, в котором этот стиль работает:

Листинг 31-22. Редкий пример, в котором форматирование в конце строки выглядит привлекательно (Visual Basic)

If ( soldCount > 1000 ) Then

markdown = 0.10 profit = 0.05

- Ключевое слово else выровнено относительно слова then, расположенного над ним.

-> Else

markdown =0.05 End If

В этом случае ключевые слова ТЪеп, Else и j&wBbipoBHCHbi, и код, следующий за ними, также выровнен. Визуальный эффект соответствует ясной логической структуре.

Критически взглянув на приводимый ранее пример с«5-оператора, вы, вероятно, сможете указать на недостаток данного стиля. По мере усложнения условного выражения этот стиль начнет давать бесполезные или обманчивые подсказки о логической структуре кода. В листинге 31-23 приведен пример ухудшения этого стиля при его применении в более сложном условном выражении:

Листинг 31-23. Более типичный пример, в котором

форматирование в конце строки является неудачным решением (Visual Basic)

If ( soldCount > 10 And prevMonthSales > 10 ) Then If ( soldCount > 100 And prevMonthSales > 10 ) Then If ( soldCount > 1000 ) Then

markdown =0.1 profit = 0.05 Else

markdown =0.05 End If

Else

markdown = 0.025 End If

Else

markdown =0.0 End If



В чем причина причудливого форматирования выражений Else в конце примера? Они последовательно выровнены под соответствующими ключевыми словами, но вряд ли можно утверждать, что такие отступы проясняют логическую структуру И если при модификации кода изменится длина первой строки, такой стиль форматирования потребует изменения отступов во всех соответствующих выражениях. Так что возникает проблема сопровождения, которой не существует для стилей явных блоков, их эмуляции и использования пар begin-end для обозначения границ блоков.

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

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

Какой стиль наилучший?

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

В Java стандартной практикой является применение формата явных блоков.

В С++ можно просто выбрать тот стиль, который вам больше нравится или которому отдают предпочтение большинство разработчиков вашей команды. Как эмуляция явных блоков, так и обозначение границ с помощью begin-end работает одинаково хорошо. Единственное исследование, сравнивавшее эти два стиля, не обнаружило статистически значимых различий между ними с точки зрения понятности кода (Hansen and Yim, 1987).

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

31.4. Форматирование управляющих структур

Щшщтш ttvam О доку- Форматирование некоторых программных элементов час-М0НТйрО8аний упрашющйк является только эстетическим вопросом. Однако форма-структур см. подраздел «Ком- тирование управляющих структур влияет на удобство чте-мшйрО0ание управляющих ния и понимания и поэтому имеет практическое значение, структур» раздша 32.$. О дру-хш гшт% упраашшщих структур см. главы14-19.

Тонкие моменты форматирования блоков управляющих структур

Работа с блоками управляющих структур требует внимания к деталям. Вот некоторые советы.



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