Objektumorientált programozás

A Programozás Wiki wikiből
(Objektum-orientált szócikkből átirányítva)

Objektumorientált programozásnak nevezzük azt a szoftverfejlesztési módszert, melyben a problémát (rendszert) a való világ tárgyaihoz (objektumaihoz) hasonlatosan önálló, önmagukban zárt, de egymással interakcióra képes elemekre bontva oldjuk meg. A megközelítés tükröződik az e módszer szerint kialakított program forráskódjában is. Az egyes objektumokhoz tartozó műveletek kódja és adatterületük leírása általában egymáshoz közel, de az eltérő típusú objektumok kódjai élesen elválasztásra kerülnek egymástól. Ez nagyban növeli a kód átláthatóságát és bővíthetőségét.

Az objektumorientált nyelvekben a feladat megfogalmazásában és a megoldásában részt vevő egységek - az objektumok - osztályokba sorolhatók. Az egy osztályba tartozó objektumoknak a "viselkedése" hasonló, de az "adattartalmuk" eltér.

Alapfogalmak[szerkesztés]

  • osztály (class): Metódusok (methods), mezők (fields) és jellemzők (properties) egy egységbe zárt csoportja, ill. ennek (típus)deklarációja.
  • objektum (object): Az osztály egy példánya.
  • ős(osztály) (ancestor class): Az az osztály, amelytől egy másik osztály örököl.
  • leszármazott osztály (descendant class): Az az osztály, amelyik egy másik osztálytól örököl.
  • osztály- vagy objektumhierarchia (class/object hierarchy): Az osztályok között az öröklési viszonyok meghatározásának következtében kialakuló (család)faszerkeszet.
  • konstruktor (constructor): Az osztály példányosításakor meghívott, az adott objektumpéldányt alapállapotba hozó (inicializáló) speciális metódus.
  • destruktor (destructor): Az objektumpéldány megszüntetésekor, megsemmisítésekor meghívásra kerülő speciális metódus. Feladata az objektum által lefoglalt erőforrások felszabadítása.
  • metódus (method): Egy adott osztályhoz tartozó, az osztályon vagy az adott típusú objektumpéldányon műveletet végző függvény vagy eljárás.
  • mező (field): Egy adott osztály részét képező független adatmező. A mezők az adott osztály alapján létrehozott objektumpéldányok között nem kerülnek megosztásra, hanem minden példány külön-külön mezőkészlettel rendelkezik.
  • osztálymetódus (class method): Olyan metódus, amely nem egy konkrét objektumpéldányon, hanem magán az osztályon végez műveleteket. Az osztálymetódusok az osztály példányosítása nélkül - azaz egy konkrét objektumra mutató referencia hiányában - is meghívhatók, pusztán az osztálynév - vagy az osztálytípusra mutató hivatkozás - alapán. Ugyanakkor utóbbi okból kifolyólag az osztálymetódusok nem érhetik el és nem hívhatják meg az osztályban deklarált nem-osztály-metódusokat és mezőket (hiszen azok csak egy-egy objektumpéldányon belül léteznek, ami itt nem áll rendelkezésre). Az osztálymetódusokat a legtöbb nyelv a "class", míg mások a "static" kulcsszóval jelölik - utóbbi azonban nem keverendő össze a statikus metódusokkal.
  • osztálymező (class field): Olyan speciális mező, amely az adott osztály - és a belőle leszármazott osztályok - minden objektumpéldánya között megosztásra kerül (azaz ha egyikük változtat rajta, az összes többi példány osztálymezője is tükrözni fogja a változtatást). Az osztálymezők az osztály egyetlen mezői amelyek az osztálymetódusokból is elérhetőek. Az osztálymezők használatát nem minden nyelv támogatja.
  • jellemző (property): Olyan speciális osztályelem, amely bár kifejezésekben és műveletekben mező ill. változó módjára viselkedik, olvasása és írása esetében azonban memóriaterületek közvetlen írása helyett a deklarálásakor meghatározott olvasó (getter) és/vagy író (setter) metódusok kerülnek meghívásra. Ez lehetővé teszi az objektum számára, hogy az adott - mezőnek tűnő - elemének írása esetén programmatikus ellenőrzésnek vesse alá az írni kívánt értékeket, hogy más mezők értékeit is állítsa a művelet során (pl. egymásnak ellentmondó mezőállapotok kizárására), ill. hogy olvasás esetén az adott jellemző értékét futásidejű számítással- akár több mező értékét kombinálva -, vagy más programmatikus módon állapítsa meg.
  • statikus metódus (static method): Olyan metódus, melynek címét a hivatkozás fordításának helyén, a hivatkozás alapjául szolgáló típus határozza meg, és nem befolyásolja az, hogy futásidőben az adott hivatkozás konkrétan milyen típusú objektumpéldányra mutat. A statikus metódusok nem növelik az objektumpéldány méretét, hiszen nincs szükség hely fenntartására részükre a Virtuális Metódus-Táblaban, és meghívásuk is gyorsabb, hiszen ahhoz nem kell az objektum pontos típusát megállapítani futásidőben.
  • dinamikus vagy virtuális metódus (dynamic or virtual method): Az ilyen metódusok meghívásakor a hívásban végrehajtásra kerülő implementációt az adott objektumpéldány típusa határozza meg, függetlenül a felhasznált referencia típusától. A dinamikusként/virtuálisként deklarált metódusok implementációja a leszármazott osztályokban módosítható vagy felülírható. A virtuális metódusok címeit minden objektum a hozzá kapcsolódó VMT-ben tárolja, így minél több virtuális metódussal rendelkezik egy osztály, annál több helyet foglalnak a belőle példányosított objektumok. A dinamikus metódusok a virtuális metódusokhoz hasonlóan működnek azzal a különbséggel, hogy csak az őket deklaráló vagy felülíró osztályokban, egy láncolt vagy asszociatív listában kerülnek tárolásra. A dinamikus metódusok hívása a leglassabb, mert a hívás helyén a konkrétan meghívandó metódus megállapításához a konkrét objektumpéldány típusának megállapítása után az objektum öröklési láncát is be kell járni egészen addig, amíg egy az adott dinamikus metódust deklaráló vagy felülíró osztályt nem találunk. Ugyanakkor a dinamikus metódusok nem növelik az objektumpéldányok VMT-je által elfoglalt terület méretét.
  • absztrakt metódus (abstract method): Olyan metódus, ami mögé a deklaráló osztályban nem kapcsolunk semmilyen implementációt, hanem ezt meghagyjuk a leszármazott osztályok számára. Az absztrakt metódusok lényegükből adódóan mindig virtuálisak is.
  • absztrakt osztály (abstract class): Egy vagy több absztrakt metódust tartalmazó osztály. Az absztrakt osztályok a legtöbb nyelvben nem példányosíthatók, hiszen van egy vagy több olyan metódusok, amelyek meghívása formailag lehetséges, de semmilyen mögöttes kód nem kapcsolódik hozzájuk. Amennyiben a nyelv mégis megengedi az absztrakt osztály példányosítását, úgy az absztrakt metódus meghívása esetén kivétel keletkezik a programban.

