Меньше магии — больше констант!

ср, 4 июня 2025 г. - 2 мин чтения
Комментарий к коду рядом с константой

🧱 Меньше магии — больше констант

Я работаю на проекте, где константы живут на каждом шагу: таймеры для сторис, коэффициенты расчётов, настройки сборки, лимиты для push-уведомлений. Когда эти цифры и строки разбросаны по файлам, команда тратит часы на поиск «злосчастных 42». Поэтому мы выделили отдельный модуль constants и перестали страдать от магических чисел.


Почему магическим числам не место в продакшене

📖 Контекст исчезает

Чужому разработчику сложно понять, что значит 3000. Это таймаут? Ограничение на символы? Порог аналитики? Названная константа вроде STORY_AUTO_CLOSE_TIMEOUT_MS отвечает на вопрос без комментариев.

🔧 Изменения становятся лотереей

Если значение потребовалось изменить, приходится искать все вхождения. Ошибка в одной точке — и мы ломаем поведение. Одна запись в constants.ts решает задачу заменой в одном месте.

🧩 Трудно согласовывать команды

Frontend, backend, аналитики и маркетинг должны опираться на одни цифры. Константы, вынесенные в общий слой, снимают расхождения и облегчают документацию.


Как организовать файл констант

// constants/timeouts.ts
export const STORY_AUTO_CLOSE_TIMEOUT_MS = 3000;
export const NOTIFICATION_HIDE_DELAY_MS = 5000;
export const ANALYTICS_BATCH_SIZE = 50;
  • Разделяйте по домейнам. timeouts, featureFlags, experiments, pricing — так проще ориентироваться.
  • Документируйте. Ссылайтесь на решения, тикеты или исследования. Вспоминаем нашу статью про силу комментариев и добавляем пояснение рядом с константой.
  • Экспортируйте осознанно. Если значение нужно только внутри модуля, не разбрасывайте его по всему приложению.
  • Синхронизируйте с другими слоями. Обсудите с backend-командой и аналитиками, где хранить общие значения: в монорепо, пакете или shared-config.

Где чаще всего прячутся магические числа

  • 💳 Платёжные лимиты. Суммы возвратов, комиссии, курс валют.
  • 📨 Уведомления. Частота рассылки, TTL pushей, часы тишины.
  • 📦 Пакеты и подписки. В продукте легко накопить 20–30 вариантов тарифов, и держать их в голове невозможно. Константы с названиями, ценами и ограничениями сразу показывают, за что отвечает каждый пакет.
  • 🎬 UI/UX. Длительность анимаций, высота виртуального списка, количество карточек на экран.
  • 🧪 Эксперименты. Проценты трафика для A/B, пороги метрик, длительность сплита.
  • ⚙️ Инфраструктура. Ретрай политики, лимиты очередей, таймауты запросов.

Каждый такой параметр — кандидат на константу с говорящим именем и комментарием.

Не забывайте про окружения. Dev-стенд, stage, trunk и production живут на разных базовых URL и API-ключах, а иногда и на отдельных шинах событий. Константы вроде DEV_API_BASE_URL, STAGE_CUSTOMER_PORTAL_URL и PROD_SUBSCRIPTION_PACKAGE_IDS избавляют от ошибок при сборке и ресинке. Меняется адрес или токен — вы правите одну запись, и вся команда сразу работает с актуальными данными.


Как убедить команду перейти на константы

  1. Покажите боль. Соберите примеры багов и срывов релизов из-за правок «вручную». Визуализируйте переписку или PR, где пришлось перепроверять тысячи строк.
  2. Предложите структуру. Подготовьте PR с базовым constants и eslint-правилом, которое запрещает магические числа (например, no-magic-numbers).
  3. Добавьте автоматизацию. Настройте импорт путей, чтобы константы было легко подтягивать, и дополните CI проверками.
  4. Поделитесь гайдом. В документации опишите, какие значения выносить сразу, а какие после того, как их подтвердил продукт.

Итог

Магические числа — это технический долг, который накапливается незаметно. Создайте центральный файл констант, подпишите каждое значение и держите рядом ссылку на источник. Так следующий разработчик поймёт, почему таймер стоит именно на 3 секунды, а продукт-менеджер не будет гадать, откуда взялся коэффициент конверсии. Меньше магии — больше ясности и скорости команды.