Что самое трудное в работе программиста? Выдумывать имена для переменных.
Эта шутка пользуется популярностью среди программистов не случайно. Именование часто становится причиной целых баталий. И действительно, то, как мы именуем наши сущности (функции/переменные/константы/классы/модули), имеет большое значение, ведь большую часть времени мы читаем код, а не пишем его.
В этой статье я разберу наиболее общие правила, принятые в среде разработчиков. Для примеров будет использоваться javascript
, но это не принципиально. Рекомендации подходят для всех.
Нотация
Перед тем, как говорить о семантике, давайте посмотрим на синтаксис. Существует несколько популярных нотаций именования:
- Верблюжья нотация (CamelCase):
myClass
- Змеиная нотация (snake_case):
my_const
- Шашлычная нотация (kebab-case):
my-data
- Особняком стоит Венгерская нотация
В реальности их гораздо больше, хотя многие вышли из обихода и не употребляются, либо употребляются крайне редко (по крайней мере, вряд ли многие помнят COBOL-CASE
).
Возникает вопрос, какой выбрать стиль? Ответ очень прост. В каждом конкретном языке программирования существует общепризнанный — часто официальный — стандарт кодирования. Именно он должен являться для вас ориентиром. Потратьте время, найдите стандарт для вашего языка и пробегитесь по нему, обычно он лежит на гитхабе и содержит большое количество показательных примеров.
Подписывайтесь на канал Кирилла Мокевнина в Telegram — чтобы узнать больше о программировании и профессиональном пути разработчика
Размер имеет значение
Те, кто сдавал лабораторные по программированию, хорошо помнят, что большинство переменных в них были однобуквенными. Интересный факт состоит в том, что в первых языках программирования идентификаторы были таки односимвольными, как обозначения в математике. Первым языком, судя по всему, который начал использовать слова как идентификаторы, был Лисп. С тех пор (шестидесятые) утекло много воды и использование однобуквенных идентификаторов в современном мире рассматривается как моветон.
И все же их можно и нужно использовать в некоторых ситуациях. Обычно это счетчики и индексы.
Сущность-Действие
Сравните:
bed(); // bad
sleep(); // good
Когда мы реализуем функцию, то описываем некоторое действие, а действия в естественных языках выражаются глаголами. Очевидным следствием является то, что имя функции должно быть глаголом. Удивительно, при всей простоте и естественности этого правила, новички часто именуют функции как существительные.
С переменными обычно такой проблемы не возникает, никто не использует глаголы для их именования, но на всякий случай: значение - существительное.
Предикаты
Напомню, что предикат — это функция-проверка, она всегда возвращает либо true
, либо false
.
В большинстве языков предикаты предваряют префиксом is
.
isEmpty();
isValid();
isBusy();
Но не все языки следуют этому правилу. В большинстве лиспов, а так же в ruby
(который взял это из лиспов) используется знак ?
в конце слова:
empty?
valid?
busy?
Если учесть, что в указанных языках вызов функции не требует скобок в конце, то такая форма смотрится особенно естественной.
Вхождение
Не все предикаты можно выразить через is
. Например, как задать вопрос, если мы хотим узнать, есть ли в списке чисел нечетное? В таких ситуациях принято использовать слово has
:
node.hasChildren();
Количество
Если вам нужна переменная, в которой содержится количество чего-либо, используйте комбинацию: сущность во множественном числе + count
.
symbolsCount
peopleCount
Это правило важнее даже в другом варианте, а именно, как не надо называть переменную, обозначающую количество:
errors;
Такое именование гарантированно вводит в заблуждение. Сущность во множественном числе всегда должна обозначать только коллекцию.
Примеры
// Нормализация данных
normalizeDomainName('hexlet.io');
// Извлечение части данных
getName(user);
getDomainFromEmail('support@hexlet.io');
// Получение массива с ошибками
const errors = validate(user);
if (errors.length > 0) {
// ...
}
// Подсчеты
calculateDiff(first, second)
// Допуск
canSwim(user)
canViewProfile(user)
Дополнительные материалы