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

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

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

Значение переменной pageCount представляет число отпечатанных страниц, однако, если оно равно -1, произошла ошибка.

ШШ Если значение переменной customerld меньше 500 ООО, оно представляет номер заказчика, больше - вы вычитаете из него 500 ООО для определения номера просроченного счета.

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

Избегайте подобных переменных, имеющих скрытый смысл. Формально это называется «гибридным сопряжением» (hybrid coupling) (Page-Jones, 1988). Переменная разрывается между двумя задачами, а это означает, что для решения одной из задач ее тип не подходит. В одном из наших примеров переменная pageCount в нормальной ситуации определяет число страниц - это целое число. Однако значение -1 указывает на ошибку - целое число работает по совместительству булевой переменной!

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

Убеждайтесь в том, что используются все объявленные пере-jPH менные Использование переменной с множественной целью имеет противоположность: переменную можно не использовать вообще. Кард, Черч и Агрести обнаружили, что наличие неиспользуемых переменных коррелировало с более высоким уровнем ошибок (Card, Church, and Agresti, 1986). Выработайте привычку проверять, что используются все объявленные переменные. Некоторые компиляторы и утилиты (такие как lint) предупреждают о наличии неиспользуемых переменных.

Контрольный список: общие вопросы

ыхршгмт/тг использования данных

I Инициализация переменных

Щщттп ыытг Кть каждом ли методе проверяется корректность входных рольный список вопросов о параметров?

сттфуштк типах даншх □ Переменные объявляются около места их использова-см. в шаве 12, а контрольный ния в первый раз?

список ттш. касающихся □ Инициализировали ли вы переменные при их объявле-ттовшя переменных, - «

в главе 11. Sioe возможно?

□ Если переменные невозможно объявить и инициализировать одновременно, вы инициализировали их около места использования в первый раз?

□ Правильно ли инициализируются счетчики и аккумуляторы? Выполняется ли их повторная инициализация, если она необходима?



□ Осуществляется ли правильная повторная инициализация переменных в коде, который выполняется более одного раза?

□ Код компилируется без предупреждений? (И задали ли вы самый строгий уровень диагностики?)

□ Если язык поддерживает неявные объявления переменных, постарались ли вы предотвратить возможные проблемы?

Другие общие вопросы использования данных

□ Все ли переменные имеют как можно меньшую область видимости?

□ Являются ли обращения к переменным максимально сгруппированными как в плане интервала между обращениями, так и в плане общего времени жизни?

□ Соответствуют ли управляющие структуры типам данных?

□ Все ли объявленные переменные используются?

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

□ Каждая ли переменная имеет одну и только одну цель?

□ Не имеют ли какие-нибудь переменные скрытого смысла?

Ключевые моменты

Неграмотная инициализация данных часто приводит к ошибкам. Описанные в этой главе способы инициализации позволят избежать проблем, связанных с неожиданными первоначальными значениями переменных. Минимизируйте область видимости каждой переменной. Группируйте обращения к переменным. Старайтесь делать переменные локальными для методов или классов. Избегайте глобальных данных.

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

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

Используйте каждую переменную исключительно с одной целью.



ГЛАВА 11

Сила имен переменных

mtp: cc2e.com/1184

Содержание

пл. Общие принципы выбора имен переменных

И И 11 11 И

2. Именование конкретных типов данных

3. Сила конвенций именования

,4. Неформальные конвенции именования

5. Стандартизированные префиксы

6. Грамотное сокращение имен переменных

11.7. Имена, которых следует избегать

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

Имена методов: раздел 7.3

Имена классов: раздел 6.2

Общие принципы использования переменных: глава 10

Размещение объявлений данных: одноименный подраздел раздела 31.5

Документирование переменных: подраздел «Комментирование объявлений данных» раздела 32.5

Несмотря на всю важность выбора удачных имен для эффективного программирования, я не знаю ни одной книги, в которой эта тема обсуждается хотя бы с минимально приемлемым уровнем детальности. Многие авторы посвящают пару абзацев выбору аббревиатур, приводят несколько банальных примеров и ожидают, что вы сами о себе позаботитесь. Я рискую быть обвиненным в противоположном: вы получите настолько подробные сведения об именовании переменных, что никогда не сможете использовать их в полном объеме!

Советы, рассматриваемые в этой главе, касаются преимущественно именования переменных: объектов и элементарных типов данных. Однако их следует учитывать и при именовании классов, пакетов, файлов и других сущностей из мира программирования. Об именовании методов см. также раздел 7.3.



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