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

Напишете

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

Нека да разгледаме един пример, да кажем, че искаме да изчислим 20% отстъпка от цената, можем да създадем три функции по следния начин:

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

По този начин резултатът от вътрешната функция се приема от външната функция като аргумент до края на веригата:

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

така нашият код става:

Нашата функция за композиране прави кода по-четлив и по-чист, но можем да го подобрим, за да приема повече от три функции с помощта на функцията от по-висок ред reduceRight:

това, което правим е, че с помощта на оператора spread трансформираме аргументите (нашите функции) в масив и връщаме нова функция, която приема аргумент „X“, който ще бъде използван като начална стойност на акумулатора на нашата функция reduceRight. По същество изпълняваме всяка функция, предадена като аргумент отдясно наляво, с резултата от предишната.

Така че, ако сега искаме да добавим нова функция, за да добавим префикс „$“ към нашата отстъпка, можем просто да я добавим към списъка с аргументи за съставяне

Тръбата

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

единствената разлика е, че reduceRight стана reduce. Лично аз предпочитам Compose пред Pipe, дори ако изглежда неинтуитивно на пръв поглед.

Крайният ни код ще бъде:

Рамда

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

Заключение

Надяваме се, че тази статия ви даде представа за предимствата на композирането на функции и как можете да го въведете в ежедневната си работа, ако имате въпроси, оставете коментар!