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

Что такое чистая функция в JavaScript?

Чистые функции – это атомные строительные блоки в функциональном программировании. Они обожаются за их простоту и тестируемость. Этот пост охватывает быстрый контрольный список, чтобы сказать, если функция чистая или нет. Контрольный список функция должна пройти два теста для рассмотрения «чистых»: то же входы всегда возвращают

Автор оригинала: Yazeed Bzadough.

Чистые функции – это атомные строительные блоки в функциональном программировании. Они обожаются за их простоту и тестируемость.

Этот пост охватывает быстрый контрольный список, чтобы сказать, если функция чистая или нет.

Контрольный список

Функция должна пройти два теста, которые следует считать «чистым»:

  1. Те же входы всегда Вернуть те же выходы
  2. Нет побочных эффектов

Давайте увеличить на каждом.

1. Тот же вход => Тот же выход

Сравнить это:

const add = (x, y) => x + y;

add(2, 4); // 6

К этому:

let x = 2;

const add = (y) => {
  x += y;
};

add(4); // x === 6 (the first time)

Чистые результаты

Первый пример возвращает значение на основе заданных параметров, независимо от того, где/когда вы его называете.

Если вы пройдете 2 и 4 Вы всегда получите 6 Отказ

Больше ничего не влияет на вывод.

Нечистые результаты

Второй пример ничего не возвращает. Это зависит от Общее состояние сделать свою работу, увеличивая переменную вне собственного объема.

Этот шаблон является кошмаром разработчика.

Общее состояние вводит временную зависимость. Вы получаете разные результаты в зависимости от того, когда вы назвали функцию. Впервые результаты 6 в следующий раз это 10 и так далее.

О какую версию проще рассуждать?

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

Какой из них более вероятно преуспеть в многопоточной среде, когда зависимости времени могут нарушить систему?

Определенно первый.

2. Нет побочных эффектов

Сам этот тест – контрольный список. Несколько примеров побочных эффектов

  1. Мутируя свой ввод
  2. console.log
  3. HTTP вызовы (Ajax/fetch)
  4. Изменение файловой системы (FS)
  5. Запрос домо

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

Вот нечистая функция с побочным эффектом.

Не так уж и плохо

const impureDouble = (x) => {
  console.log('doubling', x);

  return x * 2;
};

const result = impureDouble(4);
console.log({ result });

console.log Является ли побочный эффект здесь, но во всей практичности это не повредит нам. Мы все еще получим те же выходы, учитывая одинаковые входы.

Это Однако, однако, может вызвать проблему.

” Настраиваемое «изменение объекта

const impureAssoc = (key, value, object) => {
  object[key] = value;
};

const person = {
  name: 'Bobo'
};

const result = impureAssoc('shoeSize', 400, person);

console.log({
  person,
  result
});

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

Общее состояние означает Impumeassoc влияние больше не совсем очевидна. Понимание его влияния на систему теперь включает отслеживание каждой переменной, которая когда-либо касалась и зная их истории.

Общие зависимости.

Мы можем очистить Impumeassoc Просто вернув новый объект с нашими желаемыми свойствами.

Очищать его

const pureAssoc = (key, value, object) => ({
  ...object,
  [key]: value
});

const person = {
  name: 'Bobo'
};

const result = pureAssoc('shoeSize', 400, person);

console.log({
  person,
  result
});

Сейчас pureasosoc Возвращает тестичный результат, и мы никогда не волнуемся, если он спокойно мутировал что-то в другом месте.

Вы могли бы даже сделать следующее и оставаться чистыми:

Еще один чистый путь

const pureAssoc = (key, value, object) => {
  const newObject = { ...object };

  newObject[key] = value;

  return newObject;
};

const person = {
  name: 'Bobo'
};

const result = pureAssoc('shoeSize', 400, person);

console.log({
  person,
  result
});

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

Мутация ограничивается этим небольшим объемом, и вы все еще возвращаете значение.

Глубоколонирование объектов

Берегись! Использование оператора распространения ... создает неглубокий Копия объекта. Неглубокие копии не в безопасности от вложенных мутаций.

Спасибо Родриго Фернандес Диаз Для привлечения этого к моему вниманию!

Небезопасная вложенная мутация

const person = {
  name: 'Bobo',
  address: { street: 'Main Street', number: 123 }
};

const shallowPersonClone = { ...person };
shallowPersonClone.address.number = 456;

console.log({ person, shallowPersonClone });

Оба человек и MlallowPersonClone были мутированы, потому что их дети имеют одинаковую ссылку!

Безопасная вложенная мутация

Для безопасного мутата вложенных свойств нам нужен Глубоко клон.

const person = {
  name: 'Bobo',
  address: { street: 'Main Street', number: 123 }
};

const deepPersonClone = JSON.parse(JSON.stringify(person));
deepPersonClone.address.number = 456;

console.log({ person, deepPersonClone });

Теперь Вы гарантируете безопасность, потому что они действительно два отдельных лица!

Резюме

  • Чистая функция, если она свободна от побочных эффектов и возвращает тот же выход, учитывая тот же вход.
  • Побочные эффекты включают в себя: мутационные входные данные, HTTP вызовы, запись на диск, печать на экран.
  • Вы можете безопасно клон , Тогда Мутате ваш вклад. Просто оставьте оригинальный номер нетронутым.
  • Распространение синтаксиса ( ... Syntax) – самый простой способ неглубоко объекты клона.
  • Json.parse (json.stringify (объект)) самый простой способ Глубоко объекты клона. Спасибо снова Родриго Фернандес Диаз Действительно

Мой свободный курс

Этот учебник был из Мой совершенно бесплатный курс на образовании. Функциональные шаблоны программирования с Ramdajs Действительно

Пожалуйста, рассмотрите возможность принимать/делиться этим, если вам понравилось этот контент.

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

Спасибо за прочтение! До скорого.

Оригинал: “https://www.freecodecamp.org/news/what-is-a-pure-function-in-javascript-acb887375dfe/”