PROGRAMOZÁSMÓDSZERTAN II
PROGRAMOZÁSMÓDSZERTAN II
A programozás természetesen ugyan úgy fejlődik mint az informatika egyéb területei. Az új hardver és szoftver elemek maguk után vonták a programozás és a programozási nyelvek fejlődését. A grafikus rendszerek megjelenésével a programoknak is grafikusan kellett
működni. Az ablakkezelés, több processzoros rendszerek és a multitaszk megjelenése
mind-mind hatással volt a programozási nyelvekre.
A strukturált programozást lassan kezdte felváltani az objektum orientált. Az objektum orientált programozási módszertan alapgondolata, hogy az adat és a funkcionális modell
egymástól elválaszthatatlan. Gyakorlatilag ez az OOP rendszerek alapja. Mindent erre építünk fel és ebből származtatunk.
MUNKAHELYZET- ESETFELVETÉS OBJEKTUMORIENTÁLT PROGRAMOZÁS Az objektum orientált programozás (OOP) gyakorlatilag egy teljesen új szemléletmódot követel a programok megvalósításának tekintetében. Amíg egy strukturált rendszerben
egymásra épülő, sorban lefutó algoritmusokkal valósítottuk meg egy probléma megoldását, addig itt
úgynevezett objektumok
segítségével kell mindezt megtennünk. Nem a
programrészek megírása a fő cél, hanem az objektumok hierarchiája és kapcsolata áll a
középpontban. Ennek a rendszernek a pontos megtervezése és megvalósítása adja a feladat megoldását.
Maga az objektum egy elég absztrakt fogalomként értelmezhető. Rendelkezik különböző
tulajdonságokkal, amiket többféleképpen használhatunk. Maga a programozás elve a valós
világ lemodellezésén alapult. Olyan tulajdonságokat próbáltak megvalósítani benne, amik a természetben már beváltak. Ha objektumokról beszélünk, először az osztályok felépítését kell megvizsgálni, ugyanis minden objektum egy előre definiált osztály példánya. Egy osztályban általában egy feladat
elvégzéséhez szükséges kódrészleteket gyűjtik össze. Egy osztályt létrehozása után
példányosítani kell, hogy használhatóvá váljanak a benne található algoritmusok. Az osztály egy példányát nevezzük objektumnak.
Programozási nyelvtől függő dolog, de a legtöbb esetben a class szóval definiáljuk az
osztályokat. Egy osztály csak függvényeket és változókat tartalmazhat. Az osztályok definiálására egy példa:
1
PROGRAMOZÁSMÓDSZERTAN II Class Alap {} Ebben az esetben az osztály neve „Alap” lesz. A benne található függvényeket és változókat külön kell definiálnunk, meghatározva a hatókörüket is. Ezeket a függvényeket és változókat
csak az osztályon keresztül tudjuk elérni a programokban. Ezeket ezért metódusoknak is
szokás nevezni.
Vannak nyelvek, amik megengedik példányosítás nélkül is meghívni a metódusokat, de ekkor a hívásnál hivatkozni kell az osztály nevére is!
Egy osztály definiálása a következő példán keresztül tanulmányozható: class Alap { public: Alap() { this->msg = "Helló, világ!";} private: std::string msg;};
Gyakorlatilag a Helló világ típusú programokon keresztül szokás bemutatni a programozási
nyelvek többségét. Ha definiálva van egy osztályunk, akkor lényeges a konstruktor szerepe. Ennek a feladata futás folyamán a megfelelő objektum létrehozása. Egy osztályban több konstruktor is szerepelhet. A fenti példánk gyakorlatilag egy ilyen konstruktor bemutatása
volt. Abban az esetben, ha már nincs szükségünk a létrehozott osztályunkra, egy destruktor függvénnyel felszabadíthatjuk a memóriát tőle. Egy osztálynak több konstruktora is lehet, de mindig csak egy destruktorral rendelkezhet.
A létrehozás után nagyon fontos lépés a példányosítás. Gyakorlatilag ekkor keltjük életre a megfelelő metódusokat, amik ténylegesen el is végzik a feladatukat a programban. Alap* obj = new Alap();
Az OOP rendszerek három fő tulajdonsággal rendelkeznek: 1. Öröklődés 2. Zártság 3. Többrétűség Ezek a tulajdonságok adják a gerincét minden OOP rendszernek. Most vizsgájuk meg részletesebben mit is jelentenek!
1. Öröklődés Az objektumok sok esetben rendelkeznek olyan tulajdonságokkal, amit a program során sokszor fel tudunk használni. A régi rendszerekben ezeket az algoritmusokat többször meg
kellett írni, vagy pedig olyan eljárásba helyezni, ami meghívható volt a kívánt helyről. Az
objektumoknál elég egyszer megírni, és a következő objektumok örökölhetik az elődeik
tulajdonságai által.
2
PROGRAMOZÁSMÓDSZERTAN II Az öröklődés gyakorlatilag egy meglévő osztály továbbfejlesztése. A meglévő osztály neve
ősosztály, a továbbfejlesztetté pedig utódosztály. Az öröklés tranzitív tulajdonság. Egy
öröklési lánc legfelső osztálya az alaposztály. Az adatok csak örökölhetők, a metódusok felül is írhatók.
Egyszeres öröklés: Egy osztálynak legfeljebb egy őse lehet. Többszörös öröklés: Egy osztálynak több őse is lehet. Öröklés jelölése (osztályhierarchia diagram): UtódOsztály1
ŐsOsztály
UtódOsztály2
Mezők
Mezők
Mezők
Metódusok
Metódusok
Metódusok
Az öröklődés hatalmas előnye, hogy leegyszerűsíti a gyakran használatos függvények és
változók alkalmazását. Ha egy ősosztályban szereplő metódusra van szükségünk, akkor
egyszerűen meghívhatjuk azt. Problémát jelenthet, ha olyan függvényt szeretnénk meghívni, amelyik nem az osztály ősében szerepel. Ekkor egy egyszerű példányosítással ez is megoldható, de ebben az esetben figyelni kell arra, nehogy a nevek miatt esetleg ütközések alakulhatnak ki a programban!
Nézzünk egy példát az öröklődésre: class Alap { public: Alap(){ }; void f(){ }; }; class Derived : public Alap { public: Derived(){ }; }; Derived* der = new Derived(); der->f(); A fenti példában a Delivered osztály örökölte az f függvényt, ami az Alap osztályban lett definiálva.
Ha a Delivered osztályból is származtatnánk egy új osztályt, akkor az ugyancsak örökölhetné tovább az f függvényt.
2. Zártság Az OOP nyelvek legkényesebb fogalma: általában e fogalom mentén válnak el az iskolák, attól függően, hogy melyik mit vall róla. Az eljárás orientált nyelvek hatáskör fogalmának, a láthatóságnak a kiterjesztése a legtöbbször félreértelmezett fogalom. Nem objektumhoz kapcsolódik.
3
PROGRAMOZÁSMÓDSZERTAN II −
Bezárás_1: Nem objektumhoz kötődik. Az osztály egy absztrakt adattípus. Az osztály
rendelkezik egy interfész és implementációs résszel. Az osztály objektumaihoz csak az interfész részen keresztül férhetünk hozzá, az implementációhoz egyáltalán nem, korlátozott hozáférést jelent. Ez az információrejtés elve (Information hiding). Egy
osztály objektumai egy az osztály által definiált interfészen keresztül érhetők el, és csak így! A nyelv a benne definiált attributumokat és metódusokat két részre osztja: − Nyilvános rész: amelybe tartozó eszközöket minden kliens osztály lát. − Privát rész: kívülről nem látható.
−
Bezárás_2: A bezárás eljárás orientált nyelvek hatáskör fogalmának általánosítása OOP
körökben, ahol garantáltan létezik egy olyan eszközrendszer, mellyel a programozó
tudja szabályozni, hogy az osztályból mi látható és kinek a számára.
3. Többrétűség −
Objektum polimorfizmus: Minden objektum tudja saját magáról, hogy melyik osztály példányaként jött létre. Egy objektum objektuma saját osztályának, de az öröklődési
hierarchiában objektuma valamennyi elődosztálynak is egyben. Így minden egyes objektum szerepelhet minden olyan szituációban, ahol az ősosztály objektuma szerepelhet, nem csak a saját osztálya példányaként használható. −
Módszerpolimorfizmus (overriding): −
Egy leszármazott osztály egy örökölt módszert újraimplementálhat: a módszer specifikációja változatlan marad, de az implementáció más lehet az öröklődési vonalon.
_________________________________________________________________________________________
SZAKMAI INFORMÁCIÓTARTALOM OBJEKTUM ORIENTÁLT PROGRAMOZÁS NÉHÁNY PÉLDÁN ÁT A következő részben a DELPHI nyelv segítségével mutatom be az OOP rejtelmeit. A Delphit szokták Objeckt Pascal-nak is nevezni, mivel a Pascal nyelv szintaktikájára épülnek az utasításai. A kompatibilitás megőrzése végett a strukturált utasításokat is kezeli, de
valójában egy objektum orientált nyelvről van szó.
A Delphi szerkesztői felületének kezelésére és a grafikai elemek használatára most nem
térek ki, ezt mindenki elsajátíthatja különböző szakkönyvekből, kiadványokból.
A Delphiben minden osztály őse a TObject ősosztály. A deklarációkban gyakorlatilag jelölhetjük is ezt:
Tmyclass = class (TObject) End; 4
PROGRAMOZÁSMÓDSZERTAN II Ha egy új osztályt akarunk létrehozni, ami az imént létrehozott Tmyclass osztályból származik, akkor a következő képen tehetjük meg: Tsubclass = class (Tmyclass) End; Az új osztályunk ebben az esetben a Tsublass lesz. Az öröklődés szabályai szerint a szülő
osztály metódusait lehetőségünk van örököltetni ebbe az osztályba is. A szülő osztály
tulajdonságai ezután bármikor használhatóak.
Most nézzük meg, hogy egy metódust hogyan tudunk definiálni, és aztán a későbbiekben használni a különböző osztályokban. A példában létrehozunk egy dolgozó osztályt, amiben a cég dolgozóit akarjuk a későbbiekben tárolni: Tdolgozo = class név: String; beosztás: String; fizetés: longint; end; Ezen az osztályon deklarálunk egy változót a következő képen: Var melos:Tdolgozo; A program futása során létre kell hoznunk az osztály egy elemét, amikor használni
szeretnénk. Mikor pedig már nincs rá szükségünk, fel kell szabadítanunk a memóriát a felesleges foglalástól: var melos: Tdolgozo; begin melos:= Tdolgozo.Create; //memória foglalás melos.nev:=’Lapos Elemér’; … melos.Free; //memória felszabadítás end;
Az osztályok tulajdonságainak öröklése így nagyban megkönnyíti a hasonló adatok kezelését. Az örökléseknél csak azokat a tulajdonságokat kell továbbvinnünk, amelyekre szükségünk lehet. A hiányosságokat pedig az új alosztályunkban deklarálhatjuk.
5
PROGRAMOZÁSMÓDSZERTAN II
MUNKAHELYZET- ESETFELVETÉS ESEMÉNYVEZÉRELT PROGRAMOZÁS Az eseményvezérelt programozás lényege, hogy a program egyes részei nem előre
meghatározható sorrendben futnak le, hanem a vezérlés lefutását bizonyos külső és belső
események határozzák meg. A program egésze nem más, mint események bekövetkezésére válaszul végrehajtott alprogramok, amelyek nagyrészt egymástól függetlenül dolgoznak és működtetik a program egészét.
Napjaink elterjedt felhasználói felületei az ablak (windows) alapú, eseményvezérelt felületek. Az ilyen rendszerekkel igen könnyen és gyorsan készíthetünk szabványos ablakvezérelt programokat. A képernyőképek megtervezése inkább egy egyszerűbb rajzolóprogram
használatához
hasonlítható.
A
szabványos
modulokból
(gombok,
ablakok,
menük,
vezérlőelemek), rendkívül látványosra készíthetjük a programjainkat. Ezek a rendszerek
általában használják az operációs rendszer beépített szolgáltatásait is, mint például a mentés, nyomtatás, színkezelés, vezérlőgombok, stb.
A programozási nyelvek közül ilyen rendszert használ többek közt a Delphi, C#, Visual Basic. Multimédia fejlesztő rendszerekben pedig a Director és Flash szintén ilyen felületen dolgozik.
Az ilyen rendszerekben a gép és a felhasználó közötti kommunikáció a megszokott ablakos
rendszeren keresztül történik. A programozónak a különböző objektumok mögötti tartalmat
kell leprogramoznia, vagyis a hozzájuk tartozó eseményeket! Az eseményvezéreltség így itt arra utal, hogy az algoritmus szekvenciáját nem a program, hanem a felhasználó határozza meg, aki minden elemi beavatkozás után sok különböző lehetőség közül választhat. Ez azt jelenti, hogy az eseményvezérelt felhasználói felületeket minden pillanatban többféle felhasználói beavatkozásra fel kell készíteni.
A program futása során gyakorlatilag a felhasználó az input eszközökön keresztül (pl. egér,
billentyűzet) adhatja ki a program számára a megfelelő parancsokat. Ezeket a rendszer a kiadás sorrendjében dolgozza fel. Tehát a programrészek futási sorrendje bizonyos szinten a felhasználó által vannak definiálva. Nagy előnye az ilyen rendszereknek, hogy olyan szabványos felületet lehet a segítségükkel
kialakítani, ami a felhasználóknak ismerős, így könnyen el tudnak benne boldogulni. Ezáltal a szabványos modulok használata a programok elterjedését is segíti. A
kommunikáció
másik
irányát
tekintve
(output),
szintén
hatalmas
előnyökkel
találkozhatunk. A grafikus megjelenítés lehetővé teszi nagyfelbontású képek, grafikák 6
PROGRAMOZÁSMÓDSZERTAN II egyszerű
és
lejátszhatunk
gyors
megjelenítését
különböző
különösebb
formátumú
filmeket.
grafikai A
ismeretek
program
nélkül.
részeként
Könnyen
egyszerűen
beépíthetünk hang és zene részleteket. A hardver eszközök kezelését pedig az operációs rendszer elvégzi a programozó helyett. Objektumorientált megközelítésben:
Az ablakokhoz egy osztályt rendelünk. Az közös tulajdonságokat érdemes egy közös
alaposztályban összefoglalni, amely minden egyes beavatkozásra valamilyen alapértelmezés
szerint reagál, és az összes output funkciót biztosítja. Az alkalmazásokban szereplő
specifikus ablakok ennek a közös alapablaknak a származtatott változatai. A származtatott ablakokban csak azon reakciókat megvalósító tagfüggvényeket kell újradefiniálni, melyeknek
az alapértelmezéstől eltérő módon kell viselkedniük. Az output funkciókat nem kell
definiálni a származtatott ablakban, hiszen azokat az alapablaktól automatikusan örökli. Tehát ezzel a rendszerrel egy elég összetett objektum orientált rendszert tudunk kiépíteni. Néhány ilyen rendszert kicsit részletesebben is bemutatunk:
1. Programozási nyelvek: Delphi: Alapvetően a PASCAL nyelv utasításkészletére épülő eseményvezérelt objektum orientált programnyelv. A használata gyorsan elsajátítható, ha valaki már rendelkezik valamely más
strukturált nyelv ismeretével. A BORLAND cég terméke. Alapvetően Windows operációs rendszer alá készült, de KYLIX néven Linuxos változata is létezik. Az egyik legelterjedtebb nyelv az oktatásban.
1. ábra A Delphi alapképernyő
7
PROGRAMOZÁSMÓDSZERTAN II Visual Basic: A Microsoft cég terméke, amit kifejezetten Windows alkalmazások fejlesztéséhez adott ki. Használata gyorsan megtanulható. Alapvetően a Basic nyelv utasításkészletére épít, de nagy szabadságot biztosít a programozónak a saját ötletek megvalósítására.
2. ábra Visual Basic képernyő Java: A Java egy
általános célú,
objektumorientált programozási nyelv, amelyet a
Sun
Microsystems fejleszt a kezdetektől fogva. A nyelv a C programozási nyelv alapjaira épít, de
attól sok mindenben lényegesen eltér és bizonyos helyeken sokkal egyszerűbb. A
legnépszerűbb a netes és mobil alkalmazások piacán. A Sun Microsystem erősen levédte a nyelvét jogilag és a Microsofttal szemben is több pert nyert már emiatt.
3. ábra Java fordító 8
PROGRAMOZÁSMÓDSZERTAN II C#: A Microsoft fejlesztése. Alapjául a C++ és a Java szolgált. A Sun Microsystem ezért beperelte a Microsoftot és el kellett hagyniuk a Java részeket belőle. A későbbiekben innen fejlesztették ki a .Net rendszerüket is. A C# főleg azoknak való, akik gyorsan szeretnének látványos eredményeket elérni, akár minimális programozói tehetséggel és tudással.
4. ábra C# képernyője
9
PROGRAMOZÁSMÓDSZERTAN II
2. Multimédia fejlesztő rendszerek: Flash: Jelenleg az Adobe cég termékei közé tartozik. Megjelenésekor forradalminak számított, mert
egy programban ötvözi a vektoros grafika és animáció készítő programok előnyeit.
Segítségével weboldalak, animációk, képek, filmek és különféle mobil tartalmak és
programok is készíthetők. Igen nagy szabadságot ad a programozónak grafikai téren. Egy ügyes grafikus és programozó nagyon látványos tartalmat tud vele készíteni. A Flashben való munka alapvetően egy időszalagon (Timescore) történik, ahol az
eseményeket le kell programoznunk. Az eseményeket pedig vagy valamelyik objektumhoz, vagy egy időponthoz tudjuk rendelni.
5. ábra Flash képernyő Director: Szintén az Adobe cég terméke jelenleg, bár a Flashez hasonlóan a Macromédia vállalat terméke volt addig, amíg azt az Adobe fel nem vásárolta.
A Director kifejezetten multimédia tervező és fejlesztő rendszer. Használata sokban hasonlít a Flashez, de mégis számos eltérés is van köztük. Itt is egy tipikus eseményorientált fejlesztő rendszerrel találjuk magunkat szemben. Az eseményeket itt szintén egy
időponthoz, vagy objektumhoz tudjuk rendelni. Az objektumokat, vagy más néven
szereplőket beimportálhatjuk és meg is szerkeszthetjük programon belül. A kész munkákat
többféle formátumban menthetjük, de teljesen önállóan futtatható állományokat is
készíthetünk benne.
10
PROGRAMOZÁSMÓDSZERTAN II
6. ábra Director képernyő
Összefoglalás: Milyen jellemzői vannak az objektum orientált rendszereknek? Jellemezze a tulajdonságokat! Mondjon pár példát az objektumok használatára! Mit jelent az eseményvezérlés? Milyen eseményvezérelt rendszereket ismer?
TANULÁSIRÁNYÍTÓ Ha szeretnénk megtanulni a fent ismertetett anyagot, akkor először az alapfogalmakkal kell
tisztában lennünk. Ezek elsajátítása nélkül nem léphetünk tovább, mert a későbbiekben
ezekre folyamatosan hivatkozunk. A fenti részben bemutatott rendszerek idő és helyhiány
miatt csak bevezető jellegűek voltak. Ha valaki ezeket az alapokat elsajátította és szeretne jobban megismerkedni valamelyik rendszerrel, akkor érdemes szakkönyvekben, vagy pedig egy tanfolyamon részletesebben megismerkednie a témával.
A tanulás során javaslok egy olyan sorrendet betartani, ami a tananyag ismertetésekor is történt. Ha tisztában vagyunk az alapfogalmakkal és a leíró rendszerekkel, akkor érdemes
gyakorolni a használatukat pár feladaton keresztül, ami a következő részben megtalálható lesz!
11
PROGRAMOZÁSMÓDSZERTAN II
12
PROGRAMOZÁSMÓDSZERTAN II
ÖNELLENÖRZŐ FELADATOK Ebben a részben találunk néhány feladatot, ami segít elmélyíteni a fenti ismereteket. A feladatokat itt kell megoldani a kijelölt helyen. Segítségképpen nyugodtan lapozzunk vissza kezdetben a tananyaghoz, de az lenne a végső cél, hogy teljesen önállóan tudjuk megoldani a feladatokat! 1. feladat Készítsen egy programrészletet, ahol deklarál egy osztályt, ami gépkocsik adatait tartja nyilván. Gyűjtse össze, milyen adatokra lehet szüksége!
_________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________
13
PROGRAMOZÁSMÓDSZERTAN II 2. feladat Készítsen egy programrészletet, ahol az imént deklarált osztályhoz készít egy alosztályt a
használt gépkocsik részére. Milyen tulajdonságokat örököltetne a szülő osztályból és mikkel egészítené ki azokat?
_________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________
14
PROGRAMOZÁSMÓDSZERTAN II
3. feladat Készítsen egy programrészletet, ahol az imént deklarált osztályhoz készít egy alosztályt a
tehergépkocsik részére. Milyen tulajdonságokat örököltetne a szülő osztályból és mikkel
egészítené ki azokat?
_________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________ _________________________________________________________________________________________
15
PROGRAMOZÁSMÓDSZERTAN II
MEGOLDÁSOK
1. feladat Tgepkocsi = class Típus: String; Gyártmány: String; Szín: String; Cm3: integer; Ár: longint; Rendszám:String; end;
16
PROGRAMOZÁSMÓDSZERTAN II 2. feladat Thasznaltkocsi = class (Tgepkocsi) Évjárat:integer; Futtottkm:longint; End;
17
PROGRAMOZÁSMÓDSZERTAN II 3. feladat Tteherkocsi = class (Tgepkocsi) Teherbírás:longint; Össztömeg:longint; End;
18
PROGRAMOZÁSMÓDSZERTAN II
IRODALOMJEGYZÉK FELHASZNÁLT IRODALOM KUROS, A. G. : Felsőbb algebra. Budapest (Tankönyvkiadó) 1978. KNUTH, Donald, E.: A számítógép-programozás művészete I-III. Budapest (Műszaki) 1987. OBÁDOVICS J. Gyula: Matematika. Budapest (Műszaki) 1978. REIMANN József: Matematika. Budapest 1982. WIRTH, Niklaus: Algoritmusok + Adatstruktúrák = Programok. Budapest (Műszaki) 1982.
19