Почему чистая функция? | Кодементор

Введение

А чистая функция то есть при одних и тех же входных данных функция всегда будет возвращать один и тот же результат. Чтобы объяснить это с помощью математических терминов: для каждого ввода каждый раз возвращается один вывод.

вставленное изображение 0.png
Чистая функция не имеет примесей. Это означает действия/элементы в функции, которые отвечают за то, чтобы эта функция давала разные ответы на одни и те же входные данные.
Например:

function logSomething(something) {
    const dt = (new Date())toISOString();
    console.log(`${dt}: ${something}`);
    return something;
}

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

Внедрение зависимости

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

function logSomething(d, cnsl, something) {
    const dt = d.toIsoString();
    return cnsl.log(`${dt}: ${something}`);
}

Затем, чтобы вызвать его, мы должны сами явно передать нечистые биты:

const something = "Some Text";
const d = new Date();
logSomething(d, console, something);

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

const d = {toISOString: () => '1865-11-26T16:00:00.000Z'};
const cnsl = {
    log: () => {
        // do nothing
    },
logSomething(d, cnsl, "Random Text!");
};

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

function getUserNameFromDOM() {
    return document.querySelector('#username').value;
}
const username = getUserNameFromDOM();

В этом случае мы пытаемся запросить некоторую информацию у DOM. Это нечисто, так как document — это глобальный объект, который может измениться в любой момент. Один из способов сделать нашу функцию чистой — передать объект глобального документа в качестве параметра. Но мы могли бы также передать селектор запросов() функция как:

function getUserNameFromDOM($) {
    return $('#username').value;
}
const qs = document.querySelector.bind(document);
const username = getUserNameFromDOM(qs);

Опять же, вы можете подумать, что в этом нет смысла. Все, что мы сделали, это удалили примесь из получитьИмяПользователяОтDOM(). Это не исчезло. Мы только что вставили его qs(). Кажется, это не делает ничего, кроме увеличения длины кода. Также вместо одной нечистой функции у нас есть две функции, одна из которых все еще нечистая.

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

Вывод

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

function app(doc, con, ftch, store, config, ga, d, random) {
    // Application code goes here
 }
app(document, console, fetch, store, config, ga, (new Date()), Math.random);

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

***эта статья взята из разных статей в Интернете

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *