Правила программирования на С и С++. Главы 1-6
Страница 50. Имена должны быть обычными словами английского языка, описывающими то, что делает функция, аргумент или переменная


 

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

Избегайте аббревиатур; они ухудшают читабельность программ. Некоторые по привычке продолжают использовать аббревиатуры, что приводит к абсурдной практике, типа отбрасывания последней буквы слова или удаления из него всех гласных. Возьмем странно названную функцию UNIX creat(); очевидно, что create() лучше. Я также видел странности типа lnghth вместо length и mt вместо empty.

При этом общепринятые аббревиатуры являются очевидными исключениями. Вот тот минимум из них, которым я пользуюсь сам:

col индекс столбца
cur текущий
i j обобщенные счетчики циклов
max максимум (обычно в качестве префикса или суффикса)
min минимум (обычно в качестве префикса или суффикса)
obj обобщенный объект (имеется указатель на базовый класс, но производный класс не известен)
p ptr обобщенный указатель
s str строка (в языке С обычно char*)
но не употребляйте их, если называемый объект используется не как обобщенный. Например, i имеет смысл использовать в качестве счетчика цикла в операторе for, если этот счетчик используется просто для подсчета числа итераций: for ( i = 10; --i >= 0; ) // нарисовать 10 тире

putchar('-');

Используйте настоящее имя, если вы применяете счетчик для чего-нибудь отличного от счета. Сравните этот код: for ( i = 0; i ? imax; ++i )

for ( j = 0; j ? jmax; ++j )

move_cursor( i,j );со следующим: for ( row = 0; row ? max_row; ++row )

for ( col = 0; col ? max_col; ++col )

move_cursor( row, col );Я также избегаю использовать x и y вместо row и column. Одно из ранее указанных правил рекомендует пропускать программу через систему проверки орфографии. Действительное достоинство этого метода состоит в том, что он побуждает вас использовать в качестве имен обычные слова.

44.1. Не используйте в качестве имен тарабарщину.

Отличный образец такого подхода можно наблюдать в любом предлагаемом Microsoft примере программы, хотя эта проблема ни в коем случае не ограничивается корпорацией Microsoft. Все демонстрационные программы Microsoft Windows включают тип переменной в ее имя. Например, объявление типа:

const char *str;будет сделано следующим образом: LPCSTR lpszstr;Переведите lpszstr как "указатель типа long с именем str на строку, оканчивающуюся 0". На самом деле здесь несколько проблем, не последней из которых является тот факт, что LPCSTR скрывает наше объявление указателя. Тем не менее обсуждаемое правило посвящается проблеме самого имени.

Этот стиль выбора имен называется "венгерской" записью по названию родины руководителя отдела программирования Microsoft Чарльза Саймони, который его изобрел. (А не потому, что его использование придает программам Microsoft такой вид, как будто они написаны на венгерском языке.)

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

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

Существует и более распространенный, хотя и менее радикальный прием, при котором имена указателей начинают символом 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".

 
« Предыдущая статья