Bevezetés az objektum orientált programozáshoz
Amikor az objektum orientált programozásról beszélünk (és komolyan tesszük azt), egy olyan szoftverkonstrukciós módszerre gondolunk, amely, az adatok egy csoportján végezhető műveletekre fókuszál. Azokhoz az adatokhoz, amelyekre szükségünk van egy feladat megoldása során, az absztrakció révén jutunk hozzá.
Adában az adatok csoportosításának eszköze a rekord.
A rekordon végezhető műveleteken pedig olyan eljárásokat és függvényeket értünk, amelyeknek formális paraméterlistájában (legalább) egy változó- vagy visszatérési érték típusaként szerepel az adott rekord típus.
Ahhoz, hogy egy, az „osztály” fogalmának megfelelő entitást kapjunk egy csomag specifikációjában elhelyezett rekordot (típus deklarációt) ki kell egészítenünk:
- azzal a tulajdonsággal, hogy a továbbiakban újabb adatmezőkkel legyen bővíthető (tagged)
- a rajta végezhető műveletekkel, amelyek öröklődhetnek is (primitív műveletek),
- valamint konstruktorral, destruktorral (és értékadással). (Emlékeztető: Ada.Finalization csomag)
Figyeljük meg, hogy a csomag koncepciója fontos szerepet játszik az osztály fogalmának kialakításában, azonban a láthatóság fogalma nem kapcsolódik szorosan az objektum orientált szemlélethez.
Az Ada nyelv nem vezet be külön nyelvi elemet az osztály jelölésére.
A metódusok / primitív műveletek olyan műveletek, amelyeknek deklarációi a rekord típus deklarációja után szerepelnek, valamint formális paraméterlistájukban vagy visszatérési értékükben szerepel a rekord típus vagy a névtelen rekord típusra mutatható mutató típus.
(fagyasztási szabályok / freezing rules)
Egy primitív művelet kizárólag egy jelölt (tagged) rekord típushoz tartozhat.
A származtatásra - melynek során egy osztályt felhasználva egy másik (leszármazott) osztályt készítünk, - alapvetően kétféle képen tekinthetünk.
Tekinthetjük egyfajta kiterjesztésnek, melynek során az osztály új adatmezőkkel és metódusokkal bővül, ugyanakkor ez a folyamat nem más, mint specializáció, amely szűkíti a leszármazott osztály felhasználási körét, azáltal, hogy „konkrétabb” tulajdonságokkal és műveletekkel látja el azt.
(Általánosabban fogalmazva, a származtatással egy új típust hozunk létre egy már korábban létezőből.)
Az Ada 95 programozási nyelv megjelenése óta az osztályok egyértelmű megkülönböztetésére a ’Tag attribútum szolgál, amellyel a jelölt (tagged) típusok rendelkeznek. (A típust az Ada.Tags csomag definiálja.)
Azoknak a típusoknak a csoportját, melyek egy közös őssel (alap típussal) rendelkeznek az osztályhoz tartozó osztályszintű indefinit típus ( Kozos_Os_Tipus’Class ) jelöli.
Ezeknek a fogalmaknak az osztályok dinamikus viselkedése kapcsán jut fontos szerep. (polimorfizmus)
Ezekkel az attribútumokkal (típusokkal) illetve a rájuk épülő mechanizmusokkal nyílik lehetőségünk arra, hogy futás közben, dinamikusan kiválasszuk (dispatching), vagy esetleg újra kiválasszuk (redispatching) azokat a metódusokat, amelyek egy adott objektum példány típusához tartoznak.
Dinamikus kötés akkor lép fel egy hívásnál (!!!), ha az aktuális paraméter osztályszintű, a formális pedig specializált (konkrét típus)!
A szintaxis által a dinamikus kötést használni szándékozó kódrészek könnyen felismerhetőek ez nagyban segíti a program forráskód alapján történő megértését!
Megjegyezzük, hogy az objektum orientált tervezés csupán egy módszer, amelyet más szoftverkonstrukciós módszerekhez hasonlóan akkor célszerű alkalmazni, ha előnyként értékeljük azokat a lehetőségeket, amelyeket biztosít!
Gondoljuk meg, hogy míg az objektum orientált szemlélet esetén új művelet bevezetése az osztály hierarchiához meglehetősen költséges lehet (esetleg sok fájlban kell módosítanunk, és az osztályoknak meg kell valósítani a műveleteket) a típusokkal való bővíthetőség könnyű.
Amennyiben a variáns rekordok használata mellett döntünk, az új adatmezőkkel való bővíthetőség nehézkes… (az újabb case ág implementálása miatt a műveletekben).
Biztonságkritikus rendszereknél a bemutatott tervezési elveknek a megfontolása elsődleges!
Tanulmányozzuk alaposan a bemutatásra kerülő programokat!
idozito.ads
idozito.adb
idozito-muvelet_idozito.ads
idozito-muvelet_idozito.adb
utemezo.adb
csomag.ads
csomag.adb
orokles.adb
megjegyzések:
A jelölt típusok mindig referencia szerint adódnak át!
Ha szemléletesebben szeretnénk a ’Tag és a ’Class fogalmáról beszélni, mondhatjuk, hogy amikor az Ada nyelv egy osztályáról (típusosztályáról) beszélünk, típusok egy csoportjára gondolunk. Ezen csoport tagjai mind rendelkeznek egy közös tulajdonsággal, amely alapján egyértelműen eldönthető, hogy egy adott osztályba tartoznak vagy sem. Ezenkívül egy osztály minden tagja egyértelmű és speciális.
Attachment | Size |
---|---|
orokles.zip | 7.45 KB |