|
Программирование >> Решение нетривиальных задач
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 )
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |