Under en intervju i veckan fick jag frågan ”vad är skillnaden mellan funktionell, objektorienterad och procedurell programmering” och för att vara ärlig visste jag inte riktigt hur jag skulle svara på den frågan (och det var första gången jag hörde talas om procedurell programmering…). Så idag bestämde jag mig för att göra lite forskning och (försöka) förstå vad som är de viktigaste skillnaderna.
Låt oss börja med några definitioner:
” Funktionell programmering (FP) är ett programmeringsparadigm – en stil för att bygga upp dataprogrammens struktur och element – som behandlar beräkning som utvärdering av matematiska funktioner och undviker data med föränderligt tillstånd och mutabla data.” – Wikipedia
” Objektorienterad programmering (OOP) är ett programmeringsparadigm som bygger på begreppet ”objekt”, som kan innehålla data, i form av fält, ofta kända som attribut, och kod, i form av procedurer, ofta kända som metoder.” – Wikipedia
” Procedurell programmering är ett programmeringsparadigm som härstammar från strukturerad programmering och som bygger på begreppet proceduranrop. Procedurer, även kallade rutiner, underrutiner eller funktioner, innehåller helt enkelt en serie beräkningssteg som ska utföras.” – Wikipedia
Okej, det var en introduktion, men låt oss gå in lite mer i detalj.
För det första, vad är ett programmeringsparadigm? Det är en programmeringsstil, ett sätt att tänka på programvarukonstruktion. Ett programmeringsparadigm hänvisar inte till ett specifikt språk utan snarare till ett sätt att programmera, en metodik. Vissa språk gör det lätt att skriva i vissa paradigm men inte i andra. Mer information finns i Wikipediaartikeln.
Nu ska vi dyka ner i de tre programmeringsparadigm som intresserar oss idag:
Procedurell programmering (PP), även känd som inlineprogrammering tar ett uppifrån och ner-läge. Det handlar om att skriva en lista med instruktioner för att tala om för datorn vad den ska göra steg för steg. Den bygger på procedurer eller rutiner.
Objektorienterad programmering (OOP) handlar om att kapsla in data och beteende i objekt. En OOP-applikation kommer att använda en samling objekt som vet hur de ska utföra vissa åtgärder och hur de ska interagera med andra delar av applikationen. Ett objekt kan till exempel vara en person. Personen skulle ha ett namn (som skulle vara en egenskap hos objektet) och veta hur man går (som skulle vara en metod). En metod i OOP kan betraktas som en procedur i PP, men här tillhör den ett specifikt objekt. En annan viktig aspekt av OOP är klasser. En klass kan betraktas som en blåkopia för ett objekt.
Funktionell programmering (FP) handlar om att skicka data från funktion till funktion till funktion för att få ett resultat. I FP behandlas funktioner som data, vilket innebär att du kan använda dem som parametrar, returnera dem, bygga funktioner från andra funktioner och bygga egna funktioner. Funktioner i FP måste vara rena funktioner, de bör undvika delat tillstånd och sidoeffekter och data bör vara oföränderliga. En ren funktion är en funktion som givet samma typ av indata alltid returnerar samma utdata, den är inte beroende av ett lokalt eller globalt tillstånd. Ett delat tillstånd är ett tillstånd som delas av mer än en funktion eller mer än en datastruktur. För att förstå effekterna av en funktion måste man alltså känna till alla detaljer om varje delad variabel för att förstå delat tillstånd. Det ger en hel del komplexitet och mindre modularitet.