Программирование >>  Решение нетривиальных задач 

1 ... 21 22 23 [ 24 ] 25 26 27 ... 77


57. Помещайте более короткий блок условного оператора if/else первым

Часто бывает, что у оператора if/else одно предложение (или внутренний блок) короткое (обычно оператор для обработки ошибки), а другое, выполняющее собственно работу, - большое:

if( некая ошибка() )

error( ААААхххх!!!! );

else

Здесь следуют 30 строк кода

Всегда помещайте короткое предложение в начале. То есть, не делайте так:

if( !некая ошибка() )

Здесь следуют 30 строк кода

else

error( ААААхххх!!!! );

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

58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции

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



код, который не использует переменную i g( init val );

g( int init val )

int i = init val;

код, который использует переменную i

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

* Переменная, объявленная в операторе for, не вгживает после этого оператора.

- Ред.

В Си вы можете объявлять переменную после любой открытой фигурной скобки, поэтому вы можете часто откладывать объявление на некоторое время, но при этом у вас в распоряжении нет гибкости Си++. В самом крайнем случае инициализируйте переменную таким значением, которое в ответ на него понятным образом вызовет в подпрограмме аварию; не присваивайте переменной произвольное значение - оно может быть принято в программе за имеющее смысл. Например, указатель, инициализированный значением NULL, более надежен, чем имеющий произвольное значение, которое может оказаться существующим адресом.

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

f() {

код, который не использует переменную i int i = init val;

код, который использует переменную i

может быть разделена следующим образом:



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 )



1 ... 21 22 23 [ 24 ] 25 26 27 ... 77

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика