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

1 ... 14 15 16 [ 17 ] 18 19 20 ... 77


Существует и более распространенный, хотя и менее радикальный прием, при котором имена указателей начинают символом p. Эта практика тоже загромождает программу. Вы ведь не начинаете имена целочисленных переменных типа int символом i, переменных типа double - d, а функций - f ? Очевидным исключением является случай, когда у вас есть объект и указатель на этот объект в одной и той же области видимости:

char str[128], *pstr = str;

c другой стороны, для указателя, вероятно, лучше содержательное имя. Сравните:

char str[128], *first nonwhite = str; while ( isspace(*first nonwhite) )

++first nonwhite; В этой ситуации имя *first nonwhite говорит вам гораздо больше о том, что делает переменная, чем предыдущее *pstr .

45. Имена макросов должны записываться ЗАГЛАВНЫМИБУКВАМИ

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

45.1. Не используйте заглавных букв для констант перечисления

Должна быть обеспечена возможность замены констант, определенных в перечислении, на переменную типа const. Если ее имя записано заглавными буквами, то вам придется его менять. Кроме того, имеются еще и проблемы с макросами (вскоре будут рассмотрены), которых нет у перечислений. Поэтому будет полезно иметь возможность различать их с первого взгляда.

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

Так как макрос также может использоваться в манере, подобной typedef, то полезно знать может или нет что-то быть использовано в качестве синтаксически правильного типа. Например, имея: typedef void (*ptr to funct)(int );



* В августе 1998 г. стандарт ратифицирован в виде ISO/IEC 14882, Standard for the C++ Programming Language . Популярно изложен в книге: Страуструп Б. Язык программирования С++, 3-е изд. /Пер. с англ.-СПб.; М.: Невский диалект - Издательство БИНОМ , 1999.-991 с. - Прим. перев.

вы можете написать следующее:

(ptr to funct)( p ); преобразует p в указатель на функцию ptr to funct f(long); f возвращает указатель на функцию

Макрос типа:

#define PTR TO FUNCTION void (*) (int )

позволяет вам сделать преобразование:

(PTR TO FUNCTION) ( p );

но не позволяет объявить функцию:

PTR TO FUNCTION f( long);

Указанный макрос при подстановке дает:

void (*) (int ) f(long);

но компилятору нужно:

void (*f(long))(int );

Имя типа из строчных букв не вызовет никаких проблем при чтении, потому что по смыслу вы всегда можете сказать, используется ли оно для типа или нет.

46. Не пользуйтесь именами из стандарта ANSI Cи

Идентификаторы, начинающиеся с символа подчеркивания, и имена типов, оканчивающиеся на t, были зарезервированы стандартом ANSI Си для использования разработчиками компиляторов. Не используйте эти символы. Также избегайте имен функций, вошедших в стандарт ANSI Си и в проект стандарта ISO/ANSI для Си++*.

47. Не пользуйтесь именами Microsoft

Это может показаться правилом, специфичным только для Microsoft, но на самом деле это не так (учитывая имеющуюся склонность Microsoft к мировому господству). Любой, кто заботится о переносимости, должен рассчитывать на то, что его или ее программа со временем может или работать под управлением операционной системы Microsoft, или взаимодействовать с библиотекой классов Microsoft. Библиотека MFC, например, перенесена на Macintosh и во многие операционные среды



UNIX/Motif на момент написания этой книги, и, вероятно, появится на других операционных системах в ближайшем будущем.

На момент написания этой книги интерфейс прикладного программирования Windows (API) включает в себя около 1200 функций. Библиотека MFC, быстро вытесняющая первоначальный интерфейс на языке Си, добавляет около 80 определений классов. К сожалению, метод Microsoft состоит в добавлении каждый раз дополнительных функций и классов в новую версию компилятора. Если Microsoft случайно выберет в качестве имени для функции или класса то, которое вы используете для каких-то других целей, угадайте, кому из вас придется его сменить?

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

Все имена функций Microsoft используют соглашения в стиле Паскаля

о СмесиЗаглавныхИСтрочныхБукв(), и они всегда начинаются с заглавной буквы. Я предпочитаю имена только из строчных букв с символами подчеркивания, но что бы вы ни выбрали, НеИспользуйтеСтильMicrosoft(). Функции-члены в классах MFC используют то же самое соглашение.

Все имена классов Microsoft начинаются с заглавной С с последующей заглавной буквой (например, CString, CWnd, CDialog и т.д.). Начальная С мало что дает, кроме беспорядка, и ее пропуск удаляет нас от области имен Microsoft.

Одна из наиболее фундаментальных заповедей объектно-ориентированного проектирования запрещает оставлять незащищенными данные-члены в определении класса. Тем не менее, многие классы MFC имеют открытые поля данных. Все эти поля начинаются с m , не имеющих другого назначения, кроме как увеличить беспорядок. Тем не менее, мы можем использовать эту бессмыслицу для того, чтобы не начинать имена своих собственных полей с m и таким образом легко отличать свои члены от унаследованных из базовых классов MFC.



1 ... 14 15 16 [ 17 ] 18 19 20 ... 77

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