Abstrakcija ir kompozicija

Dūmų meno kubai rūkyti - „MattysFlicks“ (CC BY 2.0)
Pastaba: Tai „Programinės įrangos kūrimo“ serijos (dabar knyga!), Susijusios su funkcinio programavimo ir kompozicinės programinės įrangos metodų mokymu „Java ES6 +“, dalis nuo pat pradžių. Stebėkite. Tai dar daug daugiau!

Kuo labiau subrendu programinės įrangos kūrimui, tuo labiau vertinu pagrindus - įžvalgas, kurios, kai buvau pradedančioji, atrodė nereikšmingos, tačiau dabar turi didelę reikšmę, naudodamas patirtį.

„Karatė kovos mene [...] juodo diržo pasididžiavimo simbolis yra dėvėti jį pakankamai ilgai, kad dažai išbluktų iki baltos spalvos, kad simbolizuotų grįžimą į pradedančiąją.“ ~ Johnas Maeda, „Paprastumo įstatymai“ : Dizainas, technologijos, verslas, gyvenimas “

Anot „Google“ žodyno, abstrakcija yra „proceso svarstymas neatsižvelgiant į jo asociacijas, požymius ar konkrečius priedus“.

Žodis abstrakcija kilęs iš lotyniško veiksmažodžio abstrahere, reiškiančio „atitraukti“. Man patinka ši įžvalga. Abstrakcija yra susijusi su daiktų pašalinimu, bet ką mes pašaliname ir kokiu tikslu?

Kartais norėčiau išversti žodžius į kitas kalbas, tada išversti juos atgal į anglų kalbą, kad pajaučiau kitas asociacijas, apie kurias dažniausiai negalvojame angliškai. Kai aš išvedu „abstrakciją“ į jidiš ir atgal, rezultatas „nepastebėtas“. Man taip pat patinka. Žmogus, kuriam nedalyvauja automobilyje, veikia autopilotu, o ne galvoja apie tai, ką daro ... tiesiog daro.

Abstrakcija leidžia mums saugiai važiuoti autopilotu. Visa programinė įranga yra automatizuota. Turėdami pakankamai laiko viskam, ką darote kompiuteriui, galėtumėte padaryti popierių, rašalą ir balandžius. Programinė įranga tiesiog rūpinasi visomis smulkmenomis, kurias atlikti rankiniu būdu būtų per daug laiko.

Visa programinė įranga yra abstrakcija, slepianti visą sunkų darbą ir neprotingas detales, kol mes naudosimės.

Daugybė programinės įrangos procesų kartojasi vėl ir vėl. Jei problemos išskaidymo etape nusprendėme vėl ir vėl pakartoti pakartotus dalykus, tam prireiks daug nereikalingo darbo. Tai bent jau būtų kvaila. Daugeliu atvejų tai būtų nepraktiška.

Vietoj to pašaliname dubliavimąsi, parašydami kažkokį komponentą (funkciją, modulį, klasę ir pan.), Suteikdami jam pavadinimą (tapatybę) ir pakartotinai naudodami jį tiek kartų, kiek mums patinka.

Skilimo procesas yra abstrakcijos procesas. Sėkmingas abstrakcija reiškia, kad rezultatas yra nepriklausomai naudingų ir kompozicinių komponentų rinkinys. Iš to mes gauname svarbų programinės įrangos architektūros principą:

Programinės įrangos sprendimai turėtų būti skaidomi į sudėtines dalis, o iš naujo - į naujus sprendimus, nekeičiant vidinių komponentų diegimo detalių.

Abstrakcija yra supaprastinimas

„Paprastumas reiškia akivaizdaus atėmimą ir prasmingumo pridėjimą.“ ~ Johnas Maeda, „Paprastumo įstatymai: dizainas, technologijos, verslas, gyvenimas“

Abstrakcijos procesą sudaro dvi pagrindinės dalys:

  • Apibendrinimas yra panašumų (akivaizdžių) radimas pasikartojančiuose modeliuose ir panašumų paslėpimas abstrakcijos metu.
  • Specializacija yra abstrakcijos panaudojimo procesas, kiekvienam naudojimo atvejui pateikiant tik tai, kas skiriasi (prasminga).

Abstrakcija yra pagrindinės koncepcijos esmės išskleidimo procesas. Tyrinėdami bendrą skirtingų sričių problemų pagrindą, mes sužinojome, kaip trumpam išeiti už galvos ribų ir pamatyti problemą iš kitos perspektyvos. Pamatę problemos esmę pastebime, kad geras sprendimas gali būti pritaikytas daugeliui kitų problemų. Jei gerai užkoduosime sprendimą, galime radikaliai sumažinti mūsų programos sudėtingumą.

„Jei giliai suprantate vieną dalyką, paliečiate viską.“ ~ Thich Nhat Hanh

Šis principas gali būti naudojamas radikaliai sumažinti kodą, reikalingą programai sukurti.

Programinės įrangos abstrakcija

Programinės įrangos abstrakcija gali būti įvairių formų:

  • Algoritmai
  • Duomenų struktūros
  • Moduliai
  • Klasės
  • Karkasai

Ir mano asmeninis mėgstamiausias:

„Kartais elegantiškas įgyvendinimas yra tik funkcija. Ne metodas. Ne klasė. Ne rėmai. Tiesiog funkcija. “~ Johnas Carmackas („ Id Software “,„ Oculus VR “)

