Автор оригинала: Ferran Buireu.
Вы когда-нибудь слышали о «карри» в парадигме языка программирования? Нет, это не индийский рецепт, но это, безусловно, может сделать ваш код вкуснее.
Будете ли вы столкнулись с закрытиями и карри до или вы новичок в этом, в этом руководстве вы узнаете о:
- Разница между закрытиями и карри
- Карри и его основные преимущества
- Почему вы должны использовать карри в ваших проектах
Я дам вам теорию, а также действительные случаи использования, примеры и твердый математический фон.
Отказ от ответственности: Я буду основывать эту статью на JavaScript Однако главная идея может быть применена к любому современному языку программирования.
Закрытие может быть описано как комбинация функции и Область в котором он был объявлен.
Но что конкретно это означает? Область охвата состоит из любых локальных переменных в среде функции, когда функция создана. Закрытие позволяет ссылаться на все локальные переменные функции в состоянии, которую они были найдены.
Это по сути достигается путем определения Функция внутри другой функции: функция в функции технически закрывается Отказ Когда вы активируете основную функцию (также известную как родительскую или внешнюю функцию), вы также будете создавать новый контекст выполнения, который сохраняет свежую копию всех локальных переменных. Эти локальные переменные могут быть упомянуты в глобальной области, либо связывая их к переменным, объявленным глобально, либо возвращая замыкание от родительской функции.
Вот пример:
const closuredFunction= someVariable =>{ let scopedVariable=someVariable; const closure=()=>{ scopedVariable++; console.log(scopedVariable); } return closure; }
Примечание: я предположил добывать как целое число (из-за ++ ), но он может быть экстраполирован любым другим типом переменной. Я буду продолжать использовать функции стрелки по всей этой статье, если вам нужны дополнительные объяснения, просто опубликуйте комментарий, и я буду рефакторет.
Закрытие: практическое применение
Перед введением классов в ES6 замыкания представляли собой простой способ создания классовой конфиденциальности, сопоставимый с тем, который используется в OOP ( o Bject o o. Частные методы. Это известно как «шаблон модуля», и это позволяет нам Пишите легкомощный код с уменьшенным загрязнением пространства имен и более многократным для использования Отказ
Продолжая с приведенным выше примером, внешняя функция ( закрытая функция
) – это публичная функция, которая имеет доступ к некоторым частным переменным ( 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 ()
Доступ к тому же внешнему применению, поэтому, то же самое ScopedVariabiable
Отказ Если один изменяется, следующее значение будет изменяться соответственно. Curry – это разнообразное посуду, исходящее в индийском субконтиненте, которое использует сложное сочетание специй и трав .scope, с новым ScopedVariabiable
Таким образом, полностью независимая переменная будет предложена из-за объема и контекста.
Curry – это разновидность, исходящая в индийском субконтиненте, которое использует сложное сочетание специй и трав.
Хорошо, одна шутка карри на статью достаточно.
Carrying относится к процессу преобразования функции с несколькими вредами в то же функцию с меньшим количеством. Эффект Curried достигается путем связывания некоторых аргументов первой функции, так что эти значения исправлены для следующего вызова. – Кристина мозговая волна
Или другими словами:
Carrying – это шаблон функций, которые мгновенно оценивают и возвращают другие функции. Это может работать, потому что функции JavaScript являются выражениями, которые могут вернуть другие функции, как мы видели в предыдущем разделе (закрывающихся). Функции Curry Curry построены путем цепочки закрытия и немедленно возвращая свои внутренние функции одновременно.
Как использовать carrying
Стандартный вызов функции может выглядеть так:
sampleFunction('param1', 'param2', 'param3');
Карная функция может выглядеть так:
sampleFunction('param1')('param2')('param3');
Если это выглядит знакомым, это действительно потому, что HOC (компонент с высоким порядком) является карриной функцией.
Перевод предыдущего фрагмента в карриную функцию будет:
function sampleFunction(param1){ //some logic return param2 => { //some other logic return param3 => { return finalResult; } } }
Окончательная функция в цепочке имеет доступ ко всем аргументам в цепочке. Ключ с карриными функциями заключается в том, что У вас все еще есть доступ к функциям внутри функции Curred Отказ
Как?
let someParam = sampleFunction(param1); let anotherParam = someParam(param2); console.log(anotherParam(param3));
Или в нерафинированном порядке:
sampleFunction('param1')('param2')('param3');
Это означает, что независимо от того, как он называется, пока последовательность верна, конечный результат всегда будет возвращаться, как и ожидалось.
Каррирует форму закрытия?
Да , как вы, возможно, уже заметили, два шаблона обмениваются сходствами. Тем не менее, у них есть Разные случаи использования Отказ
Carrying означает, что закрытие не приходится получать все его аргументы одновременно, но отдельно.
Я нашел эту полезную метафору вокруг Интернета:
Подумайте о карри, как добавление ингредиентов (аргументы или другие специи) к функции один за другим. Теперь вы можете бросить некоторые аргументы и другие аргументы, как вы идете. Это может быть полезно, если аргументы в вашей функции зависят от других действий в программе. Но и если вы хотите сделать закрытие одним аргументом функции, а затем карри второго аргумента, если этот аргумент будет другим значением каждый раз, когда вы его называете.
Когда ваш проект растет, вы скоро поймете, насколько полезны Carrying, как это Чрезвычайно масштабируемый Отказ Чем более сложный проект, тем больше кария окажется спасением.
Если вы хотите сохранить контроль над крупными и сложными приложениями, вы можете обратиться к Carrying как безопасную методологию, чтобы обеспечить Чистый код Отказ
Carrying и Clean Code.
Представьте себе, что вы начинаете компилировать длинный список функций. Очистное кодовое наилучшая практика учит вас, что вам нужны все функции, которые будут работать независимо и оставаться максимально простыми и распыленными, чтобы избежать побочных эффектов.
Побочные эффекты – это то, что происходит, например, когда вы размещаете много грязного кода в одну функцию, эффективно влияющие на то, какие другие функции выполняют дальше по линии, не уважая объем и изменение состояния переменной. Другими словами, побочный эффект представляет собой операцию, функцию или выражение, которое модифицирует некоторое значение (ы) переменной состояния вне его локальной среды.
Если ваши функции перезаряжены (как сказать, если у вас есть много побочных эффектов), ваш код не светится и чистый. И если ваш код не чист, ваш проект является несущественным и трудно поддерживать.
В идеале функции должны получать не менее 1 параметра.
Закрытия попали в популярность со времен JavaScript Incopported классов в ES6. Однако закрытия и карри все еще могут быть важнейшей частью чистой, Масштабируемый код Отказ В функциональном программировании они, по существу, служат аналогичной цели для частных методов в ориентированном объекте программирования.
Теперь вы знаете, какие закрытия и карри, как их использовать и почему. Большинство людей могут остановиться сюда и идти кодом, но если вы немного странно, как я, вот дополнительное математическое лечение от Wikipedia для ваших развлечений.
В математике и информатике Carrying – это техника преобразования функции, которая принимает несколько аргументов в последовательность функций, которые каждый из них принимает один аргумент. Например, карри функции
Источник: Википедия
Или более абстрактно, функция, которая принимает два аргумента, один из Х и один из Y и производит Z Вывод в Carrying переводится в функцию, которая принимает один аргумент от Х и производит как выходы функции из Х к Z Отказ
Carrying предоставляет способ работы с функциями, которые принимают несколько аргументов и используют их в рамках, где функции могут принимать только один аргумент. Например, некоторые аналитические методы могут применяться только к функциям с одним аргументом. Практические функции часто принимают больше аргументов, чем это. Фреге показал, что достаточнее обеспечить решения для случая одного аргумента, так как можно было преобразовать функцию с несколькими аргументами в цепочку функций однорегурирования. Это преобразование является процессом, который теперь известный как карри. Все «обычные» функции, которые обычно могут быть обнаружены в математическом анализе или в компьютерном программировании, могут быть очищены. Однако есть категории, в которых карри не возможен; Наиболее общие категории, которые позволяют Carrying, являются закрытыми моноидальными категориями.
Carrying связан с, но не таким же, как частичное приложение. На практике методика программирования охват может быть использована для выполнения частичного применения и своего рода карри, скрывая аргументы в среде, которая путешествует с карриной функцией, как мы ранее видели.
Это некоторые основные концепции функционального программирования JavaScript и могут использоваться для создания вашего код гибкий и Мощный Отказ Если у вас есть какие-либо реальные примеры карри, или любимое блюдо карри, не стесняйтесь начать его в комментарии.