4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.

Hasonló dokumentumok
Programozási nyelvek (ADA)

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

PROGRAMOZÁSI NYELVEK - ADA. GYAKORLAT JEGYZET

2. előadás Programegység, fordítási egység, könyvtári egység, beágyazás, blokkszerkezet, alprogramok, csomagok

6. előadás Hatókör, láthatóság, élettartam. Változók leképzése a memóriára. Blokkszerkezetes nyelvek. Kivételkezelés.

8. előadás Dinamikus memóriakezelés. Mutatók. Láncolt adatszerkezetek.

Algoritmizálás és adatmodellezés tanítása 1. előadás

11) Statikus és dinamikus hatóköri szabályok. Statikus és dinamikus hatókör. értelmezzük

Kifejezések. Kozsik Tamás. December 11, 2016

Programozási nyelvek I. (Az Ada) Kozsik Tamás

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

3. előadás Típusrendszerek. Az Ada típusai és típuskonstrukciós eszközei, I.

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Programozási nyelvek (ADA)

Programozás alapjai. 5. előadás

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Programozási nyelvek Java

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Programozás II. 2. Dr. Iványi Péter

Programozási nyelvek Java

OOP #14 (referencia-elv)

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Adatszerkezetek I. 1. előadás

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Alprogramok, paraméterátadás

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

Java II. I A Java programozási nyelv alapelemei

Occam 1. Készítette: Szabó Éva

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Összefoglaló. <variable_name> [IN OUT IN OUT] <data_type> [:=<default_value>] ... <label_name>: <statements>... GOTO <label_name>;...

Informatika terméktervezőknek

A JavaScript főbb tulajdonságai

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Java programozási nyelv 5. rész Osztályok III.

Objektumelvű programozás

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Programozás C++ -ban

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Web-technológia PHP-vel

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Java II. I A Java programozási nyelv alapelemei

Felhasználó által definiált adattípus

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Java és web programozás

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 15. Széchenyi István Egyetem, Gy r

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Tételsor a Programozási nyelvek (Ada) tárgyhoz 1-10

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Programozási nyelvek Java

A C# programozási nyelv alapjai

12. előadás Szinkronizációs feladatok (2). Védett egységek. Álvéletlenszámok. OOP az Adában.

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Apple Swift kurzus 3. gyakorlat

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

A C programozási nyelv I. Bevezetés

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

A C programozási nyelv I. Bevezetés

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Bevezetés, a C++ osztályok. Pere László

Bevezetés a programozásba I.

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Algoritmizálás + kódolás C++ nyelven és Pascalban

OOP. Alapelvek Elek Tibor

Haladó DBMS ismeretek 1

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

C++ programozási nyelv

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Python tanfolyam Python bevezető I. rész

7. előadás Paraméterátadás. Paraméterek az Adában. Túlterhelés. Felüldefiniálás. Kifejezések.

Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Programozás módszertan

Programozás II. 4. Dr. Iványi Péter

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

CSOMAG. Az Ada csomag két részből áll: csomag specifikáció csomag törzs. -- specifikációs rész: PACKAGE név IS. -- a csomag kívülről nem látható része

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

Programozás C++ -ban

Bevezetés a C++ programozási nyelvbe

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Programozás módszertan p.1/46

Átírás:

4. előadás Az Ada típusai és típuskonstrukciós eszközei, II. Rekordok és átlátszatlan típusok. A csomagok. Adatabsztrakció, egységbe zárás.

A rekord típus A direktszorzat és az unió típuskonstrukciók megvalósításához Összetett típus, amelynek komponens típusai különböző, már deklarált típusokhoz tartozhatnak Komponens: rekord mező A komponensekhez nevet rendelünk: szelektor A komponensek nevének különbözőeknek kell lenniük 2

Egy példa type Hónap is ( Január,, December); type Dátum is record Év: Integer; Hó: Hónap; Nap: Integer range 1.. 31; end record ; D: Dátum; D.Év := 2003; D.Hó := November; D.Nap := 22; 3

Előre definiált műveletek A mezőelérés D.Év := D.Év + 1; Az értékadás és a (nem)egyenlőség vizsgálat (ha nem korlátozott a típus) if D1 /= D2 then D2 := D1; end if; A tartalmazás-ellenőrzés (altípusoknál) if D in Dátum then end if; Az explicit konverzió (leszármaztatott típusnál) type Date is new Dátum; Today: Date := Date(D); 4

A mezők kezdőértéke A típus definíciójában megadhatjuk a típus objektumainak kezdőértékeit: type Komplex is record Valós, Képzetes: Float := 0.0; end record; C: Komplex; I: Komplex := (0.0, 1.0) 5

Ha változhat a tárterület mérete... Max_Méret: constant Integer := 10; type Szöveg is record Hossz: Integer range 0.. Max_Méret := 0; Érték: String( 1.. Max_Méret ); Pozíció: Integer range 0.. Max_Méret := 0; end record ; 6

Diszkriminánsos rekord Paraméteres típus: A típusértékek paraméterezhetők Néhány más típusnak is lehet diszkriminánsa Adában... Több diszkriminánsa is lehet egy típusnak A rekord-diszkrimináns diszkrét típusú type Szöveg( Hossz: Natural ) is record Érték: String( 1.. Hossz ); Pozíció: Natural := 0; end record ; 7

Több diszkrimináns type Tömb is array ( Integer range <> ) of Integer; type Mátrix is array ( Integer range <>, Integer range <> ) of Float; type Táblázat ( Sorok, Oszlopok: Natural ) is record Sor_Címkék : Tömb( 1..Sorok ); Oszlop_Címkék : Tömb( 1..Oszlopok ); Adatok : Mátrix( 1..Sorok, 1..Oszlopok ) ; end record; 8

Megszorítatlan típus... A diszkriminánsos rekord egy megszorítatlan típus Olyan, mint a megszorítatlan indexhatárú tömb Sok a hasonlóság a használatban is Nem használható objektum létrehozására S: String; -- hibás Sz: Szöveg; -- változódefiníciók 9

Nem teljesen meghatározott típus indefinite type Például a megszorítás nélküli indexhatárú tömb típus a diszkriminánsos rekord típus Nem lehet közvetlenül változót definiálni vele nem ismerjük a méretét de például helyes ez: X: T := (1,5,3); Nem lehet tömb elemtípusa sem Lehet viszont formális paraméter típusa 10

Rekord objektum létrehozása Meg kell szorítani a típust a diszkrimináns(ok) értékének megadásával Ez egy altípus definiálását jelenti vagy altípus-deklarációval subtype Szöveg_10 is Szöveg(10); Sz: Szöveg_10; vagy az objektum definíciójában (névtelen altípus ) Sz: Szöveg(10); vagy a kezdőértékadás rögzítse az altípust Sz: Szöveg := (10, "abcdefghij", 0); 11

Diszkriminánsos rekord altípusai A diszkrimináns értékének megadásával altípusok hozhatók létre Ha több diszkrimináns van, akkor mindnek értéket kell adni Ezek az altípusok már használhatók objektumok létrehozására Egy objektum altípusa nem változhat ( ) Beletartozás egy altípusba: in és not in operátorok if Sz in Szöveg_10 then... 12

Mire jó a diszkriminánsos rekord Különböző méretű (memóriafoglalású) objektumokat tartalmazó típus Sz_1: Szöveg(10); Sz_2: Szöveg(100); Sz_2 := Sz_1; -- futási idejű hiba! -- fordítás: warning 13

Mire jó a diszkriminánsos rekord Alprogramok általánosabb formában történő megírására function Szavak_Száma( Sz: Szöveg ) return Natural Az aktuális paraméter határozza meg Sz méretét, azaz a Hossz diszkrimináns értékét a függvényben 14

Hivatkozás a diszkriminánsra type Szöveg( Hossz: Natural ) is record Érték: String(1.. Hossz); Pozíció: Natural := 0; end record ; Sz: Szöveg(30); Az Sz rekord mezői: Sz.Hossz Sz.Érték Sz.Pozíció 15

Sz: Szöveg := (20, " Vége az órának! ", 4); N: Natural := Szavak_Száma(Sz); function Szavak_Száma( Sz: Szöveg ) return Natural is Szám: Natural := 0; begin if Sz.Pozíció < 2 and then Sz.Érték(1) /= ' ' then Szám := 1; end if; for I in Integer ' Max(2, Sz.Pozíció).. Sz.Hossz loop if Sz.Érték(I) /= ' ' and then Sz.Érték(I-1) = ' ' then Szám := Szám + 1; end if; end loop; return Szám; end; 16

Diszkrimináns alapértelmezett értéke subtype Méret is Natural range 0..1000; type Szöveg_D( Hossz: Méret := 10 ) is record Érték: String(1.. Hossz); Pozíció: Natural := 0; end record ; Sz_1: Szöveg_D(10); Sz_2: Szöveg_D; 17

Mire jó, ha van? Nem kötelező megszorítást adni az objektumok létrehozásakor A diszkrimináns fel tudja venni az alapértelmezett értéket A diszkrimináns értéke - az egész rekordra vonatkozó értékadással - változtatható. Egyéb esetben a diszkrimináns értéke nem változtatható meg! Az altípus nem változhat! 18

Sz_1: Szöveg(10); Sz_2, Sz_3: Szöveg(20); Sz_1 := Sz_2; -- futási idejű hiba Sz_3 := Sz_2; Sz_1 := (3, "abc", 0); -- futási idejű hiba Sz_D_1: Szöveg_D(10); Sz_D_2: Szöveg_D(20); Sz_D_1 := Sz_D_2; -- futási idejű hiba Sz_D_1 := (3, "abc", 0); -- futási idejű hiba Sz_D: Szöveg_D; -- a Hossz 10, de változhat is! Sz_D_1 := Sz_D; Sz_D := Sz_D_1; Sz_D := Sz_D_2; Sz_D := (3, "abc", 0); 19

Veszély Sz_D: Szöveg_D; A fordítóprogram a legnagyobb változathoz tartozó memóriát foglalja le Könnyen lehet futási idejű hiba a változó létrehozásakor Storage_Error 20

Rugalmas szöveg típus? type Rugalmas_Szöveg(Max: Integer := 0) is record Karakterek: String(1..Max ) := (others => ' '); end record; X: Rugalmas_Szöveg; X := (10, (others => 'a')); X := (20000, (others => 'b')); Az Integer túl nagy, nem tud annyit lefoglalni 21

A variáns rekord Biztonságos unió típus szemben a Pascal vagy a C hasonló szerkezetével Diszkriminánsos rekord a diszkrimináns értékén elágazó szerkezettel A reprezentációs reláció egy függvény egy tárterület csak egyféleképpen értelmezhető a típusértékek különböző szerkezetűek lehetnek Egy objektum szerkezetének megváltoztatására is van lehetőség 22

type Állapot is (Egyedülálló, Házas, Özvegy, Elvált); subtype Név is String(1..25); type Nem is (Nô, Férfi); type Ember (Családi_Állapot: Állapot := Egyedülálló) is record Neve: Név; Neme: Nem; Születési_Ideje: Dátum; Gyermekek_Száma: Natural; case Családi_Állapot is when Házas => Házastárs_Neve: Név; when Özvegy when Elvált when Egyedülálló => null ; end case; end record ; => Házastárs_Halála: Dátum; => Válás_Dátuma: Dátum; Gyerekek_Gondozója: Boolean; 23

Hugó: Ember(Házas); Családi_Állapot, Neve, Neme, Születési_Ideje, Gyermekek_Száma, Házastárs_Neve Eleonóra: Ember(Egyedülálló); Családi_Állapot, Neve, Neme, Születési_Ideje, Gyermekek_Száma Ödön: Ember(Özvegy); Családi_Állapot, Neve, Neme, Születési_Ideje, Gyermekek_Száma, Házastárs_Halála Vendel: Ember(Elvált); Családi_Állapot, Neve, Neme, Születési_Ideje, Gyermekek_Száma, Válás_Dátuma, Gyerekek_Gondozója Aladár: Ember; -- Egyedülálló Családi_Állapot, Neve, Neme, Születési_Ideje, Gyermekek_Száma Helytelen (futási idejű hiba, altípus-megszorítás megsértése): Hugó.Válás_Dátuma, Aladár.Házastárs_Neve 24

Megszorított altípus létrehozása subtype Egyedülállók is Ember(Egyedülálló); Elek: Egyedülállók; Eugénia: Ember(Egyedülálló); A szerkezet (azaz a diszkrimináns, és vele együtt az altípus) már nem változtatható meg Eleknek és Eugéniának sosem lesz házastársa. 25

Megszorítatlan altípus használata Aladár: Ember; Aladár := (Házas,...); Aladár := Elek; Aladár := Hugó; -- alapértelmezett Egyedülálló A szerkezetét megváltoztathatjuk, diszkriminánsostul Csak úgy, ha az egész rekord értéket kap egy értékadásban 26

A különbségek Aladár: Ember; Elek: Ember(Egyedülálló); Elek: Ember(Egyedülálló) := (Egyedülálló, ) Aladár: Ember := (Egyedülálló, ) Aladár: Ember := (Özvegy, ); 27

subtype Név_Hossz is Natural range 0..20; type Foglalkozás is (Tanár, Diák); subtype Átlag is Float range 0.0..5.0; type Személy( Betűszám: Név_Hossz := 0; Foglalkozása: Foglalkozás := Diák ) is record Neve: String(1..Betűszám); case Foglalkozása is when Tanár => Oktatottak_Száma: Natural; when Diák => Nappalis_E: Boolean := True; Átlaga: Átlag; end case; end record; 28

type Alakzat is ( Téglalap, Négyzet, Kör ); type Geometriai_Alakzat ( S: Alakzat ) is record case S is when Téglalap => A, B: Float; when Négyzet => Oldal: Float; when Kör => Sugár: Float := 1.0; end case ; end record ; function Terület( F: Geometriai_Alak ) return Float is begin case F.S is when Téglalap => return F.A * F.B; when Négyzet => return F.Oldal ** 2; when Kör => return 3.14159265358979 * F.Sugár ** 2; end case ; end Terület; 29

Mire használható a diszkrimináns értéke Típusdefinícióban a diszkrimináns lehet indexmegszorítás a variáns rész kiválasztója aktuális paraméter Minden esetben önmagában kell állnia, nem szerepelhet kifejezésben 30

Aktuális paraméter (1) Tömb megszorítása (Szöveg) A származtatott típusban a diszkrimináns lehet az ős típus paraméterének egy aktuális értéke: type Táblázat ( Sorok, Oszlopok: Natural ) is record Sor_Címkék : Float_Tömb( 1..Sorok ); Oszlop_Címkék : Float_Tömb( 1..Oszlopok ); Adatok: Integer_Mátrix( 1..Sorok, 1..Oszlopok ) ; end record ; type Szorzótábla ( Méret: Positive ) is new Táblázat( Méret, Méret ); 31

Aktuális paraméter (2) Ha a diszkriminánssal rendelkező típus újabb diszkriminánssal rendelkező típust tartalmaz, akkor ennek a diszkriminánsa függhet a külső típus diszkriminánsaitól (és csak attól függhet ) type Könyv( Hossz: Positive ) is record ISBN: String(1..10); Tartalom: Szöveg(Hossz); end record ; 32

Rekordok 'Constrained attribútuma Legyen az A egy diszkriminánsos rekord típusú változó (vagy formális paraméter). Az A Constrained értéke igaz, ha az A (illetve a neki megfeleltetett aktuális paraméter) egy konstans, egy érték, vagy egy megszorított változó. Azaz hamis akkor, ha az A egy megszorítást nem tartalmazó, a diszkrimináns alapértelmezett értékével létrehozott objektum, ami megváltoztathatja az altípusát. 33

