Какое карри ты хочешь на ужин

Давайте откроем в Индии ресторан, где готовят карри. В отличие от других мест в Индии есть 3 типа людей.

  1. Без овощей: в нем есть все, кроме, может быть, говядины
  2. Овощной: то же, что и без овощей, но без мяса
  3. Джайны: то же, что и овощи, но без лука и чеснока.

Давайте создадим функцию для приготовления карри

function makeCurry(style, …items) {
  toppings = items.join(“,”);
  return “Making “ + style + “ style curry with “ + toppings ;
};
console.log(makeCurry(‘indian’,’onion’,’garlic’,’mushroom’));
//Prints "Making indian style curry with onion,garlic,mushroom​​​​​"

... items - это синтаксис es6 rest / spread. Все остальные аргументы превращаются в массив.

Прежде чем мы продолжим, вам нужно знать одну вещь о нескольких обычных индийских ресторанах. Вы заказываете любое блюдо определенного стиля, оно на вкус одинаково, хотя ключевой ингредиент меняется. Разница между Куриной 65 и Грибной 65 в том, что в одном Курица заменена Грибной. Также разница между Mushroom 65 и Mushroom chilly заключается в том, что к первому добавляется чили. Думаю, это сделано для сокращения затрат.

Теперь я открываю такой ресторан, так что давайте приготовим куриное карри, овощное карри и джайнское карри.

jainCurry = makeCurry(‘indian’,’tomato’);
vegCurry = makeCurry(‘indian’,’tomato’, ‘onion’,’garlic’);
chickenCurry = makeCurry(‘indian’,’tomato’, ‘onion’,’garlic’, ‘chicken’);

Выполнено. 3 порядка вниз. Теперь, если вы заметили, каждый из них является подмножеством предыдущего. Итак, чтобы ускорить выполнение заказов, что, если я буду держать jainCurry всегда наготове, а затем добавлять дополнительные по мере необходимости. Звучит просто, правда? Давайте займемся написанием моей идеи получения прибыли.

Сделайте паузу и подумайте, как этого добиться. Выполнено? Продолжить

Вы можете создать 3 функции makeJainCurry, makeVegCurry, makeChickenCurry, каждая из которых будет вызывать другую. Это достойный подход, но мы можем его немного отполировать.

jainCurry = makeCurry.bind(null, ‘chinese’, ‘tomato’);
jainOrder = jainCurry(); //Chinese is the style and tomato is items
vegCurry = jainCurry.bind(null, ‘onion’, ‘garlic’);
vegOrder = vegCurry(); //All are items as style is already taken above
chickenCurry = vegCurry.bind(null, ‘chicken’);
chickenOrder = chickenCurry();

Здесь мы создали 3 функции, но без явного создания ни одной. Эта является функцией, возвращающей другую функцию, и, как видите, это очень мощный инструмент. Чтобы понять это, вам нужно сначала понять bind

В j ainCurry стиль первого аргумента установлен как китайский, а помидор воспринимается как элемент. К моменту создания v egCurry все аргументы makeCurry установлены. Но поскольку items представляет собой массив rest / spread, все остальное считается его частью. То же самое и с c hickenCurry.

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

JainChillyCurry = jainCurry.bind(null, ‘chilly’);

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

function makeItSpicy(func) {
  return func.bind(null, ‘chilly’);
}
JainChillyCurry = makeItSpicy(JainCurry);

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

Хотите, чтобы мы написали больше

Если вам понравилось, нажмите аплодисменты. Это побудит нас писать больше. Подпишитесь,, чтобы увидеть больше сообщений о JavaScript. Прокомментируйте ниже, если у вас есть другие предложения или предложения. И где бы вы ни были, попробуйте индийское карри сегодня.