Abstraktion og sammensætning

Smoke Art Cubes to Smoke - MattysFlicks - (CC BY 2.0)
Bemærk: Dette er en del af serien "Komponerende software" (nu en bog!) Om indlæring af funktionel programmering og kompositionssoftwareteknikker i JavaScript ES6 + fra bunden af. Bliv hængende. Der kommer meget mere af dette!

Jo mere jeg modnes i softwareudvikling, jo mere værdsætter jeg de grundlæggende elementer - indsigt, der syntes trivielt, da jeg var nybegynder, men som nu har en dybtgående betydning med fordel af oplevelsen.

"I kampkampen i Karate [...] er symbolet på stolthed for et sort bælte at bære det længe nok, så farvestoffet falmer til hvidt for at symbolisere at vende tilbage til begynderstaten." ~ John Maeda, "The Laws of Simplicity : Design, teknologi, forretning, liv ”

Abstraktion er "processen med at overveje noget uafhængigt af dets foreninger, attributter eller konkrete akkompagnement," ifølge Google ordbog.

Ordet abstraktion kommer fra det latinske verb abstrahere, hvilket betyder ”at trække sig væk”. Jeg kan godt lide denne indsigt. Abstraktion handler om at fjerne ting - men hvad fjerner vi, og i hvilket mål?

Nogle gange kan jeg godt lide at oversætte ord til andre sprog og derefter oversætte dem tilbage til engelsk for at få en fornemmelse af andre foreninger, som vi ikke tænker over på engelsk. Når jeg oversætter "abstraktion" til jiddisk og tilbage, er resultatet "fraværende". Jeg kan også godt lide dette. En fraværende person kører på autopilot og tænker ikke aktivt på, hvad de laver… bare gør det.

Abstraktion lader os køre på autopilot, sikkert. Al software er automatisering. Givet nok tid, alt hvad du laver på en computer, kan du gøre med papir, blæk og bæreduer. Software tager bare sig af alle de små detaljer, der ville være for tidskrævende at gøre manuelt.

Al software er abstraktion, gemmer alt det hårde arbejde og mindless detaljer, mens vi høster fordelene.

En masse softwareprocesser gentages igen og igen. Hvis vi i løbet af problemet nedbrydning fase, vi besluttede at genimplementere de gentagne ting igen og igen, ville det kræve en masse unødvendigt arbejde. Det ville i det mindste være fjollet. I mange tilfælde ville det være upraktisk.

I stedet fjerner vi dobbeltarbejde ved at skrive en komponent af en eller anden art (en funktion, modul, klasse osv.), Give den et navn (identitet) og genbruge den så mange gange, som vi vil.

Processen med nedbrydning er abstraktionsprocessen. Succesfuld abstraktion indebærer, at resultatet er et sæt uafhængigt nyttige og omkomponerbare komponenter. Fra dette får vi et vigtigt princip i softwarearkitektur:

Softwareløsninger skal kunne nedbrydes i deres komponentdele og omkomponeres til nye løsninger uden at ændre detaljerne om implementering af interne komponenter.

Abstraktion er forenklingens handling

"Enkelhed handler om at trække det åbenlyse og tilføje det meningsfulde." ~ John Maeda, "The Laws of Simplicity: Design, Technology, Business, Life"

Processen med abstraktion har to hovedkomponenter:

  • Generalisering er processen med at finde ligheder (det åbenlyse) i gentagne mønstre og skjule lighederne bag en abstraktion.
  • Specialisering er processen med at bruge abstraktionen og kun levere det, der er forskelligt (det meningsfulde) for hver brugssag.

Abstraktion er processen med at udtrække den underliggende essens i et koncept. Ved at udforske fælles grundlag mellem forskellige problemer fra forskellige domæner lærer vi, hvordan vi træder uden for vores hovedrum et øjeblik og ser et problem fra et andet perspektiv. Når vi ser essensen af ​​et problem, finder vi ud af, at en god løsning kan gælde for mange andre problemer. Hvis vi koder løsningen godt, kan vi radikalt reducere vores applikations kompleksitet.

"Hvis du rører ved en ting med dyb bevidsthed, rører du alt." ~ Thich Nhat Hanh

Dette princip kan bruges til radikalt at reducere den kode, der kræves for at oprette en applikation.

Abstraktion i software

Abstraktion i software har mange former:

  • Algoritmer
  • Datastrukturer
  • moduler
  • Klasser
  • rammer

Og min personlige favorit:

”Nogle gange er den elegante implementering bare en funktion. Ikke en metode. Ikke en klasse. Ikke en ramme. Bare en funktion. ”~ John Carmack (Id Software, Oculus VR)

Funktioner laver store abstraktioner, fordi de besidder de kvaliteter, der er afgørende for en god abstraktion:

  • Identitet - Evnen til at tildele et navn til det og genbruge det i forskellige sammenhænge.
  • Komposition - Evnen til at komponere enkle funktioner for at danne mere komplekse funktioner.

Abstraktion gennem komposition

De mest nyttige funktioner til abstraktion i software er rene funktioner, der deler modulære egenskaber med funktioner fra matematik. I matematik returnerer en funktion, der får de samme input altid den samme output. Det er muligt at se funktioner som forhold mellem input og output. Givet nogle input A vil en funktion f producere B som output. Man kan sige, at f definerer et forhold mellem A og B:

f: A -> B

Ligeledes kunne vi definere en anden funktion, g, der definerer et forhold mellem B og C:

g: B -> C

Dette indebærer en anden funktion h, der definerer et forhold direkte fra A til C:

h: A -> C

Disse forhold danner strukturen i problemrummet, og den måde, du komponerer funktioner i din ansøgning på, udgør strukturen i din ansøgning.

Gode ​​abstraktioner forenkles ved at skjule struktur, på samme måde som h reducerer A -> B -> C ned til A -> C.

Sådan gør du mere med mindre kode

Abstraktion er nøglen til at gøre mere med mindre kode. Forestil dig for eksempel, at du har en funktion, der blot tilføjer to tal:

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

Men du bruger det ofte til at øge, det kan være fornuftigt at rette et af disse tal:

const a = tilføj (1, 1);
const b = tilføjelse (a, 1);
const c = tilføjelse (b, 1);
// ...

Vi kan curry tilføjelsesfunktionen:

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

Og derefter oprette en delvis applikation, anvende funktionen til dets første argument og returnere en ny funktion, der tager det næste argument:

const inc = tilføj (1);

Nu kan vi bruge inc i stedet for at tilføje, når vi har brug for at øge med 1, hvilket reducerer den krævede kode:

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

I dette tilfælde er inc bare en specialiseret version af tilføjelse. Alle karryfunktioner er abstraktioner. Faktisk er alle funktioner i højere orden generaliseringer, som du kan specialisere ved at videregive et eller flere argumenter.

For eksempel er Array.prototype.map () en funktion af højere orden, der abstraherer ideen om at anvende en funktion til hvert element i en matrix for at returnere en ny række behandlede værdier. Vi kan skrive kort som en curried funktion for at gøre dette mere tydeligt:

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

Denne version af kortet tager specialiseringsfunktionen og returnerer derefter en specialiseret version af sig selv, der tager den matrix, der skal behandles:

const f = n => n * 2;
const doubleAll = kort (f);
const fordoblet = doubleAll ([1, 2, 3]);
// => [2, 4, 6]

Bemærk, at definitionen af ​​doubleAll krævede en triviel mængde kode: kort (f) - det er det! Det er hele definitionen. Fra og med nyttige abstraktioner som vores byggesten, kan vi konstruere temmelig kompleks opførsel med meget lidt ny kode.

Konklusion

Softwareudviklere bruger hele deres karrierer på at skabe og komponere abstraktioner - mange uden et grundlæggende greb om abstraktion eller komposition.

Når du opretter abstraktioner, skal du være bevidst om det, og du skal være opmærksom på de gode abstraktioner, der allerede er gjort tilgængelige for dig (f.eks. Det altid nyttige kort, filter og reducering). Lær at genkende egenskaber ved gode abstraktioner:

  • Enkel
  • Kortfattet
  • Genanvendelig
  • Uafhængig
  • nedbrydelige
  • Recomposable

Lær mere på EricElliottJS.com

Videolektioner om funktionel programmering er tilgængelige for medlemmer af EricElliottJS.com. Hvis du ikke er medlem, tilmeld dig i dag.

Eric Elliott er forfatteren af ​​“Programmering JavaScript Applications” (O’Reilly) og medstifter af software mentorskabsplatformen DevAnywhere.io. Han har bidraget til softwareoplevelser for Adobe Systems, Zumba Fitness, The Wall Street Journal, ESPN, BBC og topindspilningskunstnere, herunder Usher, Frank Ocean, Metallica og mange flere.

Han arbejder fjernt fra hvor som helst med den smukkeste kvinde i verden.