Анимация
JavaScript


Главная  Библионтека 

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

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