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

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

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

Примеры загадочных флагов (С++)

if ( flag ) ...

if ( statusFlag & OxOF ) ...

if ( printFlag == 16 ) ...

if ( computeFlag ==0 ) ...

flag = 0x1; StatusFlag = 0x80; printFlag = 16; computeFlag = 0;

Команды вида statusFlag = 0x80 будет совершенно непонятны, пока вы не поясните в коде или в документации, что такое statusFlag и 0x80. Вот более понятный эквивалентный фрагмент:

Примеры более грамотного использования переменных статуса (С++)

if ( dataReady ) ...

if ( characterlype & PRINTABLE CHAR ) . . .

if ( reportType == ReportType Annual ) . ..

if ( recalcNeeded == True ) ...

dataReady = true;

characterlype = CONTROL CHARACTER; reportType = ReportType Annual; recalcNeeded = false;

Очевидно, что команда characterType = CONTROL CHARACTER выразительнее, чем StatusFlag = 0x80. Аналогично условие tf( reportType == ReportType Annual) понятнее, чем if (printFlag ~ 16). Второй фрагмент показывает, что данный подход применим к перечислениям и предопределенным именованным константам. Вот как с помощью именованных констант и перечислений можно было бы задать используемые в нашем примере значения:

Объявление переменных статуса (С++)

возможные значения переменной CharacterType const int LETTER = 0x01; const int DIGIT = 0x02; const int PUNCTUATION = 0x04; const int LINE DRAW = 0x08;

const int PRINTABLE CHAR = ( LETTER DIGIT PUNCTUATION LINE DRAW );



const int CONTROL CHARACTER = 0x80;

возможные значения переменной ReportType enum ReportType {

ReportType Daily,

ReportType Monthly,

ReportType Quarterly,

ReportType Annual,

ReportType All

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

Именование временных переменных

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

Относитесь к <времеиным* переменным с подозрением Часто значение нужно на некоторое время сохранить. Однако в том или ином смысле временными являются почти все переменные. Называя переменную временной, подумайте, до конца ли вы понимаете ее реальную роль. Рассмотрим пример:

Пример неинформативного имени «временной» переменной (С++)

Вычисление корней квадратного уравнения.

Предполагается, что дискриминант (Ь2-4*а*с) неотрицателен.

temp = sqrt( - 4*а*с );

root[0] = ( -b + temp ) / ( 2 * a );

root[1] = ( -b - temp ) / ( 2 * a );

Значение выражения sqrt( b2 - 4 * сг * c) вполне разумно сохранить в переменной, особенно если учесть, что оно используется позднее. Но имя temp ничего не говорит о роли переменной. Лучше поступить так:

Пример замены «временной» переменной на реальную переменную (С++)

Вычисление корней квадратного уравнения.

Предполагается, что дискриминант (Ь2-4*а*с) неотрицателен.

discriminant = sqrt( b2 - 4*а*с );

root[0] = ( -b + discriminant ) / ( 2 * a );

root[1] = ( -b - discriminant ) / ( 2 * a );

По сути это тот же код, только в нем использована переменная с точным описательным именем.



Именование булевых переменных

Ниже я привел ряд рекомендаций по именованию булевых переменных.

Помните типичные имена булевых переменных Вот некоторые наиболее полезные имена булевых переменных.

done Используйте переменную done как признак завершения цикла или другой операции. Присвойте ей false до выполнения действия и установите ее в true после его завершения.

error Используйте переменную error как признак ошибки. Присвойте ей значение false, если все в порядке, и true в противном случае.

found Используйте переменную found для определения того, обнаружено ли некоторое значение. Установите ее в false, если значение не обнаружено, и в true, как только значение найдено. Используйте переменную found при поиске значения в массиве, идентификатора сотрудника в файле, определенного чека в списке чеков и т. д.

success или ok Используйте переменную success или ok как признак успешного завершения операции. Присвойте ей false, если операция завершилась неудачей, и true, если операция выполнена успешно. Если можете, замените имя success на более определенное, ясно определяющее смысл «успеха». Если под «успехом» понимается завершение обработки данных, можете назвать переменную processingComplete. Если «успех» подразумевает обнаружение конкретного значения, можете использовать переменную found.

Присваивайте булевым переменным имена, подразумевающие значение true или false Имена вроде done и success - хорошие имена булевых переменных, потому что они предполагают использование только значений true или false: что-то может быть или выполнено, или не выполнено, операция может завершиться или успехом, или неудачей. С другой стороны, имена вроде status и sourceFile не годятся, так как при этом значения true или false не имеют ясного смысла. Какой вывод можно сделать, если переменной status задано true? Означает ли это, что что-то имеет статус? Все имеет статус. Означает ли это, что что-то имеет статус «все в порядке»? Означает ли значение false, что никакое действие не было выполнено неверно? Если переменная имеет имя status, ничего определенного на сей счет сказать нельзя.

Поэтому имя status лучше заменить на имя вроде error или statusOK, а имя source-File - на sourceFileAvailable, sourceFileFound или подобное имя, соответствующее сути переменной.

Некоторые программисты любят дополнять имена булевых переменных префиксом is. В результате имя переменной превращается в вопрос: isdone? isError? isFound? isProcessingComplete? Ответ на этот вопрос сразу становится и значением переменной. Достоинство этого подхода в том, что он исключает использование неопределенных имен: вопрос isStatus? не имеет никакого смысла. Однако в то же время он затрудняет чтение логических выражений: например, условие if{ isFound ) менее понятно, чем if {found ).



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