Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Степанов Е.О. -> "Стиль программирования на С++ " -> 12

Стиль программирования на С++ - Степанов Е.О.

Степанов Е.О., Чириков С.В. Стиль программирования на С++ — Спб.: ГИТМО, 2001. — 48 c.
Скачать (прямая ссылка): stilprogrammivaniya2001.pdf
Предыдущая << 1 .. 6 7 8 9 10 11 < 12 > 13 .. 14 >> Следующая


• Размеры данных базовых типов (int, float, double, char и т.п.) в байтах и в машинных словах могут быть разными у разных компьютеров и в разных операционных системах. Гарантировано только, что размер short не меньше размера int, размер float не меньше размера double и т.п. Размеры данных могут сказаться на обработке двоичных масок. Например, в фрагменте

#define MASK 0177770 // incorrect!

int x;

x &= MASK;

три правых бита целого x будут обнуляться только в случае, если данные типа int занимают 16 бит. Но если размер данных типа int больше 16 бит, то обнуляться будут левые биты x. Поэтому предпочтительнее

#define MASK (~07) // correct!

int x;

x &= MASK;

• По возможности следует вообще избегать использования двоичных масок. Это рудимент "ассемблерного" стиля программирования. Лучше использовать битовые поля.

• Используйте sizeof() для определения размера объектов, в том числе и переменных базовых типов.

• Следует тщательно проверять операции двоичного сдвига. Максимальное число бит, которые могут быть сдвинуты вправо или влево, различается на разных компьютерах и в разных операционных системах.

• Максимальный размер битового поля зависит от размера машинного слова и, следовательно, не является стандартным.

• При работе с объектами разных типов данных (классов) используйте преобразование типа. Особенно важно использовать преобразование типов

38 для указателей.

• Используйте макроопределения #define для задания системозависимых именованных констант.

• Не полагайтесь на внутреннюю кодировку целых и вещественных типов данных. Например, не следует полагаться на использование дополнительного или обратного кода для представления целых типов.

• Не являются стандартными порядок и число байт в машинном слове, число бит в байте (данная константа определена в файле <values.h>).

• Не следует полагаться на конкретные значения основных констант, таких как NULL и EOF. Например, NULL, как правило, является константой 0, но это вовсе не обязательно. Поэтому

if ( lval == NULL ) { ... } лучше, чем

if ( !lval ) { . }

• Символы (char) могут иметь знак. Для повышения мобильности можно использовать явное описание unsigned char или преобразовывать символы перед обработкой к типу unsigned char.

• Нельзя полагаться на конкретную кодировку символов, в том числе на определенную последовательность символов в кодировке. Например,

if ( islower(ch) ) { . } лучше, чем

if ( ch >= 'a' && ch <= 'z' ) { . } так как использует стандартную библиотечную функцию islower(), а не полагается на предположение о последовательности строчных букв в кодировке.

• Для выделения/освобождения памяти лучше использовать new/delete, а не malloc()/free().

7. ПРАВИЛЬНАЯ ОРГАНИЗАЦИЯ ПРОГРАММ

Программа организована правильно, если ее легко читать, модифицировать, эксплуатировать и, следовательно, переносить на другие компьютеры и в другое операционное окружение. Для правильной организации программ имеет смысл придерживаться следующих рекомендаций.

• Все определения, связанные с конкретным компьютером и/или операционной средой, следует оформлять при помощи директивы препроцессора #define и помещать в отдельный заголовочный файл. Туда же следует помещать системозависимые определения типов данных (для этой цели стоит использовать typedef). Стандартные системные определения

39 типов содержатся в <sys/types.h>.

• Для локализации системозависимых программных фрагментов следует использовать директивы условной компиляции и директиву #define. Для локализации системозависимых определений типов данных следует использовать typedef.

• Следует особенно тщательно проверять число и тип аргументов, передаваемых функциям (методам классов). Для мобильного определения функций с переменным числом аргументом используйте средства, описанные в файле <varargs.h>. Тип передаваемых в функцию (метод) аргументов должен соответствовать типу формальных параметров; добиться этого необходимо при помощи приведения типов.

• Стоит активно пользоваться модификатором const применительно к передаваемым в функцию (метод) параметрам для указания того, что эти параметры не могут быть изменены. Например, описание

void func (const SomeClass &); запрещает модификацию переданного по ссылке объекта функцией func. В идеале все ссылочные аргументы функций (методов) должны быть описаны как const.

• Следует тщательно следить за инициализацией указателей и переполнением их значений. Нельзя полагаться на инициализацию переменных (в т.ч. указателей) по умолчанию.

• Имеет смысл пользоваться классом String для работы со строками. Использование char* в качестве синонима String - это потенциально опасный рудимент «чистого» C.

• Не следует описывать тело метода внутри определения класса. Исключения могут составлять очень короткие методы и короткие перегружаемые операторы. Методы, тело которых включено в определение класса, как правило, реализуются компилятором как inline. При необходимости задать inline-метод (функцию) лучше сделать это путем явного объявления.
Предыдущая << 1 .. 6 7 8 9 10 11 < 12 > 13 .. 14 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100