Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Диспетчеризация по ключу (данные) JS: Полиморфизм

В связке с полиморфизмом постоянно возникает выражение «динамическая диспетчеризация». С самим понятием мы познакомимся позже, а сейчас поговорим про диспетчеризацию в принципе.

Диспетчеризация (от английского dispatch — отсылать, отправлять) — процесс координации каких-либо действий. Например, диспетчер в аэропорту разводит самолеты, диспетчер в службе такси связывает доступного водителя и клиента.

Рассмотрим условный код, в котором выбор ветки исполнения идет по конкретному значению переменной:

let databaseConfiguration;
if (env === 'development') {
  databaseConfiguration = {
    adapter: 'sqlite',
  };
} else if (env === 'production') {
  databaseConfiguration = {
    adapter: 'postgresql',
  };
}

Во всех проектах существует понятие «среда». Это то окружение, в котором происходит запуск проекта. Во время разработки код запускают в среде разработчика, ее традиционно называют development. Среда, в которой приложение работает по-настоящему, называется production. В зависимости от среды приложения по-разному стартуют, конфигурируются и даже работают, например, в разных средах могут использоваться разные базы данных.

Код выше как раз типичный пример того, как меняется конфигурация в зависимости от среды. Процесс выбора можно назвать процессом диспетчеризации.

Статичная условная конструкция, в которой диспетчеризация идет по строкам, легко заменяется на свитч. Так код становится понятнее и проще:

let databaseConfiguration;

switch (env) {
  case 'development':
    databaseConfiguration = {
      adapter: 'sqlite',
    };
    break;
  case 'production':
    databaseConfiguration = {
      adapter: 'postgresql',
    };
    break;
}

Хотя кода и стало чуть больше, switch сам по себе более явно описывает процесс диспетчеризации. Но можно пойти еще дальше и сделать диспетчеризацию по ключу ассоциативного массива:

const databaseSettingsByEnv = {
  development: {
    adapter: 'sqlite',
  },
  production: {
    adapter: 'postgresql',
  },
};

const databaseConfiguration = databaseSettingsByEnv[env];

Значение по умолчанию легко добавить через оператор ??:

const databaseConfiguration = databaseSettingsByEnv[env] ?? { adapter: 'memory' };
// Либо через _.get
// const databaseConfiguration = _.get(databaseSettingsByEnv, env, { adapter: 'memory' });

Этот вариант лучше предыдущих двух сразу по нескольким причинам. Во-первых, он короче, во-вторых, он гибче. Условные конструкции — это статичный код, который нельзя поменять без переписывания самой программы в отличие от последнего варианта. А вот данные — это совсем другое дело. Для удобства их часто кладут в файлы конфигурации, которые используют формат JSON или YAML, например:

---

development:
  adapter: sqlite

production:
  adapter: postgresql

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


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 28 ноября
профессия
от 39 525 ₸ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 28 ноября
профессия
от 25 000 ₸ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 28 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»