Основные возможности платформы Hexlet не доступны в вашем браузере. Пожалуйста, обновитесь.
Блог Хекслета
Разработка
,

РазработкаИменование в программировании

Что самое трудное в работе программиста? Выдумывать имена для переменных.

Эта шутка пользуется популярностью среди программистов не случайно. Именование, часто становится причиной целых баталий. И действительно, то как мы именуем наши сущности (функции/переменные/константы/классы/модули) имеет большое значение, ведь большую часть времени мы читаем код, а не пишем.

В этой статье я разберу наиболее общие правила, принятые в среде разработчиков. Для примеров будет использоваться javascript, но это не принципиально. Рекомендации подходят для всех.

Нотация

Перед тем как говорить о семантике, давайте посмотрим на синтаксис. Существует несколько популярных нотаций именования:

  • Верблюжья нотация (CamelCase): MyClass
  • Змеиная нотация (snake_case): my_const
  • Шашлычная нотация (kebab-case): my-data
  • Особняком стоит Венгерская нотация

В реальности их гораздо больше, хотя многие вышли из обихода и не употребляются либо употребляются крайне редко (по крайней мере врядли многие помнят COBOL-CASE).

Возникает вопрос, какой выбрать стиль? Ответ очень прост. В каждом конкретном языке программирования существует общепризнанный (часто официальный) стандарт кодирования. Именно он должен являться для вас ориентиром. Про важность стандартов сказано, в том числе мной, уже много, поэтому повторяться не буду. Потратьте время, найдите стандарт для вашего языка и пробегитесь по нему, обычно он лежит на гитхабе и содержит большое количество показательных примеров.

Размер имеет значение

Те, кто сдавал лабораторные по программированию, хорошо помнят, что большинство переменных в них были однобуквенными). Оно и понятно, кода было мало и понимания, собственно, тоже. Интересный факт состоит в том, что в первых языках программирования идентификаторы были таки односимвольными, как обозначения в математики. Первым языком (судя по всему), который начал использовать слова как идентификаторы, был лисп. С тех пор (шестидесятые) утекло много воды и использование однобуквенных идентификаторов в современном мире рассматривается как моветон.

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

Сущность-Действие

Сравните:

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)