Funkcijos daro dideles abstrakcijas, nes jos turi tas savybes, kurios yra būtinos gerai abstrakcijai:

  • Tapatybė - galimybė priskirti jam vardą ir pakartotinai jį naudoti skirtinguose kontekstuose.
  • Kompozicija - galimybė komponuoti paprastas funkcijas, kad būtų suformuotos sudėtingesnės funkcijos.

Abstrakcija per kompoziciją

Naudingiausios programinės įrangos abstrakcijos funkcijos yra grynos funkcijos, kurioms būdingos modulinės charakteristikos ir matematikos funkcijos. Matematikoje funkcija, kuriai suteikiamos tos pačios įvestys, visada grąžins tą patį išvestį. Galima pamatyti funkcijas kaip sąsajas tarp įėjimų ir išėjimų. Atsižvelgiant į tam tikrą įvestį A, funkcija f sugeneruos B kaip išvestį. Galima sakyti, kad f nusako santykį tarp A ir B:

f: A -> B

Panašiai galėtume apibrėžti ir kitą funkciją g, kuri nusako ryšį tarp B ir C:

g: B -> C

Tai reiškia kitą funkciją h, kuri tiesiogiai apibūdina ryšį nuo A iki C:

h: A -> C

Šie santykiai sudaro probleminės erdvės struktūrą, o tai, kaip jūs komponuojate savo programos funkcijas, formuoja jūsų programos struktūrą.

Geros abstrakcijos supaprastina paslėpdamos struktūrą, tuo pačiu būdu h sumažina A -> B -> C iki A -> C.

Kaip padaryti daugiau su mažesniu kodu

Abstrakcija yra raktas, norint padaryti daugiau, naudojant mažiau kodo. Pvz., Įsivaizduokite, kad turite funkciją, kuri tiesiog prideda du skaičius:

const add = (a, b) => a + b;

Bet jei dažnai naudojate padidindami, gali būti prasminga nustatyti vieną iš šių skaičių:

const a = sudėti (1, 1);
const b = sudėti (a, 1);
const c = sudėti (b, 1);
// ...

Pridėjimo funkciją galime paanalizuoti:

const add = a => b => a + b;

Tada sukurkite dalinę programą, pritaikydami funkciją pirmajam argumentui ir grąžindami naują funkciją, kuri imsis kito argumento:

const inc = pridėti (1);

Dabar galime naudoti ink, o ne pridėti, kai reikia padidinti 1, o tai sumažina reikalingą kodą:

const a = inc (1);
const b = inc (a);
const c = inc (b);
// ...

Šiuo atveju ink yra tik specializuota papildymo versija. Visos kreivos funkcijos yra abstrakcijos. Tiesą sakant, visos aukštesnės eilės funkcijos yra apibendrinimai, kuriuos galite specializuoti pateikdami vieną ar kelis argumentus.

Pavyzdžiui, Array.prototype.map () yra aukštesnės eilės funkcija, kuri apibendrina mintį pritaikyti funkciją kiekvienam masyvo elementui, kad būtų grąžintas naujas apdorotų verčių masyvas. Galime parašyti žemėlapį kaip kreivą funkciją, kad tai būtų akivaizdu:

const map = f => arr => arr.map (f);

Ši žemėlapio versija užima specializacinę funkciją ir grąžina specializuotą versiją, kuri pateikia masyvą apdoroti:

const f = n => n * 2;
const doubleAll = žemėlapis (f);
const dvigubai = doubleAll ([1, 2, 3]);
// => [2, 4, 6]

Atminkite, kad norint apibrėžti „doubleAll“ reikėjo nedidelio kodo kiekio: žemėlapis (f) - viskas! Tai yra visas apibrėžimas. Pradėję nuo naudingų abstrakcijų, kaip mūsų elementų, galime sukurti gana sudėtingą elgesį su labai mažai naujo kodo.

Išvada

Programinės įrangos kūrėjai visą savo karjerą praleidžia kurdami ir komponuodami abstrakcijas - daugelis jų neturi gero esminio supratimo apie abstrakciją ar kompoziciją.

Kurdami abstrakcijas turėtumėte apie tai apgalvoti ir turėtumėte žinoti apie gerąsias abstrakcijas, kurios jums jau buvo prieinamos (pvz., Visada naudingą žemėlapį, filtrą ir mažinimą). Išmokite atpažinti gerų abstrakcijų savybes:

  • Paprasta
  • Trumpai
  • Daugkartinio naudojimo
  • Nepriklausomas
  • Skaidomas
  • Perkomponuojamas

Sužinokite daugiau EricElliottJS.com

EricElliottJS.com nariams yra vaizdo įrašų pamokos apie funkcinį programavimą. Jei nesate narys, prisiregistruokite šiandien.

Erikas Elliotas yra „JavaScript Programming Programming“ („O'Reilly“) autorius ir programinės įrangos palaikymo platformos „DevAnywhere.io“ įkūrėjas. Jis prisidėjo prie programinės įrangos patirties „Adobe Systems“, „Zumba Fitness“, „The Wall Street Journal“, ESPN, BBC ir geriausių įrašų atlikėjų, įskaitant Usherį, Franką Okeaną, „Metallica“ ir daugelį kitų.

Jis dirba toli nuo bet kurios pasaulio vietos su pačia gražiausia moterimi.