Csomag Programok tagolásának egy eszköze Komponensek gyűjteménye Összetartozó dolgok egységbe zárása Text_IO: Input-output műveletek gyűjteménye (Adat)absztrakció támogatása encapsulation, information hiding típusértékhalmaz + műveletek 34

Egységbe zárás és absztrakció Egységbe zárás: ami egybe tartozik, az legyen egyben Absztrakció: vonatkoztassunk el a részletektől rejtsük el a részleteket a többi komponens elől Moduláris programozást támogató nyelvek Modula-2, CLU, Haskell Objektum-elvű nyelvek: osztály 35

Ismétlés Csomag: egy programegység beágyazva vagy könyvtári egységként Specifikáció és törzs szintaktikusan erősen szétválik a specifikáció törzset nem tartalmazhat külön fordítható: 2 fordítási egység a GNAT specialitásai a use utasítás: minősítés feloldása 36

Csomag - programegység Specifikációs rész külvilág számára nyújtott felület látható rész kívülről használható komponensek specifikációja átlátszatlan rész (opcionálisan megadható) reprezentációs információ a fordító számára (logikailag a törzshöz tartozik) Törzs megvalósítás, implementációs részletek 37

Specifikáció és törzs package A is private end A; -- látható rész -- opcionális átlátszatlan rész package body A is -- itt már törzsek is lehetnek begin -- opcionális (inicializáló) utasítások end A; 38

Mire használjuk a csomagokat? Alprogramgyűjtemény Egyke objektum megvalósítása (singleton) pl. absztrakt állapotgép (Abstract State Machine) Típusmegvalósítás pl. absztrakt adattípus (Abstract Data Type) 39

Alprogramok gyűjteménye package Trigonometrikus is function Sin ( X: Float ) return Float; function Cos ( X: Float ) return Float; function Tan ( X: Float ) return Float; end Trigonometrikus; A törzsben az alprogramok megvalósítása 40

Egyke objektum megvalósítása (1) Abstract State Machine - egységbe zárva - részletek elrejtve package Stack is subtype Item is Integer; -- később majd param. procedure Push( X: in Item ); procedure Pop( X: out Item ); function Top return Item; function Is_Empty return Boolean; end Stack; 41

Egyke objektum megvalósítása (2) package body Stack is Capacity: constant Positive := 100; -- ez is lehet paraméter Data: array( 1..Capacity ) of Item; Stack_Pointer: Natural := 0; procedure Push( X: in Item ) is begin Stack_Pointer := Stack_Pointer + 1; Data(Stack_Pointer) := X; end Push; end Stack; 42

Egyke objektum használata (1) with Stack, Ada.Command_Line, Ada.Integer_Text_IO; procedure Revert is N: Integer; begin for I in 1..Ada.Command_Line.Argument_Count loop N := Integer Value(Ada.Command_Line.Argument(I)); Stack.Push( N ); end loop; while not Stack.Is_Empty loop Stack.Pop( N ); Ada.Integer_Text_IO.Put(N); end loop; end Revert; 43

Egyke objektum használata (2) with Stack, Ada.Command_Line, Ada.Integer_Text_IO; use Stack; procedure Revert is N: Integer; begin for I in 1..Ada.Command_Line.Argument_Count loop N := Integer Value(Ada.Command_Line.Argument(I)); Push( N ); end loop; while not Is_Empty loop Pop( N ); Ada.Integer_Text_IO.Put(N); end loop; end Revert; 44

Egyke objektum Singleton lesz még ilyen (taszk, védett egység) Mit tegyek, ha több vermet is szeretnék használni a programban? sablonok Verem típus készítése típusműveletek összegyűjtése, összecsomagolása a típusértékhalmaz definíciójával 45

Típusmegvalósítás package Matrices is type Matrix is array ( Integer range <>, Integer range <> ) of Float; function + ( A, B: Matrix ) return Matrix; function - ( A, B: Matrix ) return Matrix; function * ( A, B: Matrix ) return Matrix; end Matrices; A törzsben a típusműveletek megvalósítása 46

