Рад са чистим функцијама може бити много мање стресан, јер их можете лако тестирати и размишљати о њима са више самопоуздања.

Чисте функције су функције које не производе нуспојаве и, када се позову са истим улазним параметрима, увек враћају исти излаз.

Можете користити чисте функције да бисте осигурали да је ваш код чист, одржаван и тестиран. Ове функције су идеалне за ове задатке јер су предвидљиве и не мењају спољна стања.

Такође су лакши за отклањање грешака, што их чини корисним у развоју сложених софтверских система. Овде ћете истражити чисте функције у ЈаваСцрипт-у, њихове карактеристике и предности.

Карактеристике чисте функције

За функција да би био „чист“, мора да задовољи неколико захтева.

Константна повратна вредност

Чиста функција треба увек да враћа исту вредност са истим уносом, без обзира на то колико пута је позвана.

На пример, размотрите функцију испод:

функцијаумножити(а, б) {
повратак а * б;
}

Тхе умножити функција у горњем примеру ће увек враћати производ своја два аргумента. С обзиром на исти скуп аргумената, има константну повратну вредност.

Позивање ове функције неколико пута са истим аргументима ће дати исти излаз сваки пут. На пример:

множи (2, 3); // враћа 6
множи (2, 3); // враћа 6
множи (2, 3); // враћа 6

Алтернативно, размотрите пример у наставку:

функцијамултиплиРандомНумбер(бр) {
повратак број * Матх.под(Матх.рандом() * 10);
}

помножи случајни број(5); // Непредвидиви резултати
помножи случајни број(5); // Непредвидиви резултати
помножи случајни број(5); // Непредвидиви резултати

Тхе мултиплиРандомНумбер функција изнад ће вратити различите резултате сваки пут када је позовете, чинећи је нечистом. Резултати ове функције су непредвидиви, па је тестирање компоненти које се ослањају на њу тешко.

Нема нежељених ефеката

Чиста функција не сме производити никакве нежељене ефекте. Споредни ефекат се односи на било коју модификацију стања или понашања изван делокруга функције, као што је модификовање глобалних променљивих, излаза конзоле, мрежних захтева или ДОМ манипулације.

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

На пример, размотрите пример у наставку:

дозволити цоунт = 0;

функцијаприраст() {
цоунт++;
конзола.лог (број);
}

инцремент(); // Дневници 1
инцремент(); // Дневници 2
инцремент(); // Дневници 3

Тхе прираст функција у овом примеру има споредни ефекат модификације цоунт променљива ван свог делокруга. Такође се пријављује на конзолу.

Ова функција није чиста јер има споредни ефекат, што може отежати предвиђање њеног излаза и тестирање у изолацији. Да бисте га учинили чистим, можете га модификовати тако да га унесете цоунт променљиву као аргумент и врати увећану вредност без измене било каквог спољашњег стања.

Овако:

функцијаприраст(цоунт) {
повратак цоунт + 1;
}

повећање (1); // враћа 2
повећање (1); // враћа 2
повећање (1); // враћа 2

Верзија за прираст функција у горњем примеру нема нежељене ефекте јер не мења ниједну спољну променљиву нити бележи било коју вредност. Поред тога, без обзира колико пута га позовете, он враћа исту вредност за исти улаз. Дакле, то је чиста функција.

Остале карактеристике

Поред тога што имате константну повратну вредност и не изазивате никакве нежељене ефекте, требало би да се придржавате следећих правила када сте креирање ЈаваСцрипт функције да желиш да будеш чист:

  • Ваша функција не сме да мења ниједан од својих аргумената. Уместо тога, ако било која операција захтева мутацију, направите копију аргумента и мутирајте копију.
  • Ваша функција мора увек имати повратну вредност. Ако ваша функција нема повратну вредност или било какве споредне ефекте, не може ништа да уради!
  • Ваша функција не сме зависити ни од каквог спољашњег стања.

Предности чистих функција

Чисте функције имају одређене предности у односу на нечисте функције, од којих неке укључују следеће.

Тестабилити

Чисте функције је лако тестирати јер је њихово улазно/излазно понашање добро дефинисано. Такође, чисте функције не зависе од спољашњег стања или нежељених ефеката. Стога их можете тестирати изоловано без бриге о било каквим зависностима или интеракцијама са другим деловима програма.

Насупрот томе, тестирање нечистих функција које зависе од спољашњег стања или производе нежељене ефекте може бити изазовније јер њихово понашање може зависити од стања програма или других спољних фактора. Ово може отежати креирање свеобухватних тест случајева и осигурати да се функција исправно понаша у свим сценаријима.

Мемоизатион

Пошто чисте функције увек производе исти излаз за исти улаз и не производе нежељене ефекте, можете их лако меморисати.

Ослањајући се на ова својства и користећи мемоизацију, можете кеширати резултат чистог позива функције за одређени улаз. Ваша функција тада може да врати кеширани резултат следећи пут када буде позвана са истим улазом.

Меморирање чистих функција може побољшати перформансе програма, посебно за скупа израчунавања која се стално баве истим улазом, без бриге о сметњама у стању програма.

Насупрот томе, нечисте функције могу произвести различите резултате за исти улаз, у зависности од стања програма или спољних фактора. Ово их чини изазовним за меморисање јер кеширани резултат можда више неће бити важећи ако се зависности функције или спољно стање промене између позива.

Конкуренција

Пошто чисте функције не модификују ниједно спољашње стање нити производе било какве споредне ефекте, оне су безбедне за нити. Можете их покретати истовремено без бриге о условима трке или проблемима са синхронизацијом.

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

Чисте функције вс. Нечисте функције

Можете писати програме користећи комбинацију чистих и нечистих функција, пошто сваки тип има своју употребу.

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

Међутим, нечисте функције представљају изазове у тестирању и конкурентности, али су корисне када радите са променљивим структурама података или у интеракцији са спољним системима и ресурсима.