Теперь, когда вы знаете, как можно называть переменные, давайте поговорим о том, как желательно называть переменные (или функции).
Во-первых, в C++ принято, что имена переменных должны начинаться со строчной буквы. Если имя переменной состоит из одного слова, следует писать его строчными буквами полностью.
int value; // правильно
int Value; // неправильно (должно начинаться со строчной буквы)
int VALUE; // неправильно (должно начинаться со строчной буквы)
int VaLuE; // неправильно (совсем плохо :) )
Чаще всего имена функций также начинаются со строчной буквы (хотя по этому поводу есть некоторые разногласия). Мы будем следовать этому соглашению, поскольку функция main
(которая должна быть во всех программах) начинается со строчной буквы, как и все функции в стандартной библиотеке C++.
Имена идентификаторов, начинающиеся с заглавной буквы, обычно используются для определяемых пользователем типов (таких как структуры, классы и перечисления, о которых мы поговорим позже).
Если имя переменной или функции состоит из нескольких слов, существует два распространенных соглашения: разделение слов подчеркиванием (называемое snake_case
, «змеиная нотация») и написание последующих слов с заглавной буквы (называемое camelCase
, «верблюжья нотация», поскольку заглавные буквы выступают, как горбы на верблюде).
int my_variable_name; // правильно (разделены подчеркиванием / snake_case)
int my_function_name(); // правильно (разделены подчеркиванием / snake_case)
int myVariableName; // правильно (с заглавными буквами / CamelCase)
int myFunctionName(); // правильно (с заглавными буквами / CamelCase)
int my variable name; // неправильно (пробелы не допускаются)
int my function name(); // неправильно (пробелы не допускаются)
int MyVariableName; // допустимо, но неправильно (должно начинаться со строчной буквы)
int MyFunctionName(); // допустимо, но неправильно (должно начинаться со строчной буквы)
В этом руководстве мы обычно будем использовать верблюжью нотацию потому, что ее легче читать (подчеркивание проще ошибочно принять за пробел в плотных блоках кода). Но часто можно увидеть и то, и другое – стандартная библиотека C++ использует подход с подчеркиваниями как для переменных, так и для функций. Иногда вы можете увидеть сочетание двух подходов: подчеркивания, используемые для переменных, и заглавные буквы, используемые для функций.
Стоит отметить, что если вы работаете с чужим кодом, обычно считается, что лучше соответствовать стилю кода, в котором работаете, чем строго следовать соглашениям об именах, изложенным выше.
Лучшая практика
Работая в существующей программе, используйте соглашения этой программы (даже если они не соответствуют современным лучшим практикам). Используйте современные лучшие практики при написании новых программ.
Во-вторых, вам следует избегать именования идентификаторов, начинающихся с подчеркивания, поскольку эти имена обычно зарезервированы для использования ОС, библиотек и/или компилятора.
В-третьих, ваши идентификаторы должны четко указывать, что означает значение, которое они содержат (особенно, если единицы не очевидны). Идентификаторы должны быть названы таким образом, чтобы помочь тем, кто не имеет представления о вашем коде, понять его как можно быстрее. Через 3 месяца, когда вы снова посмотрите на исходный код своей же программы, и уже забыли, как она работает, вы поблагодарите себя за то, что выбрали осмысленные имена переменных.
Однако присвоение тривиальной переменной слишком сложного имени затрудняет общее понимание того, что делает программа, почти так же, как присвоение неадекватного имени широко используемому идентификатору. Поэтому хорошее практическое правило – делать длину идентификатора пропорциональной тому, насколько широко он используется. Идентификатор с тривиальным использованием может иметь короткое имя (например, такое как i
). Идентификатор, который используется более широко (например, функция, которая вызывается из разных мест в программе), должен иметь более длинное и описательное имя (например, вместо open
попробуйте openFileOnDisk
).
int ccount |
Плохо |
Что означает c перед «count»? |
int customerCount |
Хорошо |
Понятно, что мы считаем. |
int i |
Одно из двух |
Хорошо, если использование тривиально, в противном случае – плохо. |
int index |
Одно из двух |
Хорошо, если очевидно, что мы индексируем. |
int totalScore |
Одно из двух |
Хорошо, если оценивается только одна вещь, иначе слишком неоднозначно. |
int _count |
Плохо |
Не начинайте имена с подчеркивания. |
int count |
Одно из двух |
Хорошо, если очевидно, что мы считаем. |
int data |
Плохо |
Какие данные? |
int time |
Плохо |
Это в секундах, минутах или часах? |
int minutesElapsed |
Хорошо |
Описательное имя. |
int value1, value2 |
Одно из двух |
Трудно различить эти две переменные. |
int numApples |
Хорошо |
Описательное имя. |
int monstersKilled |
Хорошо |
Описательное имя. |
int x, y |
Одно из двух |
Хорошо, если использование тривиально, в противном случае – плохо. |
В любом случае избегайте сокращений. Хотя они сокращают время, необходимое для написания кода, они затрудняют чтение кода. Даже если сокращение однозначно, читателю нужно время, чтобы понять, что вы имели в виду. Код читается чаще, чем пишется, время, которое вы сэкономили при написании кода, – это время, которое каждый читатель, включая вас в будущем, потратит на его чтение. Если вы хотите писать код быстрее, воспользуйтесь функцией автодополнения в редакторе.
Наконец, большое значение может иметь уточняющий комментарий. Например, предположим, что мы объявили переменную с именем numberOfChars
, которая должна хранить количество символов во фрагменте текста. Текст «Hello World!» содержит 10, 11 или 12 символов? Это зависит от того, учитываем ли мы пробелы и знаки препинания. Вместо того чтобы называть переменную numberOfCharsIncludingWhitespaceAndPunctuation
, что довольно длинно, правильно размещенный комментарий в строке объявления должен помочь пользователю понять, что это: