A héten egy interjún megkérdezték tőlem, hogy “mi a különbség a funkcionális, objektumorientált és procedurális programozás között”, és őszintén szólva nem igazán tudtam, hogyan válaszoljak erre a kérdésre (és ez volt az első alkalom, hogy procedurális programozásról hallottam…). Ezért ma úgy döntöttem, hogy utánanézek és (megpróbálom) megérteni, mik a fő különbségek.
Kezdjük néhány definícióval:
” A funkcionális programozás (FP) egy olyan programozási paradigma – a számítógépes programok szerkezetének és elemeinek felépítésére szolgáló stílus -, amely a számítást matematikai függvények kiértékeléseként kezeli, és kerüli a változó állapotú és változtatható adatokat”. – Wikipedia
” Az objektumorientált programozás (OOP) egy olyan programozási paradigma, amely az “objektumok” fogalmán alapul, amelyek tartalmazhatnak adatokat, mezők formájában, amelyeket gyakran attribútumoknak neveznek; és kódot, eljárások formájában, amelyeket gyakran módszereknek neveznek.”” – Wikipedia
” A procedurális programozás a strukturált programozásból származó programozási paradigma, amely az eljáráshívás fogalmán alapul. Az eljárások, más néven rutinok, szubrutinok vagy függvények, egyszerűen egy sor elvégzendő számítási lépést tartalmaznak.” – Wikipedia
Oké, ennyi volt a bevezetés, de menjünk egy kicsit részletesebben.
Először is, mi az a programozási paradigma? Ez egy programozási stílus, egy gondolkodásmód a szoftverkonstrukcióról. A programozási paradigma nem egy konkrét nyelvre utal, hanem inkább egy programozási módra, módszertanra. Egyes nyelvek megkönnyítik az írást bizonyos paradigmákban, másokban viszont nem. További részletekért lásd a Wikipédia szócikkét.
Most merüljünk el a ma minket érdeklő három programozási paradigmában:
A procedurális programozás (PP), más néven inline programozás felülről lefelé irányuló megközelítést alkalmaz. Arról szól, hogy utasítások listáját írjuk meg, hogy lépésről lépésre megmondjuk a számítógépnek, mit kell tennie. Az eljárásokra vagy rutinokra támaszkodik.
Az objektumorientált programozás (OOP) az adatok és a viselkedés objektumokba történő kapszulázásáról szól. Egy OOP alkalmazás objektumok gyűjteményét használja, amelyek tudják, hogyan hajtsanak végre bizonyos műveleteket, és hogyan lépjenek kölcsönhatásba az alkalmazás más elemeivel. Egy objektum lehet például egy személy. Ennek a személynek lenne neve (ez lenne az objektum tulajdonsága), és tudná, hogyan kell járni (ez lenne egy metódus). Az OOP-ban egy módszer a PP-ben eljárásnak tekinthető, de itt egy konkrét objektumhoz tartozik. Az OOP másik fontos aspektusa az osztályok. Egy osztály egy objektum tervrajzának tekinthető.
A funkcionális programozás (FP) arról szól, hogy adatokat adunk át függvényről függvényre, hogy egy eredményt kapjunk. Az FP-ben a függvényeket adatként kezeljük, ami azt jelenti, hogy paraméterként használhatjuk őket, visszaadhatjuk őket, más függvényekből függvényeket építhetünk, és saját függvényeket építhetünk. A függvényeknek az FP-ben tiszta függvényeknek kell lenniük, kerülniük kell a megosztott állapotot, a mellékhatásoknak és az adatoknak megváltoztathatatlanoknak kell lenniük. A tiszta függvény olyan függvény, amely azonos típusú bemenet esetén mindig ugyanazt a kimenetet adja vissza, nem függ lokális vagy globális állapottól. A megosztott állapot olyan állapot, amelyet egynél több függvény vagy egynél több adatszerkezet oszt meg. A megosztott állapot esetén tehát ahhoz, hogy megértsük egy függvény hatását, ismernünk kell minden egyes megosztott változó minden részletét. Ez nagyfokú komplexitást eredményez, és kevesebb modularitást tesz lehetővé.