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

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

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

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

В следующем примере переменные названы плохо:

Пример неудачного именования переменных (Java)

X = X - хх;

XXX = fido + SalesTax( fido ); X = X + LateFee( x1, x ) + xxx; X = X + Interest( x1, x );

Что происходит в этом фрагменте кода? Что означают имена х1,ххи ххх? А fido? Допустим, кто-то сказал вам, что этот код подсчитывает общую сумму предъявляемого клиенту счета, опираясь на его долг и стоимость новых покупок. Какую переменную вы использовали бы для распечатки общей стоимости только новых покупок?

Взглянув на исправленный вариант того же кода, ответить на этот вопрос куда проще:

Пример удачного именования переменных (Java)

balance = balance - lastPayment;

monthlylotal = newPurchases + SalesTax( newPurchases );

balance = balance + LateFee( customerlD, balance ) + monthlylotal;

balance = balance + Interest( customerlD, balance );

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

Самый важный принцип именования переменных

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

Переменную, представляющую число членов олимпийской команды США, можно было бы назвать numberOfPeopleOnTheUsOlympicTeam. Переменную, представ-



ляющую число мест на стадионе, - numberOfSeatsInTbeStadium. Для хранения максимального числа очков, набранных спортсменами какой-то страны в современной Олимпиаде, можно было бы создать переменную тахтитМитЬеЮРоШ-slnModemOfympics. Переменную, определяющую текущую процентную ставку, лучше было бы назвать rate или interestRate, а не г или х. Думаю, идею вы поняли.

Обратите внимание на две характеристики этих имен. Во-первых, их легко расшифровать. Фактически их не нужно расшифровывать вообще: их можно просто прочитать. Ну, а во-вторых, некоторые имена велики - слишком велики, чтобы быть практичными. Длину имен переменных мы рассмотрим ниже.

Несколько примеров удачных и неудачных имен переменных я привел в табл. 11-1.

Табл. 11-1. Примеры удачных и неудачных имен переменных

Удачные имена, Неудачные имена,

Суть переменной адекватное описание неадекватное описание

Сумма, на которую runningTotal, cbeckTotal written, ct, checks, CHKTTL,

на данный момент x, xl, x2 выписаны чеки

Скорость поезда velocity, trainVelocity, velocitylnMpb velt, v, tv, x, xl,x2, train

Текущая дата currentDate, todaysDate cd, current, c, x, xl,x2, date

Число строк на странице linesPerPage Ipp, lines, I, x, xl, x2

Имена currentDate и todaysDate - хорошие имена, потому что полно и точно описывают идею «текущей даты». Фактически они составлены из слов с очевидным значением. Программисты иногда упускают из виду обычные слова, которые порой приводят к самому простому решению. Имена cd и с неудачны потому, что слишком коротки и «неописательны». Имя current тоже неудачно: оно не говорит, что именно является «текущим». Имя date кажется хорошим, но в итоге оно оказывается плохим, потому что мы имеем в виду не любую дату, а текущую; само по себе имя date об этом не говорит. Имена х, х1 и х2 заведомо неудачны: х традиционно представляет неизвестное количество чего-либо, и, если вы не хотите, чтобы ваши переменные были неизвестными величинами, подумайте о выборе других имен.

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

Ориентация на проблему

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

Запись данных о сотруднике можно было бы назвать inputRec или employeeData. Имя inputRec - компьютерный термин, выражающий идеи ввода данных и записи. Имя employeeData относится к проблемной области, а не к миру компьютеров. В случае битового поля, определяющего статус принтера, имя bitFlag более



компьютеризировано, чем printerReady, г в случае приложения бухгалтерского учета calcVal более компьютеризировано, чем sum.

Оптимальная длина имени переменной

Оптимальная длина имени, наверное, лежит где-то между длинами имен х и maxi-mumNumberOJPointsInModemOlympics. Слишком короткие страдают от недостатка смысла. Проблема с именами вроде х1 iix2 ъ том, что, даже узнав, что такое х, вы ничего не сможете сказать об отношении между х1 и х2. Слишком длинные имена надоедает печатать, к тому же они могут сделать неясной визуальную структуру программы.

Горла, Бенандер и Бенандер обнаружили, что отладка программы требовала меньше всего усилий, если имена переменных состояли в среднем из 10-16 символов (Gorla, Benander, and Benander, 1990). Отладка программ с именами, состоящими в среднем из 8-20 символов, была почти столь же легкой. Это не значит, что следует присваивать всем переменным имена из 9-15 или 10-16 символов, - это значит, что, увидев в своем коде много более коротких имен, вы должны проверить их ясность.

Вопрос адекватности длины имен переменных поясняет табл. 11-2.

Табл. 11-2. Слишком длинные, слишком короткие и оптимальные имена переменных

Слишком длинные имена:

питЬеЮ/Реор1еОпТЬеи501утргсТеат

numbeЮfSeatsInTheStadium

maxtmumNumbe>JPomtsInModemOlympics

Слишком короткие имена:

п, пр, ntm

п, ns, nsisd

т, тр, max, points

То, что надо:

numTeamMembers, teamMemberCount

numSeatsInStadiumj-seatCount

teamPointsMaxrpointsRecord

Имена переменных и область видимости

Всегда ли короткие имена переменных неудачны? Нет, не jfepenjietf. «еыш Ш обпа-всегда. Если вы присваиваете переменной короткое имя, щщтт ей. раздел 10.4. такое как /, сама длина имени говорит о том, что переменная является второстепенной и имеет ограниченную область действия.

Программист, читающий код, сможет догадаться, что использование такой переменной ограничивается несколькими строками кода. Присваивая переменной имя i, вы говорите: «Эта переменная - самый обычный счетчик цикла/индекс массива, не играющий никакой роли вне этих нескольких строк».

У. Дж. Хансен (W. J. Hansen) обнаружил, что более длинные имена лучше присваивать редко используемым или глобальным переменным, а более короткие - локальным переменным или переменным, вызываемым в циклах (Shneiderman, 1980). Однако с короткими именами связано много проблем, и некоторые осмот-



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