Чистые функции являются строительными блоками функционального программирования.
Их любят за простоту и тестируемость.
В этой статье вы найдете контрольный список , что поможет определить, является ли функция чистой или нет.
Контрольный список
Чтобы функция считалась «чистой», она должна удовлетворять двум условиям: - Функция возвращает один и тот же результат каждый раз, когда она вызывается с одним и тем же набором аргументов.- Никаких побочных эффектов Давайте посмотрим поближе.
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. Никаких побочных эффектов.
Этот тест сам по себе является контрольным списком.
Примеры побочных эффектов:
- Модификация входных параметров
- консоль.
log
- HTTP-вызовы (AJAX/fetch)
- Изменение файловой системы
- DOM-запросы
Я советую вам посмотреть видео Боб Мартин.
Вот «нечистая» функция с побочным эффектом.
const impureDouble = (x) => {
console.log('doubling', x);
return x * 2;
};
const result = impureDouble(4);
console.log({ result });
консоль.
log Здесь это побочный эффект, но он не повредит. Мы все равно получим те же результаты, используя те же данные.
Однако это может вызвать проблемы.
«Нечистое» изменение объекта const impureAssoc = (key, value, object) => {
object[key] = value;
};
const person = {
name: 'Bobo'
};
const result = impureAssoc('shoeSize', 400, person);
console.log({
person,
result
});
Переменная person была окончательно изменена, поскольку функция была объявлена с использованием оператора присваивания.
Общее состояние означает, что влияние нечистыйАссок уже не совсем очевидно.
Понимание влияния на систему теперь предполагает отслеживание каждой переменной, к которой когда-либо прикасались, и знание ее истории.
Общее состояние = временные зависимости.
Мы можем очистить нечистыйАссок , просто возвращая новый объект с нужными свойствами.
«Очистка» const pureAssoc = (key, value, object) => ({
.
object,
[key]: value
});
const person = {
name: 'Bobo'
};
const result = pureAssoc('shoeSize', 400, person);
console.log({
person,
result
});
Сейчас чистыйАссок возвращает проверяемый результат, и вам не придется беспокоиться, если он изменится где-то еще.
Это можно было сделать так: 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
});
Изменение входных данных может быть опасным, но изменение их копии не является проблемой.
Конечным результатом является тестируемая, предсказуемая функция, которая работает независимо от того, где и когда вы ее вызываете.
Изменения ограничены этой небольшой областью, и вы все равно возвращаете значение.
Краткое содержание
- Функция является чистой, если она не имеет побочных эффектов и возвращает один и тот же результат каждый раз, когда вызывается с одним и тем же набором аргументов.
- Побочные эффекты включают: изменение ввода, HTTP-вызовы, запись на диск, вывод на экран.
- Вы можете безопасно клонировать, а затем изменить входные параметры.
Просто оставьте оригинал без изменений.
- Синтаксис расширения (.
синтаксис) — это самый простой способ клонирования объектов и массивов.
-
Гадамер, Ханс Джордж
19 Oct, 24 -
О Службе Поддержки Rbk Money
19 Oct, 24 -
Gartner Предсказывает «Смерть» Мыши
19 Oct, 24 -
Разбор Формул С Помощью Функций
19 Oct, 24 -
Математика Для Тестировщиков
19 Oct, 24