Понимание функций чистого и высшего порядка для написания современного кода!

Добро пожаловать в JS Bifrost, ваш путь к прочному фундаменту для JavaScript уровня Бога. Это первая статья из серии. Эта статья посвящена тому, как можно использовать функции JavaScript для создания эффективного кода.

Искусство программирования - это преобразование набора требований в набор функций и структур данных.

Функции - один из ключевых компонентов программирования. Они определены для выполнения определенной задачи и выполнять ее снова и снова при каждом вызове. Просто и понятно, правда?

Но…

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

JavaScript всегда был таким !!

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

Функции в основном используются для:

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

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

Чистые функции

Чистая функция:

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

Если эти две точки удовлетворяются функцией, это чистая функция.

Следовательно, функция Pure - это отображение. Он примет ввод и даст вам тот же результат, если ввод повторяется, иначе он даст вам соответствующий результат. Это означает, что если существует набор выходов для набора входов, функция Pure сопоставляет входные данные с выходными.

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

Давайте разберемся с чистой функцией на примере.

Ниже приведена простая функция приветствия, которая принимает имя человека в качестве входных данных.

const greeting = "Hello"
const greet = person => `${greeting} ${person}!`;
console.log(greet("Ashmit")); // "Hello Ashmit!"

Вы можете подумать, что это будет давать один и тот же результат на одном и том же входе каждый раз! Да, это правильно!

Но это не зависит от того, что происходит вне функции. Если мы изменим переменную «приветствие» на «Привет», результат изменится, даже если мы не изменили вход на функцию «приветствовать».

const greeting = "Howdy"
const greet = person => `${greeting} ${person}!`;
console.log(greet("Ashmit")); // "Howdy Ashmit!"

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

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

Побочный эффект

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

Примечание. Если чистая функция вызывает чистую функцию, это не является побочным эффектом, и вызывающая функция остается чистой.

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

const greeting = "Hello"
const greet = (greeting, person) => `${greeting} ${person}!`;
console.log(greet(greeting, "Ashmit"));// "Hello Ashmit!"

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

Преимущества функций Pure

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

Один очень важный пример использования чистых функций - Redux (управление состоянием для ReactJS). Редукторы всегда должны быть чистыми функциями, потому что редукторы выполняют действия с состоянием. Если редукторы нечисты для одного и того же состояния действий в состоянии приложения, он даст разные результаты и, следовательно, не сможет выполнить свою задачу!
(Кстати, если вы еще не знаете ReactJS, я настоятельно рекомендую вы научитесь этому)

Функции высшего порядка

Функции высшего порядка широко используются в JavaScript. Если вы какое-то время программировали на JavaScript, возможно, вы уже использовали их, даже не подозревая об этом.

В JavaScript функции - это граждане первого класса, и под первым классом я имею в виду, что функции рассматриваются как значения. Так что они также могут передаваться как значения.

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

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

Использование другой функции в качестве аргумента часто называют функцией обратного вызова, поскольку она вызывается функцией более высокого порядка. Это концепция, которую JavaScript часто использует.

Давайте разберемся с функцией высшего порядка на примере функции, которая очень часто используется при работе с массивами - Array.prototype.map ().

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

Давайте посмотрим на это на простом примере.

const double = n => n * 2; // Callback function
console.log([1, 2, 3, 4].map(double)); // [2, 4, 6, 8]

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

Преимущества использования функций высшего порядка

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

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

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

Заключительные мысли

Написание чистого и эффективного кода - необходимость часа. Наш код должен быть точным и эффективным. Максимальное использование возможностей языка само по себе является сложной задачей.

Написание чистого кода - это то, что вы должны делать, чтобы называть себя профессионалом. Нет разумного оправдания тому, чтобы делать что-то меньшее, чем вы умеете.
- Роберт К. Мартин, Чистый код: руководство по гибкому разработке программного обеспечения

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

Посмотрите это пространство, чтобы добиться большего прогресса на пути к «божественному уровню JavaScript» с помощью «JS Bifrost».

Использованная литература:





Редукторы высшего порядка в Redux | DigitalOcean
В разделе «Сброс состояния Redux
мы увидели способ повторно использовать логику редуктора для сброса состояния путем создания корневого редуктора. Но… www.digitalocean.com »