Compoziția funcțiilor

Funcții de încorporare

Compoziția este o tehnică care vă permite să luați două sau mai multe funcții simple și să le combinați într-o funcție mai complexă care execută subfuncții într-o ordine logică cu orice date.







Pentru a obține acest rezultat, puneți o funcție în interiorul celeilalte și efectuați operațiile funcției externe pe rezultatul funcției interne până când obțineți rezultatul. Și rezultatul poate fi diferit, în funcție de ordinea în care sunt aplicate funcțiile.

În acest exemplu, setăm funcția addOne (). Adăugând unul la argumentul trecut și funcția timesTwo (). înmulțind argumentul cu doi. Transmițând rezultatul unei funcții ca argument la o altă funcție, putem vedea cum încorporarea unei funcții în alta poate produce rezultate complet diferite, chiar și cu o singură valoare. Mai întâi, funcția internă este executată și apoi rezultatul este trecut la funcția externă.

Compoziție imperativă

Dacă doriți să efectuați o serie de operații de mai multe ori, este mai convenabil să specificați o nouă funcție care se aplică automat în primul rând și apoi o altă funcție mai mică. Aceasta ar putea arata cam asa:

În acest caz, am legat manual aceste două funcții într-o anumită ordine. Am creat o nouă funcție care atribuie mai întâi valoarea transferată titularului. apoi actualizează valoarea acestei variabile, trecând-o la rândul său la ambele funcții și returnând rezultatul.

În mod similar, dacă vrem să creăm o altă funcție nouă care cheamă două funcții mai mici în ordinea inversă, procedăm astfel:

Desigur, codul începe să arate destul de monoton. Două dintre noile noastre funcții compozite arată aproape identice, cu excepția ordinii de a apela funcții mai mici. Nu avem suficiente DRY. Utilizarea variabilelor temporare care își schimbă valorile nu este foarte funcțională, chiar dacă acestea sunt ascunse în interiorul funcțiilor compuse create.

În general, putem face mai bine.

Crearea unei compoziții funcționale

Să creați o funcție compusă care să poată prelua funcțiile existente și să le îmbină în ordinea de care avem nevoie. Pentru a face acest lucru într-o manieră consecventă, fără a juca de fiecare dată cu conținut intern, am decis să folosim ordinea în care funcțiile sunt transmise ca argumente.







Avem două opțiuni. Argumentele în ambele cazuri vor fi funcții și pot fi executate în orice ordine. Este necesar să fie definită, deoarece noua funcție oferită de noi compune (timesTwo, addOne) poate funcționa ca oriTwo (addOne ()). lectură argumente de la dreapta la stânga sau ca addOne (timesTwo ()) atunci când lectură argumente de la stânga la dreapta.

Avantajul executării argumentelor de la stânga la dreapta este că aceștia sunt citiți ca și text simplu în limba engleză, din același motiv am numit funcția noastră timesTwoAddOne (). pentru a arăta că multiplicarea în ea precede adăugarea. Știm cu toții importanța denumirii logice pentru a obține un cod clar lizibil.

În orice caz, ceea ce trebuie să facem este să transferăm mai întâi toate datele de configurare și, în final, datele pe care le vom folosi. Prin urmare, este mai rezonabil să citim și să aplicăm argumentele de la dreapta la stânga.

Așadar, putem crea o funcție de compoziție rudimentară. arata astfel:

Folosind o funcție foarte simplă de compunere, putem construi atât funcții complexe din exemplul nostru într-un mod mai simplu și asigurăm că rezultatul este același:

Deși funcționează această funcție de compunere simplă, aceasta nu ia în considerare o serie de probleme, ceea ce limitează flexibilitatea și aplicabilitatea acesteia. De exemplu, este posibil să avem nevoie de o compoziție cu mai mult de două funcții. De asemenea, pierdem această urmărire în timpul acestei funcții.

Putem rezolva aceste probleme, dar ele nu sunt necesare pentru înțelegerea principiului compoziției. În loc să scrieți versiunea proprie, ar putea fi mai productivă să moșteniți compoziția din una din biblioteci pentru programarea funcțională, cum ar fi Ramda. în care ordinea argumentelor de la dreapta la stânga este implementată în mod implicit.

Tipurile sunt responsabilitatea ta

Nu vă limitați la transferul de numere și nu vă limitați nici la salvarea unui tip de variabilă atunci când treceți de la o funcție la alta. Dar trebuie să vă asigurați că funcțiile din compoziția dvs. sunt gata să funcționeze cu orice valoare returnată de funcția anterioară.

Luați în considerare publicul dvs.

concluzie

Ca și în cazul tuturor tehnicilor de programare funcțională, este important să țineți cont de faptul că funcțiile compoziționale trebuie să fie curate. Pe scurt, aceasta înseamnă că, cu fiecare transfer de valoare specifică unei funcții, ea trebuie să întoarcă întotdeauna același rezultat și să nu producă efecte secundare, schimbând valorile în afara ei.

Un atașament de compoziție poate fi foarte convenabil atunci când aveți un set de funcționalități asemănătoare pe care doriți să le aplicați datelor și puteți rupe componentele acestei funcționalități în funcții reutilizabile și ușor de conectat.

Ca și restul tehnicilor de programare funcțională, compoziția ar trebui adăugată în mod judicios la codul existent pentru a se familiariza cu aceasta. Dacă faceți acest lucru corect, rezultatul va fi un cod mai clar, concis și lizibil. Nu asta ne dorim cu toții?







Articole similare

Trimiteți-le prietenilor: