Objektum-orientált programozás Készítette: Nagy Zsolt, 2014
Modellezés A modellezés során nem a valós világ dolgaival foglakozunk, hanem egy kisebb, „megfoghatóbb”, megérthetőbb egyszerűsített példánnyal. Gondoljunk a Forma 1-es versenyautók tervezésénél elvégzett légellenállási kísérletekre. Először itt sem a megépített gépet vizsgálják, hanem annak kicsinyített mását. Majd, ha már közelebb kerültek a megoldáshoz, akkor váltanak teljes 1:1 méretarányra, de még ilyenkor sem a komplett versenyautót vizsgálják, hanem egy fabrikált felületet. Hogy mi ennek a lényege? – Felesleges, és sokszor lehetetlen is a valós világ objektumait teljes egészükben vizsgálni. Egyrészt:
lehetetlen lenne a bonyolultsága miatt minden részletére figyelni, illetve
a lényegtelen részletek feleslegesen vonnák el a fontos és lényeges részektől az időt és az energiát.
Így van ez a szoftverfejlesztésnél is. Amikor egy valós világbeli problémára keresünk megoldást, egyszerűsítenünk kell. Meg kell keresni a feladat megoldása szempontjából fontos és releváns részeket, majd azokat ki kell emelni a „problématérből”. Ugyanis a feladat megoldása szempontjából csak ezek a tulajdonságok fognak szerepet játszani. Képzeljük el a következő feladatot. Egy autókereskedő számára szeretnénk programot készíteni, amelyben nyílván tudja tartani a kereskedésében lévő gépkocsik adatait. Kezelni akarná-e a kocsik tulajdonosit? Bizonyára igen. De kell-e foglalkoznia a tulajdonosok heti bevásárlásaival? Nem valószínű. Nagyon sok olyan tulajdonság jellemzi a valós objektumokat, amelyek a feladat megoldására nézve irrelevánsak, nem fontosak. Ezeket az adatokat nem is kell kezelnünk. A modellalkotásnak ezt a részét absztrakciónak – elvonatkoztatásnak nevezzük.
A fent említett kereskedő autóiból több is lehet, és ezek az autók mind hasonlóan épülnek
fel,
hasonló
tulajdonságokkal
jellemezhetők.
Igaz
lehetnek
motorkerékpárok, teherautók, stb. is a kereskedő udvarán. Vagyis a valós világ objektumait csoportokba tudjuk rendezni, a hasonló tulajdonságaik alapján. Így lesznek olyan járművek, amelyekre az jellemző, hogy személyeket szállítanak, és négy kerekük van. De olyanok is, amelyek két kerekűek és szintén személyeket szállítanak. Meg olyanok is, amelyek fő feladata a teherszállítás. Könnyebb kezelni, megérteni a valós világ objektumait, ha a hasonló tulajdonságaik alapján csoportokba rendezzük, kategorizáljuk őket. De, ha jobban megvizsgáljuk a kereskedő járműveit, felismerhetünk a csoportok között hasonlóságokat, olyan tulajdonságokat, amelyekkel minden csoportnál foglakozni akarunk. Ilyen például az évjárat, a motor űrtartalma, tulajdonosa, stb. Tehát ki tudunk emelni közös jellemzőket az egyes csoportokból. Viszont lehet olyan is, hogy az autóknál meg akarjuk különböztetni a sportkocsikat. Tehát például újabb tulajdonságot akarunk bevezetni, szűkítve ezzel az autók csoportját. Ezekre azt mondjuk, hogy általánosítunk, vagyis kiemeljük a közös tulajdonságokat, illetve specializálunk, azaz szűkítjük a csoportot. A kereskedő által nyílván tartott csoportok nem önmagukban léteznek, nem függetlenek egymástól. Kapcsolat van például a gépjármű és a jelenlegi tulajdonosa között. Kétféle kapcsolatot különböztetünk meg. Ismeretségi kapcsolat esetén a két objektum létezhet önállóan is (autó és tulajdonosa). Egész-rész kapcsolatnál, pedig a „rész” nem létezhet az „egészen” kívül (autó és motorja).
Objektum orientált paradigma A valós világ objektumait két oldalról tudjuk vizsgálni. Egyrészt a felépítését, amelyet az adatok határoznak meg. Általánosítva ezek a tulajdonságai, jellemzői. Például a gépkocsinál a márka, típus, gyártási év, szín, ár, stb.. Másrészt a gépjárművek tudnak haladni az úton, lehet velük sebességet váltani, lehet gyorsítani vagy lassítani, stb.. Ez pedig az objektum cselekvőképességét jelenti, más néven a módszereit, funkcióit.
Objektum (object) Az objektum-orientált paradigmának (gondolkodásmódnak) a sarkalatos eleme az objektum. Az objektumnak, az előbbi kocsi példát alapul véve, vannak adatai, amelyek egy szerkezetet alkotnak, és vannak funkciói, eljárásai, amelyekkel cselekedni tud. Az objektum egy olyan programozási eszköz, amelynek három komponense van:
Attribútumai, amelyek az objektum szerkezetét írják le. Ezeket szokás statikus résznek is nevezni. Minden objektum mögött van egy memóriaterület, amely tárolja az objektum értékeit. Az attribútumok által felvett értékeket az objektum aktuális állapotának nevezzük.
Módszerei, amelyekkel az objektum viselkedését tudjuk leírni. Vagyis az objektum képes magáról adatokat szolgáltatni, megváltoztatni az aktuális adatait, azaz állapotát, vagy egyéb (meghatározott) műveletet elvégezni. A viselkedést metódusokkal írjuk le. Az objektumot megszólítani a metódusain keresztül lehet, ezt üzenetküldésnek nevezzük.
Minden objektumnak van azonosságtudata, azaz létezik azonosítója, amely csak rá jellemző (OID – Object IDentifier). A változó neve igazából soha nem azonosító csak hatáskörön belül egyértelmű a névhivatkozás. Az OID viszont tényleg egyedi, még programok között is!
Az objektum addig él, amíg vagy a programozó, vagy a nyelvi rendszer meg nem szünteti.
Osztály (class) Absztrakt eszköz, az eljárás-orientált nyelvek típusfogalmának általánosítása (gyakran itt is típusként említjük - szinonimák). Az osztály azonos attribútumú és módszerű objektumok együttese. Az osztályhoz köthetőek az objektumok; az osztályból származtathatóak az objektumok. Az osztály olyan objektumminta vagy típus, amelynek alapján példányokat (objektumokat) hozunk létre. Minden objektum egy jól meghatározott osztály alapján jön létre. Az osztályban definiáljuk:
az objektumok adatait,
az objektum által elvégezhető műveleteket.
Nézzünk egy példát az osztályra. Az iskola tanulói egy jól körülhatárolható részét képezik az iskolába járó embereknek. Egy program elkészítése során a tanulóknak csak a számunkra fontos adatit akarjuk eltárolni, és csak a szükséges feladatok megoldására, illetve viselkedés elvégzésére szeretnénk képessé tenni. Ezek tudatában kell osztályt létrehozni. Tanulói nyilvántartás során, a következő adatokra, illetve viselkedésre lehet szükségünk. Tulajdonságok:
név,
lakhely,
osztály,
nem,
tantárgyak.
Viselkedések, feladatok:
név beállítása, lekérdezése,
lakhely beállítása, lekérdezése,
osztály beállítása, lekérdezése,
„nem” beállítása, lekérdezése.
Tervezzünk egy másik osztályt! A síkidomok közül legyen a téglalap. Tulajdonságai:
a,
b.
Műveletei:
a oldal beállítása, lekérdezése,
b oldal beállítása, lekérdezése,
terület,
kerület.
Példány (instance) Az OO szemlélet szerint először létre kell hozni egy osztályt, leírni, hogy a hozzá tartozó objektumoknak milyen attribútumai és módszerei legyenek. Az osztály alapján jönnek létre az objektumok, amelyeket példányoknak is nevezünk. A műveletet pedig példányosításnak.
Az adott objektum adott osztály példánya. Minden objektum tudja, hogy melyik osztálynak példánya.
Adott
osztályhoz
tartozó
minden
példány
ugyanolyan
attribútumokkal
és
módszerekkel rendelkezik. Minden példány tudja, hogy milyen módszerekkel rendelkezik.
A módszereket mindig konkrét példányon futtathatom le, ezen értelmezhetők: az aktuális példányon.
Példány létrehozása: ugyanaz az adatszerkezet újra és újra megjelenik a tárban. A módszereket nem többszörözi!
Létezhetnek olyan attribútumok és olyan módszerek, amelyek nem arra szolgálnak, hogy az egyes példányok állapotait és viselkedését vizsgáljuk velük, hanem magához az osztályhoz tartoznak. (Példány-attribútum, példánymódszer; osztály-attribútum, osztálymódszer).
Osztály-attribútum: hány darab példánya van (az osztály kiterjedése).
Az osztály-attribútumok nem többszöröződnek.
Egységesített Modellező Nyelv (UML) A tervezéshez grafikus eszközt használhatunk. Ilyen az UML (Unified Modeling Language) Egységesített Modellező Nyelv. Osztályok megadása Egy három részre osztott téglalappal jelöljük.
A felső részében adjuk meg az osztály nevét, középre kiemelten. Pl. Teglalap
A középső részben az adattagokat (változókat, különböző információ hordozó objektumokat). Pl. a, b: egész;
Az alsó részben pedig a metódus tagokat (viselkedési formákat). Pl. setA(ertek: egész); terulet(): egész;
Osztály neve
Teglalap a, b: egész
Osztály adattagjai setA(ertek: egész) setB(ertek: egész) getA(): egész getB(): egész terulet(): egész kerulet(): egész
Osztály viselkedései
Példány megadása Egy két részre osztott téglalappal jelöljük.
A példányba beírjuk az azonosítóját és osztályát egy kettősponttal elválasztva ezek közül valamelyik elhagyható. Pl. teglalap1: Teglalap, vagy teglalap1 vagy :Teglalap.
Szükség esetén megadjuk az objektum állapotát egy vonallal elválasztva.
A példányt egy szaggatott nyíllal kötjük az osztályhoz.
Teglalap a, b: egész
teglalap1:Teglalap a = 10
setA(ertek: egész) setB(ertek: egész) getA(): egész getB(): egész terulet(): egész kerulet(): egész
b = 20
Ha két objektumnak megegyezik az állapota, vagyis rendre egyformák az adataik, akkor ugyanarra az üzenetre ugyanúgy reagálnak. Egy objektum mindig a saját osztályában megadott metódus szerint működik.
Üzenet (Message) Egy objektum
„felkérhet”
más
objektumokat
feladatok
elvégzésére.
üzenetküldésnek nevezzük. Az üzenet nem más, mint egy kívülről elérhető metódus hívása. A hívás formája: objektum.üzenet(paraméterek)
A
felkérést
teglalap1.terulet() program
teglalap1
Objektum létrehozása, inicializálása Az objektumok a memóriában helyezkednek el. Megszületnek, léteznek – viselkednek, majd vagy a programozó által, vagy a futtató rendszer által megsemmisülnek. A létrehozáskor be kell állítani az objektum állapotát, vagyis inicializálni kell. Ezt a kezdeti értékadást egy speciális metódus, a konstruktor végzi. A konstruktornak lehetnek paraméterei, amelyeken keresztül „kívülről” lehet kezdeti értékadásokat végrehajtani. Lehetnek olyan adatai is, amelyeket nem lehet „kívülről” elérni, befolyásolni. Példa konstruktorra: Teglalap(oldal_1: egész, oldal_2: egész) a = oldal_1 b = oldal_2 End Teglalap Az objektum létrehozását Java nyelvben a new operátor végzi. Az operátor után meg kell adni az osztály nevét, vagyis a konstruktort. Példa létrehozásra: teglalap1 = new Teglalap(10, 20)
Példányváltozó, példánymetódus Az osztálynak azokat az adattagjait, amelyek minden belőle létrehozott példányban szerepelnek, példányváltozóknak, példányadatnak nevezzük. Ezek a változók minden példányban létrejönnek, és saját értékük lesz. Pl. Teglalap osztály alapján létrehozott teglalap1 objektumnak lesz két példánytagja a és b oldalak. Ezek minden példányban külön-külön létrejönnek és saját értékük lesz. Az osztály azon metódusait, amelyek példányokon dolgoznak, példánymetódusoknak nevezzük. Pl. a Teglalap osztály terulet() metódusa. A példánymetódust példányon hívjuk meg teglalap1.terulet(). Az üzenetküldés eredménye egy érték lesz, amit a terulet() metódus fog kiszámolni az adott (teglalap1) objektumon.
Osztályváltozó, osztálymetódus Vannak adatok, amelyek nem egy konkrét példányra, hanem az egész osztályra jellemzőek. Ilyen például az, hogy a programunkban összesen hány téglalap objektumot hoztunk létre. Ezt elegendő egy helyen, egy példányban tárolni. Nem kell, sőt nem is tanácsos külön-külön minden példányban jelen lennie. Ezek a változók, adatok az osztály saját adatai, ezért osztályadatnak, vagy osztályváltozónak nevezzük. A rajtuk műveletet végző metódusokat pedig osztálymetódusnak. Az osztályadat és osztálymetódus nevét az UML-ben aláhúzzuk. Egy osztályt csak osztálymetódussal lehet megszólítani, egy objektumot meg lehet példánymetódussal és osztálymetódussal is.
Bezárás, információ elrejtése, kód újrafelhasználása Egy objektum legnagyobb ereje abban áll, hogy zárt és sérthetetlen. Azokat az adatokat, és metódusokat, amelyeket nem akar a külvilág számára elérhetővé tenni, elrejti előlük. Ezt információ elrejtésnek nevezzük. Az objektum zártsága azt jelenti, hogy az adatokat és a rajtuk dolgozó metódusokat egy egységnek kezeli (egységbezárás). A kód újrafelhasználásának egyik módja, hogy egy osztály alapján újabb és újabb példányokat lehet létrehozni. A másik módja, hogy egy osztályból származtatással újabb osztályokat tudunk létrehozni. Ezt örökítésnek nevezzük. Az osztály örökítésével specializáltabb viselkedésmódot, vagy újabb tulajdonságokat lehet felvenni.
Felhasznált, ajánlott irodalom
Angster Erzsébet – Objektumorientált tervezés és programozás – Java – 4Kör Bt. 2002
Juhász István – Programozás 2 – Egyetemi jegyzet - 2004