+
+# Шпаргалка наименования
+Давать имена вещам сложно. Давайте сделаем этот процес легче.
+
+## Рекомендации
+* Выберите **одну** конвенцию наименований и придерживайтесь ее. Будь-то `likeThis`, или `like_this`, или как-либо еще, это не столь важно. Что важно, так это консистентность в вашей работе.
+```js
+/* Плохо */
+const pages_count = 5;
+const shouldUpdate = true;
+
+/* Хорошо */
+const pagesCount = 5;
+const shouldUpdate = true;
+
+/* И это хорошо */
+const pages_count = 5;
+const should_update = true;
+```
+* Имя, будь-то переменная, метод, или что-то еще, должно быть *кратким*, *наглядным* и *интуитивно понятным*:
+ * **Краткое**. Имя переменной должно быстро печататься, и, следовательно, запоминаться,
+ * **Наглядное**. Имя переменной должно отражать суть данной переменной в наиболее эффективной и рациональной форме,
+ * **Интуитивно понятное**. Имя переменной должно читаться естественно, как можно ближе к повседневной речи
+```js
+/* Плохо */
+const a = 5; // "a" может означать что угодно
+const isPaginatable = (postsCount > 10); // "Paginatable" читается ужасно неестественно
+const shouldPaginatize = (postsCount > 10); // Выдуманые глаголы это так весело!
+
+/* Хорошо */
+const postsCount = 5;
+const shouldDisplayPagination = (postsCount > 10);
+```
+
+* Имя не должно дублировать контекст переменной, в котором она была оглашена, а также если убрав контекст из имени переменной ее читабельность не ухудшается:
+```js
+class MenuItem {
+ /* Название метода дублирует контекст в котором он объявлен - "...MenuItem..." */
+ handleMenuItemClick = (event) => { ... }
+
+ /* А таким образом метод читается как MenuItem.handleClick() */
+ handleClick = (event) => { ... }
+}
+```
+* Имя должно отражать *ожидаемый* результат:
+```js
+/* Плохо */
+const isEnabled = (itemsCount > 3);
+return ();
+
+/* Хорошо */
+const isDisabled = (itemsCount <= 3);
+return ();
+```
+
+## Схема
+```
+префикс? + действие (A) + высший контекст (HC) + низший контекст (LC)
+```
+Это вовсе не правило, а скорее закономерность, которую достаточно часто можно применить при наименовании переменных.
+
+> Имейте в виду, что порядок контекстов влияет на коренное значение переменной. Например, `shouldUpdateComponent` скорее означает, что *Вы* собираетесь обновить компонент, в то время как `shouldComponentUpdate` говорит о том, что *компонент* обновится сам, а Вы лишь контролируете следует ли ему это сделать.
+Другими словами, высший контекст акцентирует значение переменной.
+
+### Пример
+| Имя | Префикс | Действие | Выс. контекст | Низ. контекст |
+| ---- | ---- | ------ | ------------ | ----------- |
+| `getPost` | | `get` | `Post` | |
+| `getPostData` | | `get` | `Post` | `Data` |
+| `handleClickOutside` | | `handle` | `Click` | `Outside` |
+| `shouldDisplayMessage` | `should` | `Display` | `Message`| |
+
+## Наименование методов
+
+### Действие
+Выбор правильного названия действия может придать дополнительной информативности Вашим методам. С выбора действия обычно хорошо начинать когда даете имена Вашим методам.
+
+#### `get`
+Немедленно получить доступ к данным (напр. упрощенная ссылка на внутренние данные).
+```js
+function getFruitsCount() {
+ return this.fruits.length;
+}
+```
+#### `fetch`
+Запрос данных, который требует времени (напр. асинхронные операции).
+```js
+function fetchPosts(postCount) {
+ return fetch('https://api.dev/posts', { ... });
+}
+```
+
+#### `set`
+Декларативно присвоить переменной `variableA` со значением `valueA` значение `valueB`.
+```js
+const fruits = 0;
+
+function setFruits(nextFruits) {
+ fruits = nextFruits;
+}
+
+setFruits(5); // fruits === 5
+```
+
+#### `reset`
+Вернуть чему-то его первоначальное значение.
+```js
+const initialFruits = 5;
+const fruits = initialFruits;
+setFruits(10); // fruits === 10
+
+function resetFruits() {
+ fruits = initialFruits;
+}
+
+resetFruits(); // fruits === 5
+```
+
+#### `remove`
+Убрать что-то *из* чего-то. Например, если у Вас есть список выбранных фильтров на странице поиска, убирание одного из них это `removeFilter`, а не `deleteFilter` (в английском языке естественно произносится именно первый вариант):
+```js
+const selectedFilters = ['price', 'availability', 'size'];
+
+function removeFilter(filterName) {
+ const filterIndex = selectedFilters.indexOf(filterName);
+ if (filterIndex !== -1) selectedFilters.splice(filterIndex, 1);
+
+ return selectedFilters;
+}
+```
+
+#### `delete`
+Полностью стереть что-то из существования. Представьте, что Вы редактор блога, и Вы решаете удалить одну из Ваших публикаций из CMS. Как только Вы нажмете на сияющую клавишу "Delete", Вы произведете операцию удаления (`deletePost`, а не `removePost`).
+
+#### `compose`
+Создание (композиция) новых данных из уже имеющихся. Скорее всего, применимо в большей степени к строкам.
+```js
+function composePageUrl(pageName, pageId) {
+ return `${pageName.toLowerCase()}-${pageId}`;
+}
+```
+
+#### `handle`
+Обработчик определенного действия. Обычно, используется как callback метод.
+```js
+function handleLinkClick(event) {
+ event.preventDefault();
+ console.log('Clicked a link!');
+}
+
+link.addEventListener('click', handleLinkClick);
+```
+
+## Префиксы
+Префиксы совершенствуют переменные или методы, придавая им дополнительного значения.
+
+#### `is`
+Описывает присущность определенной характеристики или состояния данного конекста.
+```js
+const color = 'blue';
+const isBlue = (color === 'blue'); // характеристика
+const isRemoved = false; // состояние
+
+if (isBlue && !isRemoved) {
+ console.log('Цвет - синий, и он существует!');
+}
+```
+
+#### `min`/`max`
+Обозначает минимальное или максимальное значение. Удобно при описании границ или допустиых лимитов.
+```js
+function PostsList() {
+ this.minPosts = 3;
+ this.maxPosts = 10;
+}
+```
+
+#### `has`
+Описывает принадлежность определенного значение или состояния текущему контексту.
+```js
+/* Плохо */
+const isProductsExist = (productsCount > 0);
+const areProductsPresent = (productsCount > 0);
+
+/* Хорошо */
+const hasProducts = (productsCount > 0);
+```
+
+#### `should`
+Отражает условное утверждение (возвращает значение `Boolean`).
+```js
+const currentUrl = 'https://dev.com';
+
+function shouldUpdateUrl(url) {
+ return (url !== currentUrl);
+}
+```