Mint az ejtőernyős nadrág és a Pac-Man, az OOP (objektumorientált programozás) is az 1980-as években indult. De ellentétben a divatos divatokkal és videojáték-figurákkal, ez a programozási modell ennyi év elteltével sem veszített erejéből.
Az OOP a szoftverfejlesztés alapvető részévé vált. Az olyan nyelvek, mint a Java és a C++ mindenütt jelenlévő elterjedtségének köszönhetően nem lehet mobilszoftvereket fejleszteni, ha nem értünk az objektumorientált megközelítéshez. Ugyanez vonatkozik a komoly webfejlesztésre is, tekintettel az olyan OOP-nyelvek népszerűségére, mint a Python, a PHP és a Ruby.
Az objektumorientált programozás gondolatának megismerése kihívást jelenthet néhány informatikai szakember számára. Talán elgondolkodik azon, hogy miért van egyáltalán szükség objektumokra, amikor használhatja a hagyományos strukturált programozás felülről lefelé irányuló megközelítését olyan nyelvekben, mint a Visual Basic.
Ha írt már ilyen típusú szoftvert, valószínűleg hozzászokott ahhoz, hogy a nagy problémákat részproblémákra bontja, és azokat külön kódegységekben oldja meg. Vagy esetleg van tapasztalata a funkcionális programozással, amely a kód elemeit pontos matematikai függvényekként kezeli, és megakadályozza, hogy azok hatással legyenek más elemekre, azaz nincsenek mellékhatások.
Ha azonban megismerkedik az OOP-val, látni fogja, hogy ez a problémák megoldásának egy teljesen új módja. Az alapkoncepció az, hogy ahelyett, hogy programot írnánk, létrehozunk egy osztályt, ami egyfajta sablon, amely változókat és függvényeket tartalmaz. Az objektumok ennek az osztálynak a zárt példányai, és rávehetjük őket, hogy szórakoztató és izgalmas módon lépjenek kapcsolatba egymással.
Az objektumorientált programozás előnyei ebben a fajta kapszulázásban rejlenek. Íme egy részletes áttekintés az OOP néhány legfőbb előnyéről:
Modularitás a könnyebb hibaelhárításért
Valami elromlott, és fogalma sincs, hol keresse. A Widget fájlban van a probléma, vagy a WhaleFlumperben? A “sewage.c” fájlban kell majd turkálnod? Remélem, kommentálta a kódját!
Amikor objektumorientált programozási nyelvekkel dolgozik, pontosan tudja, hol kell keresnie. “Ó, az autó objektum lerobbant? A probléma biztosan a Car osztályban van!” Nem kell semmi másban turkálnod.
Ez a szépsége a kapszulázásnak. Az objektumok önállóak, és a funkcionalitás minden egyes darabja a saját dolgát végzi, miközben a többi darabot békén hagyja. Emellett ez a módozat lehetővé teszi, hogy egy informatikai csapat egyszerre több objektumon dolgozzon, miközben minimálisra csökkenti annak esélyét, hogy egy személy megkettőzze valaki más funkcionalitását.
Segítünk megtalálni a következő programozói munkát:
A kód újrafelhasználása az öröklés révén
Tegyük fel, hogy a Car objektum mellett az egyik kollégának szüksége van egy RaceCar objektumra, egy másiknak pedig egy Limousine objektumra. Mindenki külön-külön építi fel az objektumait, de felfedezi a köztük lévő közös vonásokat. Valójában mindegyik objektum valójában csak egy másfajta Car. Ez az a pont, ahol az öröklési technika időt takarít meg: Létrehoz egy általános osztályt (Car), majd definiálja az alosztályokat (RaceCar és Limousine), amelyek öröklik az általános osztály tulajdonságait.
A Limousine és a RaceCar természetesen továbbra is rendelkezik egyedi attribútumokkal és funkciókkal. Ha a RaceCar objektumnak szüksége van egy “fireAfterBurners” metódusra, és a Limousine objektumnak szüksége van egy Chauffeurre, akkor mindegyik osztály implementálhatna külön függvényeket csak saját magának. Mivel azonban mindkét osztály a Car osztálytól örökli a legfontosabb aspektusokat, például a “drive” vagy a “fillUpGas” metódusokat, az öröklődő osztályok egyszerűen újra felhasználhatják a meglévő kódot ahelyett, hogy ezeket a függvényeket újra megírnák.
Mi van akkor, ha az összes Car objektumon változtatni akarunk, típustól függetlenül? Ez egy másik előnye az OO megközelítésnek. Egyszerűen csak változtassunk a Car osztályon, és az összes Car objektum egyszerűen örökli az új kódot.
Flexibilitás a polimorfizmus révén
Ezzel a példával élve, most már csak néhány meghajtóra vagy függvényre van szükségünk, mint például a “driveCar”, “driveRaceCar” és “DriveLimousine”. A RaceCarDrivers osztozik néhány tulajdonságon a LimousineDrivers-szel, de más dolgok, mint például a RaceHelmets és a BeverageSponsorships, egyediek.
Ez az a pont, ahol az objektumorientált programozás édes polimorfizmusa a képbe kerül. Mivel egyetlen függvény alakváltoztatható, hogy alkalmazkodjon ahhoz az osztályhoz, amelyikben van, létrehozhatunk egy “drive” nevű függvényt a szülő Car osztályban – nem “driveCar” vagy “driveRaceCar”, hanem csak “drive”. Ez az egy függvény működne a RaceCarDriver, LimousineDriver stb. osztályokkal. Sőt, akár a “raceCar.drive(myRaceCarDriver)” vagy a “limo.drive(myChauffeur)” is lehetne.”
Effektív problémamegoldás
A C-hez hasonló nyelvnek csodálatos öröksége van a programozás történetében, de egy felülről lefelé irányuló nyelven szoftvert írni olyan, mint kesztyűben Jenga-t játszani. Minél bonyolultabbá válik, annál nagyobb az esélye, hogy összeomlik. Eközben egy funkcionális stílusú program megírása egy olyan nyelven, mint a Haskell vagy az ML, nagyon nehéz lehet.
A tárgyorientált programozás gyakran a legtermészetesebb és legpragmatikusabb megközelítés, ha egyszer belejön az ember. Az OOP nyelvek lehetővé teszik, hogy a szoftveredet falatnyi méretű problémákra bontsd, amelyeket aztán megoldhatsz – objektumonként.
Ez nem azt jelenti, hogy az OOP az egyetlen igaz út. Az objektumorientált programozásnak azonban számos előnye van. Ha összetett programozási feladatokat kell megoldanod, és kódeszközöket szeretnél hozzáadni a készségeidhez, az OOP a barátod – és sokkal hosszabb életű és hasznosabb, mint a Pac-Man vagy az ejtőernyős nadrág.