В связке с полиморфизмом постоянно возникает выражение «динамическая диспетчеризация». С самим понятием мы познакомимся позже, а сейчас поговорим про диспетчеризацию в принципе.
Диспетчеризация (от английского 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
При таком подходе легко добавить новое поведение без изменения самого кода приложения. Его мощь особенно чувствуется в ситуациях, когда обработкой занимается не наш код, а код библиотеки или фреймворка. Ведь мы не можем просто взять, открыть исходники и поправить их.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.