Что это такое, как их использовать и практический пример использования.
Кто они такие?
Функции карри не являются функциями с азиатскими пряностями. Я люблю курицу с карри и многое другое, но, увы, мы говорим не об этом.
Каррирование функции звучит сложно, но на практике это довольно просто. Начните с написания базовой функции JavaScript (используя синтаксис ES6);
const addThree = (number) => { return a + 3; };
addThree(4); // => 7
Что, если нам нужна функция, добавляющая четыре, а не три? Может быть, мы создадим еще одну функцию addFour
и сделаем что-то подобное.
const addFour = (number) => { return a + 4; };
addFour(5); // => 9
Тем не менее, мы разработчики программного обеспечения; простота, удобочитаемость и принцип «работать умнее, а не усерднее» всегда должны быть целью. Мы не зря занимаемся инженерами. Сама наша работа заключается в автоматизации и решении проблем с помощью программного обеспечения.
Вот где подходят каррированные функции. В одной функции вы можете создать две функции, которые могут addFour
И addThree
. Вот как.
const add = (amount) => (number) => { return number + amount; };
const addThree = add(3); const addFour = add(4);
addThree(3); // => 6 addFour(8); // => 12
Для тех из вас, кто знаком с обозначениями стрелочных функций, это может показаться странным, но вы, вероятно, поняли. Это просто функция, возвращающая… другую функцию. Если это поможет, вот еще один способ написать эту каррированную функцию add
:
const add = (amount) => {
return (number) => {
return number + amount;
}
};
Вы видите абстракцию? Возможности? Теперь, если вам нужно больше функций, может быть, addFive
или addSix
, вам не нужно создавать новые функции, вы можете просто сделать:
const addFive = add(5);
const addSix = add(6);
Вам может быть интересно, почему бы вам просто не сделать const add = (amount, number) => ...
. Правильный вопрос.
Каррирование допускает частичное применение. Частичное приложение — это функция, которая была применена к некоторым, но еще не ко всем своим аргументам.
Вариант использования
Недавно я создал приложение для форума жалоб, чтобы опробовать новый стек технологий, который меня интересовал: Svelte + Tailwind + Airtable (как БД) + AWS S3 (чисто статический).
Я использовал Airtable в качестве базы данных и (используя их API). Я создал функцию-оболочку для взаимодействия с разными таблицами: жалобами, пользователями, комментариями и потоками.
const baseUrl = "https://api.airtable.com/v0/<airtable-project-key>"
const createFetcher = table => async ({ method = 'GET', params = '', id = '', data = {} } = {}) => { const extras = { headers: { 'Authorization': 'Bearer <airtable-api-key>', 'Content-Type': 'application/json', }, method, };
if (method !== 'GET') { extras.body = JSON.stringify(data) }
if (!!params) { params = Object.keys(params).map(function(key) { return key + '=' + params[key]; }).join('&'); }
const res = await fetch(baseUrl + `/${table}${id ? '/' + id : ''}?` + params, extras)
return res.json() }
export const Complaints = createFetcher('Complaints') export const Comments = createFetcher('Comments') export const Threads = createFetcher('Threads') export const Users = createFetcher('Users')
Авария
createFetcher
— это каррированная функция, которая позволяет вам создавать оболочку вокруг каждой таблицы без необходимости выполнять всю работу по выборке шаблонов. Затем внизу я создаю функцию извлечения для каждой таблицы.
Применение
Чтобы удалить тему.. или комментарий.
Threads({ method: 'DELETE', id: threadId });
Comments({ method: 'DELETE', id: commentId });
И вот оно. Нужно удалить жалобу? Вы знаете, что делать.
Привет, Брайант Брок.