Анимация
JavaScript
|
Главная Библионтека 57. Помещайте более короткий блок условного оператора if/else первым Часто бывает, что у оператора if/else одно предложение (или внутренний блок) короткое (обычно оператор для обработки ошибки), а другое, выполняющее собственно работу, - большое: if( некая ошибка() ) error( "ААААхххх!!!!" ); else Здесь следуют 3 0 строк кода Всегда помещайте короткое предложение в начале. То есть, не делайте так: if (!некая ошибка() ) Здесь следуют 30 строк кода else error( "ААААхххх!!!!" ); Проблема заключается в том, что проверка в операторе if управляет else в той же степени, что и if. Если большой блок следует первым, то вероятность того, что вычисляться будет предложение else, расположенное на следующем экране или странице, довольно велика. И если я допустил в нем ошибку, то мне придется поломать голову над тем, как добраться до else. Если в это время if в поле зрения, то я знаю, как туда попасть. 58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции Неинициализированные переменные - по сути ошибки, ждущие своего часа. Вы всегда должны инициализировать переменную при ее объявлении. В Си++ инициализация во время объявления возможна всегда, потому что объявление может проводиться везде, где можно поместить оператор; просто откладывайте объявление до тех пор, пока у вас не будет достаточно информации для объявления в произвольном месте с инициализацией переменной. Таким образом, если вы попытаетесь использовать эту переменную преждевременно, то получите ошибку на этапе компиляции ("переменная не найдена") вместо ошибки во время выполнения. В Си вы можете объявлять переменную после любой открытой * Переменная, объявленная в операторе for, не вхживает после этого оператора. Ред. фигурной скобки, поэтому вы можете часто откладывать объявление на некоторое время, но при этом у вас в распоряжении нет гибкости Си++. В самом крайнем случае инициализируйте переменную таким значением, которое в ответ на него понятным образом вызовет в подпрограмме аварию; не присваивайте переменной произвольное значение - оно может быть принято в программе за имеющее смысл. Например, указатель, инициализированный значением NULL, более надежен, чем имеющий произвольное значение, которое может оказаться существующим адресом. С другой стороны, хорошо иметь все объявления переменных в одном месте в начале блоке так, чтобы вы могли их легко найти. Если ваша подпрограмма достаточно мала, то вы обычно можете сделать и то, и другое. Например, вы можете разделить подпрограмму на части для того, чтобы переместить объявления в начало блока, чтобы вам их было легче найти. Подпрограмма, подобная следующей: код, который не использует переменную i int i = init val; код, который использует переменную i может быть разделена следующим образом: код, который не использует переменную i g( init val ); g( int init val ) int i = init val; код, который использует переменную i Переменная-счетчик общего назначения, которая инициализируется в начале цикла for, является очевидным исключением из этого правила*. Иногда использование слишком большого количества подпрограмм может вызвать больше проблем, чем решить их, и в этом случае лучше выбрать внутренние объявления. Используйте свою голову. 59. Применяйте указатели на функции Си в качестве селекторов Это правило строго для программистов на Си. (Программирующие на Си++ должны использовать виртуальные функции). В Си заменяйте подобный код: typedef enum shape type { CIRCLE, LINE, TEXT }; typedef struct shape type type; union shape data { здесь данные для различных форм. } data; } shape; extern void print circle( shape *p ); extern void print line ( shape *p ); extern void print text ( shape *p ); shape a circle = { CIRCLE, ... }; print shape( shape *p ) switch( p->type ) case CIRCLE: print circle( p ); case LINE: print line ( p ); case TEXT: print text ( p ); на следующий: typedef struct void (*print)( struct *shape ); union shape data; { здесь данные для различных фигур. shape; extern void print circle( shape *p ); extern void print line ( shape *p ); extern void print text ( shape *p ); shape a circle = { print circle, ... }; print shape( shape *p ) ( p->type )( p ); 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 |