Рубрики
Без рубрики

Закрытие и каррики

Вы когда -нибудь слышали о «карриинге» в парадигме языка программирования? Нет, это не индийский рецепт, … Tagged с JavaScript, Computerscience, программированием.

Вы когда -нибудь слышали о «карриинге» в парадигме языка программирования? Нет, это не индийский рецепт, но он, безусловно, может сделать ваш код вкуснее.

Независимо от того, сталкивались ли вы за закрытие и карри

  • Разница между закрытием и карри
  • Каррики и его основные преимущества
  • Почему вы должны использовать карри в своих проектах

Я дам вам теорию, а также достоверные примеры, примеры и солидный математический фон.

Отказ от ответственности: я буду основывать эту статью на JavaScript Однако основная идея может быть применена к любому современному языку программирования.

Закрытие может быть описано как комбинация функции и Область в котором было объявлено.

Но что конкретно это означает? Область состоит из любых локальных переменных в среде функции при создании функции. Закрытие позволяет обратиться ко всем локальным переменным функции в состоянии, которую они были найдены.

Это по существу достигается путем определения Функция внутри другой функции: функция в функции технически является закрытием . Когда вы активируете основную функцию (также известную как родительскую или внешнюю функцию), вы также создаете новый контекст выполнения, который сохраняет свежую копию всех локальных переменных. Эти локальные переменные могут быть упомянуты в глобальном масштабе, либо связывая их с переменными, объявленными во всем мире, либо возвращая закрытие от родительской функции.

Вот пример:

const closuredFunction= someVariable =>{
   let scopedVariable=someVariable;
   const closure=()=>{
       scopedVariable++;
       console.log(scopedVariable);
   }

   return closure;
}

Примечание: я предположил SomeVariable как целое число (из -за ++ ), но это может быть экстраполирован на любой другой тип переменной. Я буду продолжать использовать функции со стрелками на протяжении всей этой статьи, если вам понадобятся дополнительные объяснения, просто опубликуйте комментарий, и я рефактую его.

Закрытие: практическое применение

Перед введением классов в ES6 закрытие представляло собой простой способ создания классоподобной конфиденциальности, сравнимой с тем, что используется в ООП ( o брюк O Riented P Rogramming), позволяя подражать частным методам. Это известно как «шаблон модуля», и он позволяет нам Напишите легко поддерживаемый код с уменьшенным загрязнением пространства имен и большей использованием повторного использования .

Продолжая с приведенным выше примером, внешняя функция ( закрывающая функция ) – это публичная функция, которая имеет доступ к некоторым частным переменным ( scopedVariable ) и внутренние функции ( Закрытие ).

Теперь давайте применим следующее:

const closuredFunction= someVariable =>{
   let scopedVariable=someVariable;
   const closure=()=>{
       scopedVariable++;
       console.log(scopedVariable);
   }

   return closure;
}
let testOne = closuredFunction(1);
testOne(); // will output 2
testOne(); // will output 3

let testTwo = closuredFunction(10);

testTwo(); // will output 11
testTwo(); // will output 12

testOne(); // will output 4

Что случилось? Все призывы Testone () получают доступ к одной и той же внешней областям, поэтому в одном и том же ScopedVariable Анкет Если кто -то изменится, следующее значение изменится соответственно.

Однако другой вызов той же внешней функции создает новую область с новым ScopedVariable Таким образом, полностью независимая переменная будет вызвана из -за масштаба и контекста.

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

Хорошо, одной шутки карри за статью достаточно.

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

Или другими словами:

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

Как использовать карри

Стандартный вызов функции может выглядеть так:

sampleFunction('param1', 'param2', 'param3');

Функция может выглядеть так:

sampleFunction('param1')('param2')('param3');

Если это выглядит знакомо, это действительно потому, что HOC (компонент высокого порядка) является карри.

Перевод предыдущего фрагмента в карри будет:

function sampleFunction(param1){ 
   //some logic
   return param2 => { 
     //some other logic 
     return param3 => { 
        return finalResult;    
     }  
   }
}

Окончательная функция в цепочке имеет доступ ко всем аргументам в цепи. Ключ с карри функций – это У вас все еще есть доступ к функциям внутри карри функции .

Как?

let someParam = sampleFunction(param1);
let anotherParam = someParam(param2);
console.log(anotherParam(param3));

Или нерафинированным образом:

sampleFunction('param1')('param2')('param3');

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

Карри – это форма закрытия?

Да , как вы, возможно, уже заметили, эти два шаблона имеют сходство. Однако они имеют Различные варианты использования Анкет

Карри означает, что закрытие не должно получать все свои аргументы одновременно, но отдельно.

Я нашел эту полезную метафору в Интернете:

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

По мере того, как ваш проект растет, вы скоро поймете, насколько полезным может быть каррики, так как это чрезвычайно масштабируемый . Чем сложнее проект, тем больше карриков окажется спасателем.

Если вы хотите сохранить контроль над большими и сложными приложениями, вы можете обратиться к каррике в качестве безопасной методологии, чтобы обеспечить Чистый код Анкет

Керри и чистый код.

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

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

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

В идеале, функции должны получать всего 1 параметр.

Закрытие упало в популярность с тех пор, как JavaScript включил классы в ES6. Однако закрытие и каррики все еще могут быть важной частью чистого, масштабируемый код Анкет В функциональном программировании они, по сути, служат аналогичной цели с частными методами в объектно -ориентированном программировании.

Теперь вы знаете, что такое закрытие и карри, как их использовать и почему. Большинство людей могут остановиться здесь и пойти код Но если вы немного подобно мне, вот дополнительное математическое удовольствие от Википедии для вашего развлечения.

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

Или, более абстрактно, функция, которая принимает два аргумента, один из X и один из Y и производит Z Вывод путем каррики переводится в функцию, которая берет один аргумент из X и производит как выходные функции из X к Z Анкет

Currying предоставляет способ работать с функциями, которые принимают несколько аргументов и используют их в рамках, где функции могут занять только один аргумент. Например, некоторые аналитические методы могут применяться только к функциям с одним аргументом. Практические функции часто принимают больше аргументов, чем это. Frege показал, что было достаточно для предоставления решений для одного аргументального случая, так как вместо этого можно было преобразовать функцию с несколькими аргументами в цепочку функций с одним аргументом. Это преобразование – это процесс, который теперь известен как карри. Все «обычные» функции, которые обычно могут быть встречаться в математическом анализе или в компьютерном программировании, могут быть каррими. Тем не менее, есть категории, в которых каррики невозможно; Наиболее общие категории, которые позволяют карри, – это закрытые моноидные категории.

Карринг связан, но не то же самое, что частичное применение. На практике методика программирования закрытия может использоваться для выполнения частичного применения и своего рода карри, скрывая аргументы в среде, которая путешествует с карри, как мы ранее видели.

Вот некоторые основные понятия функционального программирования JavaScript и могут использоваться для создания вашего код гибкий и мощный Анкет Если у вас есть какие-либо реальные примеры каррики или любимое блюдо из карри, не стесняйтесь привести его в комментарии.

Оригинал: “https://dev.to/fbuireu/closures-and-currying-b8i”