11-lekciya_paradigma_qq
.pdf11-lekciya. Funkcionallıq programmalastırıw. Joqarı tártipli funkciyalar.
Jobası:
1."Birinshi dárejeli obyektler" túsinigi hám funkciyalardıń mánis retinde qollanılıwı.
2.Joqarı tártipli funkciyalardıń (HOF) anıqlaması hám túrleri.
3.Funkciyanı argument retinde uzatıw: Callback hám abstrakciya.
4.Funkciyanı nátiyje retinde qaytarıw: Funkciya fabrikaları hám Karri usılı
(Currying).
Funkciyalardıń statusı hám "Joqarı tártipli" túsinigi
Funkcionallıq programmalastırıwdıń eń tiykarǵı hám kúshli quralı – bul
"Joqarı tártipli funkciyalar" (Higher-Order Functions - HOF). Bul túsinikti tolıq ańlaw ushın, dáslep programmalastırıw tilinde funkciyalardıń qanday statusqa iye ekenin biliw kerek. Imperativ tillerdiń dáslepki versiyalarında funkciyalar tek buyrıqlar jıyındısı bolıp, olar maǵlıwmatlardan (sanlar, qatarlar) ajıratılǵan edi. Biraq funkcionallıq paradigmada funkciyalar "Birinshi dárejeli obyektler" (FirstClass Citizens) dep ataladı. Yaǵnıy – funkciyanı ápiwayı san yamasa tekst sıyaqlı ózgeriwshige menshiklewge, basqa funkciyaǵa argument etip beriwge hám funkciyanıń nátiyjesi retinde qaytarıwǵa boladı degen sóz. "Joqarı tártipli funkciya" matematikalıq analizden kelip shıqqan túsinik bolıp, ol eki tiykarǵı qásiyettiń eń keminde birewine iye bolıwı kerek: birinchiden, ol bir yamasa bir neshe funkciyanı argument retinde qabıllawı múmkin; ekinchiden, ol nátiyje retinde jańa funkciyanı qaytarıwı múmkin. Eger funkciya tek ápiwayı maǵlıwmatlar (sanlar, qatarlar) menen islese hám ápiwayı maǵlıwmat qaytarsa, ol "Birinshi tártipli funkciya" dep ataladı. HOF programmistke tek maǵlıwmatlardı ǵana emes, al "háreketlerdi" (logikanı) de abstrakciyalawǵa hám basqarıwǵa imkaniyat beredi. Bul kodtıń qayta qollanılıw dárejesin jańa basqıshqa kóteredi.
Bul túsiniktiń ámeliy mánisi abstrakciyanıń kúsheyiwinde kórinedi. Mısalı, bizde massivtiń elementlerin qayta isleytuǵın kod bar deyik. Imperativ usılda biz massivti aylanıp shıǵıw (cikl) hám onıń ishindegi elementti ózgertiw (logika) kodın bir jerge jazamız. HOF arqalı biz bul eki processti ajıratamız: massivti aylanıp shıǵıw wazıypasın bir joqarı tártipli funkciyaǵa (mısalı, map) júkleymiz, al elementti qalay ózgertiw kerekligin (mısalı, kvadratslaw) kishi funkciya retinde oǵan uzatamız. Bul jerde map – joqarı tártipli funkciya, sebebi ol basqa bir funkciyanı jumıs quralı retinde qabıllap atır.
Joqarı tártipli funkciyalardı kárxana menedjerine uqsatıwǵa boladı. Ápiwayı jumısshı (birinshi tártipli funkciya) anıq bir detallardı jasaw menen shuǵıllanadı. Al menedjer (HOF) detallardı jasamaydı, ol jumısshılarǵa (basqa funkciyalarǵa) ne islew kerekligin buyıradı yamasa jańa jumısshı toparların dúzedi. Menedjerdiń qolında resurslar (maǵlıwmatlar) hám jumısshılar (algoritmler) bar, olardı durıs kombinaciyalaw arqalı quramalı proektlerdi ámelge asıradı. Sol sıyaqlı, HOF-lar funkciyalardı basqarıwshı "metodlar" bolıp tabıladı.
Funkciyanı argument retinde qabıllaw
Joqarı tártipli funkciyalardıń eń keń tarqalǵan túri – bul basqa funkciyalardı argument (parametr) retinde qabıllaytuǵın funkciyalar. Bul usıl "Callback" (Keri shaqırıw) mexanizminiń tiykarı bolıp tabıladı. Biz bir funkciyanı shaqırǵanda, oǵan qosımsha ekinshi funkciyanı berip jiberemiz hám "jumısıń pitkennen keyin usı ekinshi funkciyanı qollan" dep aytamız. Bul ásirese asinxron programmalastırıwda (JavaScript, Web) keń qollanıladı. Mısalı, serverden maǵlıwmat alıw funkciyasına biz "nátiyje kelgende onı ekranda kórset" degen funkciyanı argument etip beremiz.
Bul usıl "Strategiya" (Strategy Pattern) proektlestiriw úlgisin ápiwayı túrde ámelge asırıwǵa járdem beredi. Mısalı, bizde sort (sortlaw) degen funkciya bar. Biz onıń ishindegi sortlaw algoritmin (QuickSort, MergeSort) ózgertpesten, tek salıstırıw logikasın ózgertkimiz keledi. Biz sort funkciyasına compare (salıstırıw) degen funkciyanı argument etip beremiz. Eger biz (a, b) => a - b funkciyasın bersek, sanlar ósiw tártibinde sortlanadı, eger (a, b) => b - a bersek, kemeyiw tártibinde sortlanadı. Yaǵnıy, tiykarǵı funkciyanıń minez-qulqı oǵan berilgen argument-funkciyaǵa qaray dinamikalıq túrde ózgeredi.
Bunday jaǵdaylarda kóbinese "Anonim funkciyalar" yamasa "Lambda ańlatpaları" qollanıladı. Joqarı tártipli funkciyaǵa kishi, bir retlik logikanı beriw ushın oǵan bólek atama berip, aldın ala járiyalaw shárt emes. Kodtıń oqılıwın jaqsılaw ushın logika tikkeley argument ornına jazıladı. Mısalı, dizimnen jup sanlardı tańlap alıwshı filter funkciyasına biz x -> x % 2 == 0 degen qısqa lambda ańlatpasın beremiz. Bul jerde filter – joqarı tártipli funkciya, al lambda – oǵan berilgen kórsetpe.
Funkciyanı argument retinde alıw kodtıń "Universallıǵın" arttıradı. Eger biz tek qosıw ámeli ushın funkciya jazsaq (sum), ol tek qosıwdı biledi. Biraq biz "eki sannıń ústinde qanday da bir ámel orınlaw" (calculate) degen funkciya jazıp, oǵan "ámeldi" (qosıw, alıw, kóbeytiw funkciyasın) sırtqan bersek, bul funkciya hár qanday matematikalıq operaciyanı orınlay alatuǵın universal quralǵa aylanadı. Bul princip standart kitapxanalardıń (Standard Libraries) tiykarın quraydı, olar bizge "skelet" funkciyalardı beredi, al biz olarǵa ózimizdiń biznes-logikamızdı argument retinde "kirgizemiz".
Funkciyanı nátiyje retinde qaytarıw hám Karri usılı
Joqarı tártipli funkciyalardıń ekinshi, sál quramalıraq kórinisi – bul basqa funkciyanı nátiyje (return value) retinde qaytarıw. Bul "Funkciya generatorları" yamasa "Fabrikalar" dep ataladı. Mısalı, bizge hár túrli dárejege (kvadrat, kub, 4- dáreje) kóteriwshi funkciyalar kerek. Hárbiri ushın bólek funkciya jazıwdıń ornına, biz createPower(n) degen funkciya jazamız. Eger biz createPower(2) dep shaqırsaq, ol bizge sanlardı kvadratqa kóteretuǵın jańa funkciyanı jasap qaytaradı. Bul qaytarılǵan funkciyanı keyinirek programma dawamında qollana beremiz.
Bul process "Jabılıw" (Closure) túsinigi menen tıǵız baylanıslı. Funkciya basqa bir funkciyanı qaytarǵanda, jańa funkciya ózi jaratılǵan ortalıqtaǵı
ózgeriwshilerdi "yadında saqlap qaladı". Joqarıdaǵı mısalda, createPower(2) shaqırılǵanda, 2 sanı (n) ishki funkciyanıń yadına saqlanıp qaladı. Qaytarılǵan funkciya keyin qashan shaqırılsa da, sol n=2 mánisin qollanadı. Bul maǵlıwmatlardı (konfiguraciyanı) logika menen biriktiriwdiń eń qáwipsiz hám elegant jolı bolıp tabıladı. Usı principtiń eń ataqlı qollanılıwı – bul "Karri usılı" (Currying). Karriing – bul kóp argumentli funkciyanı bir argumentli funkciyalar dizbegine aylandırıw procesi. Mısalı, f(a, b, c) degen funkciyanı f(a)(b)(c) kórinisine ótkiziw. Bunda f(a) shaqırılǵanda, ol bizge (b, c) argumentlerin kútetuǵın jańa funkciya qaytaradı hám process usılay dawam etedi. Bul ne ushın kerek? Bul "Bólek qollanıw" (Partial Application) imkaniyatın beredi. Biz funkciyanıń dáslepki argumentlerin berip, onıń arnawlı versiyasın jaratıp alıp, qalǵan argumentlerin keyinirek, basqa jerde beriwińiz múmkin.
Juwmaqlap aytqanda, Joqarı tártipli funkciyalar – zamanagóy programmalastırıwdıń ajıralmas bólegi. Olar tek funkcionallıq tillerde (Haskell, Lisp) ǵana emes, al JavaScript, Python, C#, Java hám Kotlin sıyaqlı ataqlı tillerde de keńnen qollanıladı. HOF kodtıń qaytalanıwın azaytadı, onıń strukturasın ıqshamlaydı hám deklarativ stildi (mısalı, data.map().filter().reduce()) qollanıwǵa múmkinshilik beredi. Eger siz HOF-tı durıs qollana bilseńiz, siz tek kod jazıwshı emes, al "kod generaciya etetuǵın kod" jazıwshı qánigege aylanasız.
BAQLAW SORAWLARÍ:
1."Birinshi dárejeli obyektler" (First-class citizens) degende funkciyalardıń qanday qásiyetleri túsiniledi?
2.Joqarı tártipli funkciya (HOF) bolıwı ushın funkciya qanday eki shárttiń birine juwap beriwi kerek?
3.Callback mexanizmi qalay isleydi hám ol HOF penen qanday baylanısqa iye?
4."Jabılıw" (Closure) degen ne hám ol funkciya qaytarıwshı HOF-larda qanday rol oynaydı?
5.Karri usılı (Currying) hám ápiwayı kóp argumentli funkciyanıń ayırmashılıǵı nede?
