Имена
Что в имени? Имя переменной или функции помечает объект и содержит некоторую информацию о его назначении. Имя должно быть информативным, лаконичным, запоминающимся и, по возможности, произносимым. Многое становится ясным из контекста и области видимости переменной: чем больше область видимости, тем более информативным должно быть имя.
Используйте осмысленные имена для глобальных переменных и короткие – для локальных.
Глобальные переменные по определению могут проявиться в любом месте программы, поэтому их имена должны быть достаточно длинными и информативными, чтобы напомнить читателю об их предназначении. Полезно описание каждой глобальной переменной снабжать коротким комментарием:
int npending = 0; // текущая длина очереди ввода
Глобальные функции, классы и структуры также должны иметь осмысленные имена, поясняющие их роль в программе.
Для локальных переменных, наоборот, лучше подходят короткие имена; для использования внутри функции вполне сойдет просто n, неплохо будет смотреться npoints, а вот numberO.f Points будет явным перебором.
Обычно используемые локальные переменные по соглашению могут иметь очень короткие имена. Так, употребление i и j для обозначения счетчиков цикла, р и q для указателей, s и t для строк стало настолько привычным, что применение более длинных имен не принесет никакой пользы, а наоборот, может даже навредить. Сравните:
Бывает, что программисты используют длинные имена независимо от контекста. Это ошибка: ясность часто достигается краткостью.
Существует множество соглашений и местных традиций именования. К наиболее распространенным правилам относятся использование для указателей имен, начинающихся или заканчивающихся на р (от pointer, указатель), например nodep, а также заглавных букв в начале имен Глобальных переменных и всех заглавных – в именах КОНСТАНТ. Некоторые программистские фирмы придерживаются более радикальных правил, таких как отображение в имени переменной информации об ее типе и способе использования. Например, pen будет означать указатель на символьный тип (pointer to char), a strFrom и strTo – строки для ввода и вывода, соответственно. Что же касается собственно написания имен, то использование npending, numPending или num_pending зависит от личных пристрастий, и принципиальной разницы нет. Главное – соблюдать основные смысловые соглашения; все, что не выходит за их рамки, уже не так важно.
Использование соглашений облегчит вам понимание как вашего собственного кода, так и кода, написанного другими программистами. Кроме того, вам будет гораздо проще придумывать имена для новых переменных, появляющихся в программе. Чем больше размер вашего кода, тем важнее использовать информативные, систематизированные имена.
Пространства имен (namespaces) в C++ и пакеты (packages) в Java позволяют разграничивать области видимости переменных и тем самым помогают сохранить ясность кода без использования чрезмерно длинных имен.
Будьте последовательны.
Сходным объектам давайте сходные имена, которые бы показывали их сходство и подчеркивали различия между ними.
Вот пример на языке Java, где имена членов класса не только слишком длинны, но и абсолютно непоследовательны:
Слово "queue" (очередь) используется в названиях как Q, Queue и queue. Однако, поскольку доступ к очереди может быть получен только через переменную типа UserQueue, в именах членов класса упоминание слова "queue" вообще не нужно – все будет понятно из контекста. Так, двойное упоминание очереди избыточно:
? queue .queueCapacity
Класс лучше описать так:
Поскольку выражения вроде:
queue.capacity+++; n=queue.nusers()
Вполне ясны и понятны. Последняя версия тоже еще не идеальна: термины "items" и "users" обозначают одно и то же, так что для одного понятия следовало бы использовать только один термин.