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

Чистите функции са функции, които не предизвикват странични ефекти и, когато се извикват със същите входни параметри, винаги ще връщат същия изход.

Можете да използвате чисти функции, за да сте сигурни, че вашият код е чист, поддържаем и тестван. Тези функции са идеални за тези задачи, защото са предвидими и не променят външните състояния.

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

Характеристики на чиста функция

За функция за да бъде „чист“, той трябва да отговаря на няколко изисквания.

Постоянна връщана стойност

Една чиста функция трябва винаги да връща една и съща стойност при един и същ вход, независимо от броя пъти, в които е извикана.

Например, разгледайте функцията по-долу:

функцияумножават се(а, б) {
връщане a * b;
}
instagram viewer

The умножават се функция в примера по-горе винаги ще връща произведението на двата си аргумента. Като се има предвид същият набор от аргументи, той има постоянна върната стойност.

Извикването на тази функция няколко пъти с едни и същи аргументи ще доведе до един и същ резултат всеки път. Например:

умножавам(2, 3); // връща 6
умножавам(2, 3); // връща 6
умножавам(2, 3); // връща 6

Като алтернатива разгледайте примера по-долу:

функцияmultiplyRandomNumber(бр) {
връщане номер * математика.floor(математика.random() * 10);
}

multiplyRandomNumber(5); // Непредвидими резултати
multiplyRandomNumber(5); // Непредвидими резултати
multiplyRandomNumber(5); // Непредвидими резултати

The multiplyRandomNumber функцията по-горе ще връща различни резултати всеки път, когато я извикате, което я прави нечиста. Резултатите от тази функция са непредвидими, така че тестването на компоненти, които разчитат на нея, е трудно.

Без странични ефекти

Една чиста функция не трябва да предизвиква странични ефекти. Страничен ефект се отнася до всяка промяна на състояние или поведение извън обхвата на функцията, като например промяна на глобални променливи, конзолен изход, мрежови заявки или манипулиране на DOM.

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

Например, разгледайте примера по-долу:

позволявам брои = 0;

функциянарастване() {
брой++;
конзола.log (брой);
}

увеличение (); // Дневници 1
увеличение (); // Дневници 2
увеличение (); // Дневници 3

The нарастване функция в този пример има страничен ефект от модифицирането на броя променлива извън своя обхват. Той също така се регистрира в конзолата.

Тази функция не е чиста, тъй като има страничен ефект, който може да затрудни предсказването на изхода и тестването изолирано. За да го направите чист, можете да го модифицирате, за да поемете броя променлива като аргумент и връща увеличената стойност, без да променя никакво външно състояние.

Така:

функциянарастване(броя) {
връщане брои + 1;
}

увеличаване (1); // връща 2
увеличаване (1); // връща 2
увеличаване (1); // връща 2

Версията на нарастване функцията в примера по-горе няма странични ефекти, тъй като не променя външна променлива или не регистрира стойност. Освен това, без значение колко пъти го извиквате, той връща същата стойност за същия вход. Следователно това е чиста функция.

Други характеристики

Освен че имате постоянна възвръщаема стойност и не предизвиквате никакви странични ефекти, трябва да се придържате към следните правила, когато сте създаване на JavaScript функция че искаш да бъдеш чист:

  • Вашата функция не трябва да променя нито един от своите аргументи. Вместо това, ако някоя операция изисква мутация, направете копие на аргумента и мутирайте копието.
  • Вашата функция винаги трябва да има върната стойност. Ако вашата функция няма върната стойност или някакви странични ефекти, тя не може да направи нищо!
  • Вашата функция не трябва да зависи от никакво външно състояние.

Предимства на чистите функции

Чистите функции имат определени предимства пред нечистите функции, някои от които включват следното.

Тестваемост

Чистите функции са лесни за тестване, тъй като тяхното входно/изходно поведение е добре дефинирано. Освен това чистите функции не зависят от външно състояние или странични ефекти. Следователно можете да ги тествате изолирано, без да се притеснявате за каквито и да е зависимости или взаимодействия с други части на програмата.

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

Мемоизация

Тъй като чистите функции винаги произвеждат един и същ изход за един и същ вход и не произвеждат странични ефекти, можете лесно да ги запомните.

Като разчитате на тези свойства и използвате мемоизация, можете да кеширате резултата от чисто извикване на функция за конкретен вход. След това вашата функция може да върне кеширания резултат следващия път, когато бъде извикана със същия вход.

Запомняне на чисти функции може да подобри производителността на програмата, особено за скъпи изчисления, които многократно се занимават с един и същ вход, без да се притеснявате за намеса в състоянието на програмата.

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

Паралелност

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

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

Чисти функции срещу. Нечисти функции

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

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

Нечистите функции обаче създават предизвикателства при тестването и паралелността, но са полезни при работа с променливи структури от данни или при взаимодействие с външни системи и ресурси.