Привет, Хабр! Решил затронуть тему наименования сущностей в Javascript. По работе довольно много взаимодействую со стажёрами и насмотрелся всякого. Вот и подумал, что было бы неплохо собрать в одной небольшой заметке принятые на сегодняшний день правила наименования сущностей в JavaScript сообществе. Возможно собрал не все, поэтому буду признателен если дополните меня в комментариях.
Именование очень важно в разработке ПО. Как мы знаем, код пишется в первую очередь для людей, которые будут его читать(для программистов). Неудачное именование может существенно повысить трудозатраты на разработку или поддержку проекта из-за того, что будет тратится лишнее время на чтение кода, т.к. при плохом нейминге затруднён процесс интерпретации «что есть что в коде».
Существуют разные синтаксические формы наименования, их очень много, некоторые уже не употребляются. Вот самые употребимые в js:
При выборе кейса важно учитывать принятый на текущий момент стандарт. В js на сегодняшний день snake_case и kebab-case не приняты, но их можно встретить например на Python или Ruby.
В институтах очень часто используют однбуквенные идентификаторы в коде. Я вижу этот стиль кодирования у половины ребят, которые приходят после ВУЗов. Это очень порочная практика. Название должно наглядно описывать сущность. В наше время использовать однобуквенные идентификаторы — признак дурного тона. Исключениями могут быть счётчики и индексы, т.е. ситуации, где и одной буквы более чем достаточно для передачи сути сущности.
Также очень популярно среди студентов использовать транслит. Разумеется это тоже признак дурного тона и плохого кода. Никакого транслита в нейминге быть не должно, т.к. общепринятым языком в программировании является английский. Разрабатывая код мы должны использовать международный язык, который знают профессионалы в любой стране. Русский транслит к таковым не относится.
Переменные именуются в
Классы именуются в
Очень важно для нейминга действий(например, функций) использовать глаголы. Нужно выбирать такой глагол. который соответствует типу действия.
Например:
Также хорошее название
Функции далеко не всегда являются действиями, это тоже важно понимать.
Например,
Эта функция генерирует нам арифметическую прогрессию, но действием не является, т.к. в виду своей декларативности считается определение арифметической прогрессии. Важно уметь различать этот момент. Сюда же относятся функции определяющие константы.
Выше мы обсуждали функцию
Такой тип функций называют предикатами. Предикат — утверждение о чём либо. Так называют функции выполняющиеся проверки «сущность есть что-то». Предикат в программирование всегда возвращает булевое значение.
Как правило предикаты именуются через форму третьего лица единственого числа английского вспомогательного глагола to be, т.е. is.
Некоторые предикаты определяют вхождение(наличие) искомого элемента(свойства или метода или item'a) в сущности. Такие предикаты. как правило начинаются с английского глагола has(3е лицо единственное число глагола to have). Например, безопасная форма
Если сущность представляет собой количество чего-либо, то стоит использовать слово
Именование сущностей
Именование очень важно в разработке ПО. Как мы знаем, код пишется в первую очередь для людей, которые будут его читать(для программистов). Неудачное именование может существенно повысить трудозатраты на разработку или поддержку проекта из-за того, что будет тратится лишнее время на чтение кода, т.к. при плохом нейминге затруднён процесс интерпретации «что есть что в коде».
Существуют разные синтаксические формы наименования, их очень много, некоторые уже не употребляются. Вот самые употребимые в js:
- Верблюжья нотация (CamelCase): MyClass
- Змеиная нотация (snake_case): my_const
- Шашлычная нотация (kebab-case): my-data
При выборе кейса важно учитывать принятый на текущий момент стандарт. В js на сегодняшний день snake_case и kebab-case не приняты, но их можно встретить например на Python или Ruby.
Однобуквенные идентификаторы
В институтах очень часто используют однбуквенные идентификаторы в коде. Я вижу этот стиль кодирования у половины ребят, которые приходят после ВУЗов. Это очень порочная практика. Название должно наглядно описывать сущность. В наше время использовать однобуквенные идентификаторы — признак дурного тона. Исключениями могут быть счётчики и индексы, т.е. ситуации, где и одной буквы более чем достаточно для передачи сути сущности.
Транслит в имени
Также очень популярно среди студентов использовать транслит. Разумеется это тоже признак дурного тона и плохого кода. Никакого транслита в нейминге быть не должно, т.к. общепринятым языком в программировании является английский. Разрабатывая код мы должны использовать международный язык, который знают профессионалы в любой стране. Русский транслит к таковым не относится.
Именование переменных и классов
Переменные именуются в
lower camelCase
:const maxCount = 10;
Классы именуются в
CamelCase
:class EnumerableCollection {
//some code
}
Действия
Очень важно для нейминга действий(например, функций) использовать глаголы. Нужно выбирать такой глагол. который соответствует типу действия.
Например:
const checkNumberIsEven = (number) => (number % 2 === 0);
checkNumberIsEven
— хорошее название. сразу понятно, что функция проверяет число на чётность.Также хорошее название
isEven
— если эта функция лежит в каком — нибудь /helpers/number.js, то даже такого короткого названия более чем достаточно, т.к. сама директория указывает нам на то, что в неё лежат функции по работе с числами.(но даже тут можно использовать первый вариант, т.к. в файле, который использует данную функцию, может быт довольно много кода, а вызов быть где нибудь в середине. )Функции далеко не всегда являются действиями, это тоже важно понимать.
Например,
const arifmeticalProgression = (start, depth, maxLength = 10) => {
const progression = [start];
const iter = (acc) => {
if (acc.length >= maxLength) {
return acc;
}
const newIndex = acc.length;
const newItem = start + newIndex * depth;
const newProgresion = [].concat(acc, newItem);
return iter(newProgresion);
};
return iter(progression);
};
Эта функция генерирует нам арифметическую прогрессию, но действием не является, т.к. в виду своей декларативности считается определение арифметической прогрессии. Важно уметь различать этот момент. Сюда же относятся функции определяющие константы.
const defaultCollection = () => ([]);
Предикаты
Выше мы обсуждали функцию
const checkNumberIsEven = (number) => (number % 2 === 0);
Такой тип функций называют предикатами. Предикат — утверждение о чём либо. Так называют функции выполняющиеся проверки «сущность есть что-то». Предикат в программирование всегда возвращает булевое значение.
Как правило предикаты именуются через форму третьего лица единственого числа английского вспомогательного глагола to be, т.е. is.
const isEven = (number) => (number % 2 === 0);
Некоторые предикаты определяют вхождение(наличие) искомого элемента(свойства или метода или item'a) в сущности. Такие предикаты. как правило начинаются с английского глагола has(3е лицо единственное число глагола to have). Например, безопасная форма
Object.prototype.hasOwnProperty
может выглядеть так:const hasProp = (obj, key) => (Object.prototype.hasOwnProperty.call(obj, key));
Если сущность представляет собой количество чего-либо, то стоит использовать слово
count
в названии.