Стиль кода и линтеры
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Код читают во много раз чаще, чем пишут: вы сами через месяц, коллега на ревью, стажёр через год. Разберёмся, какие соглашения об оформлении приняты в JavaScript и как переложить заботу о них на два инструмента — Prettier и ESLint.
Интерпретатору всё равно, как выглядит ваш код: он одинаково выполнит и аккуратную программу, и кашу из символов. Но у кода есть второй получатель — человек. Программу пишут один раз, а читают десятки раз, и почти всегда читает не автор: коллега, ревьюер, вы сами полгода спустя. Стиль кода — это вежливость к читателю.
В команде важен не столько конкретный стиль, сколько его единственность. Когда весь проект оформлен одинаково, глаз перестаёт спотыкаться о запятые и отступы — и видит сразу суть. Именно поэтому споры «два пробела или четыре» в зрелых командах давно закрыты: выбрали один вариант и забыли.
В мире JavaScript сложился набор привычек. Отступ — 2 пробела на уровень вложенности (в Python любят четыре, в JS прижились два). Вокруг операторов — пробелы: a + b, а не a+b. После запятой — тоже пробел.
Фигурные скобки ставят в «египетском» стиле: открывающая — на той же строке, что и if или for, закрывающая — на своей собственной. Имена выбирают по смыслу: переменная — существительное (userAge, а не x), функция — глагол (sendMessage, calcTotal). Если имя честно описывает содержимое, половина комментариев становится не нужна.
Отдельный грех — «магические числа»: голые 3600 или 0.2 посреди кода. Сегодня вы помните, что это, а через месяц число превращается в загадку. Лекарство простое — константа с говорящим именем.
Название шутливое: открывающая скобка в конце строки и отступ на следующей напоминают позу фигур на древнеегипетских рисунках — руки согнуты на разных уровнях. У стиля есть и серьёзное имя — K&R, по инициалам Кернигана и Ритчи, авторов классической книги о языке C, где так оформлены все примеры.
Держать все соглашения в голове не нужно — их помнит Prettier. Это программа, которая берёт ваш файл и переписывает его оформление по единым правилам: расставляет отступы и пробелы, переносит длинные строки, приводит кавычки к одному виду. Логику она не трогает вовсе.
Обычно Prettier подключают к редактору так, чтобы он срабатывал при каждом сохранении файла. Вы пишете как получится — нажали Ctrl+S, и код причёсан. Важная черта Prettier: он почти не настраивается, и это осознанное решение. Не о чем спорить — значит, споров нет.
Prettier делает код красивым, но красиво оформленная ошибка остаётся ошибкой. За смыслом следит линтер — ESLint. Он читает программу, не запуская её, и подсвечивает подозрительные места: переменная объявлена, но нигде не используется; сравнение через нестрогое ==; ветка кода, до которой невозможно дойти.
Prettier — про красоту, ESLint — про ошибки
| Prettier | ESLint | |
|---|---|---|
| За что отвечает | Внешний вид кода | Вероятные ошибки и сомнительные места |
| Примеры находок | Отступы, кавычки, длина строки | Неиспользуемые переменные, ==, недостижимый код |
| Что делает с находкой | Молча переписывает | Предупреждает; часть правит флагом --fix |
| Настройка | Почти никакой — и это плюс | Гибкие наборы правил под команду |
Оба инструмента ставятся как зависимости для разработки: npm install --save-dev prettier eslint. Для редактора (например, VS Code) есть одноимённые расширения: Prettier форматирует при сохранении, ESLint подчёркивает проблемы прямо в коде. В командах их дополнительно запускают на CI — плохо оформленный код просто не попадает в общую ветку.
Соберём всё вместе. Вот функция, которая работает, но нарушает сразу все соглашения:
Что здесь не так: имя f не говорит ничего, var вместо const, число 0.2 — магическое (налог? скидка? комиссия?), пробелов и отступов нет. А теперь та же логика, оформленная по правилам:
Логика не изменилась ни на символ — изменилось только время, которое нужно читателю, чтобы её понять. В первом варианте это полминуты и три вопроса, во втором — один взгляд.
- Код читают гораздо чаще, чем пишут, — единый стиль экономит время каждому читателю.
- База соглашений: отступ 2 пробела, пробелы вокруг операторов, «египетские» скобки, имена по смыслу, никаких магических чисел.
- Prettier автоматически форматирует внешний вид кода — споры об оформлении закрыты.
- ESLint находит вероятные ошибки без запуска программы: неиспользуемые переменные,
==, недостижимый код. - Настройте оба инструмента на срабатывание при сохранении файла — и о стиле можно больше не думать.
1/3Что делает Prettier?
2/3Какую из этих проблем найдёт именно ESLint, а не Prettier?
3/3Чем плох код if (age > 21) с точки зрения стиля, если 21 нигде не пояснено?
Наведите порядок
Перепишите функцию по соглашениям из статьи: осмысленные имена, const вместо var, магическое число — в именованную константу, отступы и пробелы — по правилам. Результат вызова должен остаться прежним.
Например: const DAYS_IN_WEEK = 7; и function weeksToDays(weeks) { return weeks * DAYS_IN_WEEK; }. Теперь имя функции говорит, что она делает, а константа объясняет, откуда взялась семёрка — комментарии не понадобились.
Что заметит линтер
Код ниже запускается и печатает приветствие. Найдите два места, на которые пожалуется ESLint, и объясните, почему они опасны, хотя программа «работает».
Первое — переменная temp объявлена, но не используется (правило no-unused-vars): скорее всего, это забытый мусор. Второе — нестрогое == (правило eqeqeq): здесь строка тихо превратилась в число, и однажды такое неявное приведение сработает не так, как вы ждёте.