A Verem típus package Stacks is subtype Item is Integer; -- paraméter lesz Capacity: constant Positive := 100; -- akár ez is type Item_Array is array( 1..Capacity ) of Item; type Stack is record Data: Item_Array; Stack_Pointer: Natural := 0; end record; procedure Push( V: in out Stack; X: in Item ); end Stacks; 47

Diszkriminánsos rekorddal package Stacks is subtype Item is Integer; type Item_Array is array( Integer range <> ) of Item; type Stack(Capacity: Positive ) is record Data: Item_Array(1..Capacity); Stack_Pointer: Natural := 0; end record; procedure Push( V: in out Stack; X: in Item ); end Stacks; 48

Absztrakt adattípus Az előző példában az egységbe zárás elve (encapsulation) teljesül Mi van az implementációs részletek elrejtésével (information hiding)? Jó lenne elrejteni a Verem típus reprezentációját a külvilág elől! 49

Az absztrakció fontossága A szoftvertermék minőségi mutatóinak javítása egységbe zárás: olvashatóság (átláthatóbb kód) információ elrejtés: módosíthatóság karbantarthatóság modularizáció: könnyebb/gyorsabb elkészíteni 50

Átlátszatlan típus A reprezentációt elrejtem a csomag specifikációjának átlátszatlan részében A használó programegységek nem férnek hozzá a reprezentációhoz, ezért nem is függnek tőle csak a műveleteken keresztül használják a típust A típus részleges nézetét látják, a teljes nézet az átlátszatlan (privát) részben van A fordítóprogram használhatja és használja is a reprezentációt (méret), ezért van a specifikációban 51

package Stacks is subtype Item is Integer; -- ebből lesz majd paraméter type Stack is private; procedure Push( V: in out Stack; X: in Item ); private Capacity: constant Positive := 100; type Item_Array is array( 1..Capacity ) of Item; type Stack is record Data: Item_Array; Stack_Pointer: Natural := 0; end record; end Stacks; 52

package Stacks is subtype Item is Integer; -- ebből lesz majd paraméter type Stack (Capacity: Positive) is private; procedure Push( V: in out Stack; X: in Item ); private type Item_Array is array( Integer range <> ) of Item; type Stack( Capacity: Positive ) is record Data: Item_Array(1..Capacity); Stack_Pointer: Natural := 0; end record; end Stacks; 53

Az átlátszatlan típus műveletei Ami a részleges nézetből kiderül a reprezentációról az utóbbiban a Capacity:Positive mező A részleges nézetből származó műveletek := = /= A csomag által specifikált alprogramok, melyek valamelyik paramétere vagy visszatérési értéke olyan típusú 54

Korlátozott típusok Az értékadás és a (nem)egyenlőtlenség vizsgálata letiltható: nincs := = /= A típus definíciójában szerepel a limited type R is limited record end record; Egy nézet is lehet korlátozott, például a részleges 55

Vermek összehasonlítása 2 v1 x y z s d x q 2 v1 = v2? v2 x y z q a x q 56

Korlátozott átlátszatlan típus Mikor egyenlő két verem? Mit jelent az értékadás láncolt adatszerkezet esetén? A C++ nyelvben felüldefiniáljuk az értékadás és egyenlőségvizsgálat operátorokat Az Adában az értékadás nem operátor A limited kulcsszót használhatjuk az átlátszatlan típus részleges nézetének megadásakor Az Ada95-ben van még Controlled is 57

package Stacks is subtype Item is Integer; type Stack (Capacity: Positive) is limited private; procedure Push( V: in out Stack; X: in Item ); private type Item_Array is array( Integer range <> ) of Item; type Stack(Capacity: Positive ) is record Data: Item_Array(1..Capacity); Stack_Pointer: Natural := 0; end record; end Stacks; 58

Hierarchikus csomagszerkezet Logikailag egységbe zárás Fizikailag szétbontás, modularizálás Gyermek csomagok titkos és nyilvános gyermek 59

Késleltetett definíciójú konstans package Komplexek is type Komplex is private; I : constant Komplex; function "+"(X,Y:Komplex) return Komplex; function "-"(X,Y:Komplex) return Komplex; private type Komplex is I: constant Komplex := (0.0, 1.0); end Komplexek; 60