Alapelvek[szerkesztés]

Az objektumorientált programozás (Object-Oriented Programming = OOP) a természetes gondolkodást, cselekvést közelítő programozási mód, amely a programozási nyelvek tervezésének természetes fejlődése következtében alakult ki. Az így létrejött nyelv sokkal strukturáltabb, modulárisabb és absztraktabb, mint egy hagyományos nyelv.

Egy OOP nyelvet három fontos dolog jellemez:

  • Egységbezárás (Encapsulation)
  • Öröklés (Inheritance)
  • Többrétűség (Polymorphism)

Egységbezárás[szerkesztés]

Azt jelenti, hogy az adatstruktúrákat és az adott struktúrájú adatokat kezelő függvényeket (metódusokat) kombináljuk. Azokat egy egységként kezeljük, és elzárjuk őket a külvilág elől. Az így kapott egységeket objektumoknak nevezzük.

Öröklés[szerkesztés]

Azt takarja, hogy a meglévő objektumokból levezetett újabb objektumok öröklik a definiálásukhoz használt alap objektumok egyes adatstruktúráit és függvényeit, ugyanakkor újabb tulajdonságokat is definiálhatnak, vagy régieket újraértelmezhetnek.

Többalakúság (polimorfizmus)[szerkesztés]

Egy adott tevékenység (metódus) azonosítója közös lehet egy adott objektum hierarchián belül, ugyanakkor a hierarchia minden egyes objektumában a tevékenységeket végrehajtó metódus implementációja az adott objektumra nézve specifikus lehet.


Példák[szerkesztés]

Egy CD nyilvántartó programban például az egyes CD-k objektumként, a CD mint fogalom osztályként jelenhet meg. Minden CD-ről egyaránt lekérdezhető az előadójának és tartalmának listája, de a konkrét dalok CD-nként különböznek.

Gyakran előfordul, hogy egy osztály elemeinek egy része valamilyen külön csoportba sorolható. A fenti példánál maradva elképzelhető, hogy az adat- és zene-CD-ket külön szempontok szerint szeretnénk kezelni. Az ehhez hasonló helyzeteket az objektum-orientált szemléletben gyakran leszármazással oldjuk meg. A CD osztályból származhatnak az AdatCD és ZeneCD osztályok. Ilyenkor a tulajdonságok és műveletek egy része közös lehet, más részük esetleg csak a leszármazott osztályokban értelmezhető. Előbbire példa lehet a gyártó, a szín, utóbbira az előadó vagy az alkönyvtárak száma tulajdonság.

  • A CD-s példa egy megvalósítása
Java nyelven:CD objektum Java nyelven
Turbo Pascal nyelven:Cd objektum Turbo Pascal
C# nyelven:Cd objektum C Sharp nyelven

Lásd még[szerkesztés]