En hurtig introduktion til Functional Reactive Programming (FRP)

FRP repræsenterer et skæringspunkt mellem to programmeringsparadigmer. Men inden vi dybere ned i koncepterne, er vi nødt til at vide lidt mere om nogle grundlæggende udtryk.

Frp: reagerer på begivenheder

Imperativ programmering

Traditionelt skriver vi kode, der beskriver, hvordan det skal løse et problem. Hver kodelinie udføres sekventielt for at frembringe et ønsket resultat, der er kendt som imperativ programmering. Det bydende paradigme tvinger programmører til at skrive ”hvordan” et program vil løse en bestemt opgave. Bemærk, at i den forrige erklæring er nøgleordet "hvordan."

Her er et eksempel:

lad tal = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var numbersLessThanFive = [Int] ()
for indeks i 0 .. 

Som du kan se, udfører vi sekventielt en række instruktioner for at producere en ønsket output.

Funktionel programmering

Funktionel programmering er et programmeringsparadigme, hvor du modellerer alt som et resultat af en funktion, der undgår at ændre tilstand og mutere data. Vi vil diskutere koncepter som tilstand og datamutabilitet og deres betydning i efterfølgende sektioner, men som reference:

  • betragt tilstand som en af ​​de forskellige permutationer og kombinationer, som dit program kan have på et hvilket som helst tidspunkt under udførelsen
  • datamutabilitet er det koncept, hvor et givet datasæt kan ændre sig i et givet tidsrum under programudførelse.

Det samme eksempel, der blev givet ved imperativ programmering, kan bruges på følgende måde ved hjælp af den funktionelle tilgang:

lad tal = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let numbersLessThanFive = numbers.filter {$ 0 <5}

Vi fodrer filterfunktionen med en lukning, der indeholder et vist kriterium. Dette kriterium anvendes derefter til hvert element i talearrayet, og det resulterende array indeholder elementer, der opfylder vores kriterier.

Bemærk deklarationen af ​​de to arrays i begge eksempler.

I det første eksempel blev numrene LessThanFive-matrix erklæret som en var, mens i det andet eksempel blev den samme matrix erklæret som en let.

Ringer det nogle klokker?

Hvilken tilgang er bedre, hvilken matrix er mere sikker at arbejde med?

Hvad hvis mere end en tråd forsøger at arbejde med den samme matrix og dens elementer?

Er ikke et konstant array mere pålideligt?

Reaktiv programmering

Reaktiv programmering er fremgangsmåden ved programmering med asynkrone datastrømme eller begivenhedsstrømme. En begivenhedsstrøm kan være alt som tastaturindgange, knapper, bevægelser, GPS-lokaliseringsopdateringer, accelerometer og iBeacon. Du kan lytte til en strøm og reagere på den i overensstemmelse hermed.

Du har måske hørt om reaktiv programmering, men det har måske lød for skræmmende, skræmmende eller kryptisk til endda at prøve det. Du har måske set noget lignende:

var twoDimensionalArray = [[1, 2], [3, 4], [5, 6]]
lad flatArray = twoDimensionalArray.flatMap {array ind
    return array.map {heltal i
        returner heltal * 2
    }
}

udskrives (flatArray)

Output: [2, 4, 6, 8, 10, 12]

Ved første øjekast kan den foregående kode føles lidt uklar, og det kan være grunden til, at du vendte ryggen til denne programmeringsform. Reaktiv programmering, som vi nævnte tidligere, er programmering med begivenhedsstrømme.

Dog er det større spørgsmål stadig ubesvaret. Hvad er funktionel reaktiv programmering (FRP)?

FRP er en kombination af funktionelle og reaktive paradigmer. Med andre ord reagerer det på datastrømme ved hjælp af det funktionelle paradigme. FRP er ikke et værktøj eller et bibliotek - det ændrer den måde, du arkitekterer dine applikationer og den måde, du tænker på dine applikationer.

I den næste blog vil jeg tale om grundlæggende byggesten til reaktiv programmering - indtil da hold dig opdateret og nyd at læse :)

For at få et solidt greb om reaktive koncepter og skrive iOS-applikationer i RxSwift kan du læse min bog: Reaktiv programmering i Swift 4.

Flere af mine projekter og den downloadbare kode findes i mine offentlige github-repos

Du kan læse mere om emnet her

Tak, fordi du læste, del det venligst, hvis du fandt det nyttigt :)