JS: Полиморфизм

Теория: Диспетчеризация по ключу (функции)

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

Предположим, что нам надо сформировать массив с фамилиями наших пользователей. Главное условие – для девушек берется девичья фамилия.

Реализуем эту задачу, используя старый добрый if:

const lastNames = users.map((user) => {
  if (user.gender === 'female') {
    return user.maidenName
  }
  return user.lastName
})

Теперь решим эту задачу с помощью диспетчеризации по ключам объекта, но в отличие от предыдущего урока, в значениях у нас будут функции:

// Определяем key-value, где ключ — это пол, а значение — это функция,
// которая возвращает нужное значение для пола
const mapping = {
  female: user => user.maidenName,
  male: user => user.lastName,
}

// Выбираем нужную функцию по названию пола и вызываем ее
// Внутрь функции передается пользователь
const lastNames = users.map(user => mapping[user.gender](user))

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

Еще один пример – парсинг данных в зависимости от их типа:

import yaml from 'js-yaml'

const mapping = {
  yml: yaml.load,
  json: JSON.parse,
}

const parse = (type, data) => mapping[type](data)

Рекомендуемые программы