Példa csomag specifikációjára package Text_IO is procedure Put_Line( S: in String ); procedure New_Line( N: in Positive := 1 ); procedure Get_Line( S: out String; L: out Natural ); procedure Put( S: in String ); end Text_IO; Specifikációk igen, törzsek nem! 61

Példa csomag törzsére package body Text_IO is procedure Put_Line( S: in String ) is begin end Put_Line; end Text_IO; Törzsek! 62

Programszerkezet és csomagok Egy csomagba beteszünk összetartozó dolgokat pl. beágyazunk más programegységeket (alprogramokat, csomagokat) A csomagokat is beágyazhatjuk más programegységekbe (alprogramokba, csomagokba) Készíthetünk csomagokból könyvtári egységet is (azaz külön fordítási egységeket) 63

Programegységek beágyazása egy csomagba Specifikációt specifikációba vagy törzsbe Törzset törzsbe Alprogram törzsét vagy csomag törzsét nem írhatjuk egy csomag specifikációs részébe Írhatunk viszont specifikációt (pl. egy beágyazott csomag specifikációját) a csomag törzsébe... 64

package A is procedure Eljárás( Formális: in String ); (sub)type T is V: Integer; package B is end B; end A; package body A is procedure Eljárás( Formális: in String ) is end Eljárás; package body B is end B; procedure Segéd( Formális: out Integer ); (sub)type S is W: Float; package C is end C; package body C is end C; procedure Segéd( Formális: out Integer ) is end Segéd; end A; exportált (kívülről látható) dolgok specifikációja rejtett dolgok, specifikációk és törzsek 65

Csomag definíciója Csomag specifikációjának és törzsének megadása Szerepelhet deklarációs részekben alprogram deklarációs részében declare utasítás deklarációs részében másik csomag törzsében (annak deklarációs részében) Másik csomag specifikációs részével vigyázni kell! Szerepelhet külön könyvtári egységként is 66

Csomag beágyazása, pl. alprogramba function F ( Formális: T ) return T is package A is end A; package body A is end A; begin end F; 67

Csomag, mint könyvtári egység Ha nem ágyazzuk be a csomagot Ekkor két fordítási egységből áll külön fordítható (és fordítandó általában) a csomag specifikációja és a csomag törzse A csomag könyvtári egységet használó más fordítási egység csak a csomag specifikációs részétől függ Ha lefordítottam a csomag specifikációját, akkor már használhatom is, a tőle függő fordítási egységeket lefordíthatom, mielőtt a csomag törzsét elkészíteném a törzs csak az összeszerkesztéshez kell majd 68

Miért fontos ez? Több szabadság a program komponenseinek elkészítési sorrendjében A fordítás (ellenőrzés) lehetséges! Team-munka támogatása, párhuzamos fejlesztés Egy csomag törzse, azaz az implementációs részletek megváltoztathatók az egész program újrafordítása nélkül, csak összeszerkeszteni kell Gyorsabb fordítás Nagy rendszerek készítése Hibák javítása nem okoz inkonzisztenciát 69

Hogyan kell használni a csomag könyvtári egységet? a with és a use utasítás with Text_IO; procedure A is begin end; Text_IO.Put_Line( Szia! ); A használatot előre jelezni kell - with Mint amikor alprogramot A komponensekhez hozzáférek minősítéssel 70

Hogyan kell használni csomag könyvtári egységet? a with és a use utasítás with Text_IO; use Text_IO; procedure A is begin end; Put_Line( Szia! ); A komponensekhez való hozzáférésnél a minősítés feloldható - use Csak csomag könyvtári egységre van értelme use-t írni 71

A GNAT fordító és a csomagok A könyvtári egységként szereplő A csomag specifikációja: a.ads törzse: a.adb gnatmake: ez már az összeszerkesztő is de azért használható ads fordítására is $ gnatmake a.ads gcc -c a.ads No code generated for file a.ads (package spec) gnatmake: a.ads" compilation error $ 72