Szoftvertechnológia 3. előadás. Objektumorientált tervezés: alapismeretek. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Hasonló dokumentumok
Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Alkalmazott modul: Programozás 10. előadás. Objektumorientált programozás: tervezés és megvalósítás

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Objektumelvű programozás

Alkalmazott Modul III 4. előadás. Objektumorientált programozás: objektumok és osztályok. Procedurális programozás Koncepció

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

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

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

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Alkalmazott Modul III 6. gyakorlat. Objektumorientált programozás: öröklődés és polimorfizmus

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

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

Generikus osztályok, gyűjtemények és algoritmusok

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

Osztályok. 4. gyakorlat

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozási nyelvek Java

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Programozási technológia

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

Alkalmazott modul: Programozás 10. fejezet. Strukturált programozás: dinamikus memóriakezelés. Giachetta Roberto

Alkalmazott modul: Programozás 8. előadás. Strukturált programozás: dinamikus memóriakezelés. Dinamikus memóriakezelés. Dinamikus memóriakezelés

Adatstruktúrák, algoritmusok, objektumok

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

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

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

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

é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

Szoftvertechnológia 4. előadás. Objektumorientált tervezés: általánosítás. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Alkalmazott modul: Programozás

OOP. Alapelvek Elek Tibor

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

Interfészek. PPT 2007/2008 tavasz.

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

OOP #14 (referencia-elv)

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

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

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

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

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Programozási technológia

S0-02 Típusmodellek (Programozás elmélet)

Objektum orientált programozás Bevezetés

Adatszerkezetek és algoritmusok

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

Objektumorientált paradigma és programfejlesztés Bevezető

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

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Bevezetés a Programozásba II 1. előadás. Szoftverfejlesztés, programozási paradigmák

3. Osztályok II. Programozás II

C++ programozási nyelv Konstruktorok-destruktorok

Programozási nyelvek Java

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

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

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

Elemi Alkalmazások Fejlesztése II.

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

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

Programozási nyelvek Java

Programozás módszertan p.1/46

Java és web programozás

Programozási alapismeretek 4.

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

ISA szimulátor objektum-orientált modell (C++)

OOP és UML Áttekintés

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

Programozás II gyakorlat. 8. Operátor túlterhelés

500. AA Megoldó Alfréd AA 500.

Már megismert fogalmak áttekintése

128. AA Megoldó Alfréd AA 128.

Generikus Típusok, Kollekciók

Programfejlesztési Modellek

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

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Informatikai Kar. 4. fejezet. Giachetta Roberto

Bevezetés a programozásba. 9. Előadás: Rekordok

Objektumorientált paradigma és a programfejlesztés

Bevezetés a programozásba 2

Pénzügyi algoritmusok

C++ programozási nyelv

Amortizációs költségelemzés

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

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

Alkalmazott modul: Programozás 6. előadás. Strukturált programozás: újrafelhasználható adattípusok

.Net adatstruktúrák. Készítette: Major Péter

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ó

Programozási nyelvek II.: JAVA, 11. gyakorlat

Programozási technológia

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

TestLine - OO Programozás alapjai Minta feladatsor

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

JAVA PROGRAMOZÁS 2.ELŐADÁS

Objektum-orientált programozás

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Szoftvertechnológia 3. előadás Objektumorientált tervezés: alapismeretek Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Actually I made up the term 'Object-Oriented', and I can tell you I did not have C++ in mind. (Alan Kay)

Procedurális programozás A procedurális programozási paradigma összetett alkalmazások esetén számos korlátozást tartalmaz: a program nem tagolható kellő mértékben (csupán alprogramok adottak) az adatok élettartama nem eléggé testre szabható (vannak lokális és globális változók) a vezérlés egy helyre (főprogram) összpontosul a feladat módosítása utóhatásokkal rendelkezhet Pl. amennyiben módosítjuk egy alprogramban az adatok reprezentációjának módját, az hatással lehet az összes, vele kapcsolatban álló alprogramra ELTE IK, Szoftvertechnológia 3:3

Procedurális programozás Feladat: Valósítsuk meg a verem (Stack) adatszerkezetet aritmetikai reprezentáció mellett. Lehessen elemet behelyezni (push), kivenni (pop), lekérdezni a tetőelemet (top), üres-e (isempty) a verem absztrakt adattípusa S = D n, Push, Pop, Top, IsEmpty Push: S D S Pop: S S D Top: S D IsEmpty: S L, ahol aritmetikai reprezentáció esetén egy vektor (v) és tetőelem index (top) biztosítja a vermet ELTE IK, Szoftvertechnológia 3:4

Procedurális programozás a verem műveletei aritmetikai reprezentációval: Push(v 1.. MAX, top, d) Pop(v 1.. MAX, top) top = MAX ABORT top = top + 1 v top d Top(v[1.. MAX], top) top = 0 ABORT Return (v[top]) ABORT top = 0 d = v[top] top = top 1 Return (d) ELTE IK, Szoftvertechnológia 3:5

Procedurális programozás Megvalósítás: void push(vector<int> v, int top, int d) { if (top == v.size()) throw STACK_FULL; // hibajelzés (kivétel) } top = top + 1; // művelet végrehajtása v[top] = d; int top(vector<int> v, int top) { if (top == 0) throw STACK_FULL; return v[top]; } ELTE IK, Szoftvertechnológia 3:6

Procedurális programozás Megvalósítás: int main() { vector<int> v; int top = 0; // verem létrehozása (2 lépésben) push(v, top, d); // elem behelyezése cout << top(v, top); // tetőelem lekérdezése } ELTE IK, Szoftvertechnológia 3:7

Kialakulása Megoldások: a felelősség továbbadása programegységeket alakítunk ki, amely rendelkeznek saját adataikkal és műveleteikkel, ezeket egységbe zárjuk, megvalósításukat elrejtjük a feladat megoldását a programegységek együttműködésével, kommunikációjával valósítjuk meg a reprezentáció és a belső működés elrejtése a külvilág (többi programegység) elől elrejtjük a működést, beleértve az adatok kezelésének módját a belső módosítások így nem befolyásolják a kommunikációt ELTE IK, Szoftvertechnológia 3:8

Az objektum Objektumnak (object) nevezzük a feladat egy adott tárgyköréért felelős programegységet, amely tartalmazza a tárgykör megvalósításához szükséges adatokat, valamint műveleteket az objektum működése során saját adatait manipulálja, műveleteit futtatja és kommunikál a többi objektummal pl.: egy téglalap adatai: szélessége és magassága műveletei: területkiszámítás, méretváltoztatás pl.: egy verem adatszerkezet adatai: elemek tartalmazó tömb és a felhasznált méret műveletei: push, pop, top ELTE IK, Szoftvertechnológia 3:9

Az objektum Az objektumok életciklussal rendelkeznek: létrejönnek (a konstruktorral), működést hajtanak végre (további műveletekkel), majd megsemmisülnek (a destruktorral) Az objektumok állapottal (state) rendelkeznek, ahol az állapot adatértékeinek összessége két objektum állapota ugyanaz, ha értékeik megegyeznek (ettől függetlenül az objektumok különbözőek) az állapot valamilyen esemény (műveletvégzés, kommunikáció) hatására változhat meg A program teljes állapotát a benne lévő objektumok összesített állapota adja meg ELTE IK, Szoftvertechnológia 3:10

Az objektum-orientált program Objektum-orientáltnak nevezzük azt a programot, amelyet egymással kommunikáló objektumok összessége alkot minden adat egy objektumhoz tartozik, és minden algoritmus egy objektumhoz rendelt tevékenység, nincsenek globális adatok, vagy globális algoritmusok a program így kellő tagoltságot kap az objektumok mentén az adatok élettartama összekapcsolható az objektum élettartamával a módosítások általában az objektum belsejében véghezvihetők, ami nem befolyásolja a többi objektumot, így nem szükséges jelentősen átalakítani a programot ELTE IK, Szoftvertechnológia 3:11

Az objektum-orientált program Az objektum-orientáltság öt alaptényezője: absztrakció: az objektum reprezentációs szintjének megválasztása enkapszuláció: az adatok és alprogramok egységbe zárása, a belső megvalósítás elrejtése nyílt rekurzió: az objektum mindig látja saját magát, eléri műveleteit és adatait öröklődés: az objektum tulajdonságainak átruházása más objektumokra polimorfizmus és dinamikus kötés: a műveletek futási időben történő működéshez kötése, a viselkedés átdefiniálása ELTE IK, Szoftvertechnológia 3:12

Az osztály Az objektumok viselkedési mintáját az osztály tartalmazza, az osztályból példányosíthatjuk az objektumokat tehát az osztály az objektum típusa speciális osztályoknak tekinthetőek a rekordok (record, structure), amelyek általában metódusok nélküli, egyszerűsített osztályok, adattárolási céllal felsorolási típusok (enumeration), amelyek csak értékkel rendelkeznek Az osztályban tárolt adatokat attribútumoknak, vagy mezőknek (field), az általa elvégezhető műveleteket metódusoknak (method) nevezzük, ezek alkotják az osztály tagjait (member) ELTE IK, Szoftvertechnológia 3:13

Láthatóság Az osztály tagjainak szabályozhatjuk a láthatóságát, a kívülről látható (public) részét felületnek, vagy interfésznek, a kívülről rejtett (private) részét implementációnak nevezzük a metódusok megvalósítása az implementáció része, tehát más osztályok számára a működés mindig ismeretlen az osztály mezői is az implementáció része, ezért minden mező rejtett (kivéve rekordok esetén) a mezőkhöz hozzáférést lekérdező (getter), illetve beállító (setter) műveletekkel engedélyezhetünk Az osztályokat minden nyelv más formában valósítja meg, de az általános jellemzőket megtartja ELTE IK, Szoftvertechnológia 1:14

Osztályok C++-ban A C++ programozási nyelv támogatja az objektumorientált programozást, noha alapvetően procedurális a program indítási pontja (main függvény) mindig procedurális A C++ osztály szerkezete: class/struct <osztálynév> { public/private: <típus> <mezőnév>; <típus> <metódusnév> ([ <paraméterek> ]) { } }; ELTE IK, Szoftvertechnológia 3:15

Az osztálydiagram Az UML osztálydiagram (class diagram) a programban szereplő osztályok szerkezetét, illetve kapcsolatait definiálja az osztálynak megadjuk a nevét, valamint mezőinek és metódusainak halmazát (típusokkal, paraméterekkel) megadjuk a tagok láthatóságát látható (+), illetve rejtett (-) jelölésekkel <osztálynév> - <mezőnév> :<típus>... + <metódusnév>(<paraméterek>) :<típus>... ELTE IK, Szoftvertechnológia 3:16

Az osztálydiagram Az osztálydiagram egyszerűsíthető elhagyhatjuk attribútumait, metódusait, vagy minden tagját <osztálynév> + <metódusnév>(<paraméterek>) :<típus>... <osztálynév> - <mezőnév> :<típus>... <osztálynév> tagjainak szintaxisát is egyszerűsíthetjük (pl. paraméterek, visszatérési típus elhagyása) Felsorolási típusoknál csak a felvehető értékeket adjuk meg (láthatóság nélkül) ELTE IK, Szoftvertechnológia 3:17

Az osztálydiagram Feladat: Valósítsuk meg a téglalap (Rectangle) osztályt, amely utólag átméretezhető, és le lehet kérdezni a területét és kerületét. a téglalapnak a feladat alapján elég a méreteit letárolni (_height, _width), amelyek egész számok lesznek ezeket a későbbiekben lekérdezhetjük (getwidth(), getheight()), vagy felülírhatjuk (setwidth(int), setheight(int)) lehetőséget adunk a terület, illetve került lekérdezésére (area(), perimeter()) lehetőséget adunk a téglalap létrehozására a méretek alapján (Rectangle(int, int)) ELTE IK, Szoftvertechnológia 3:18

Az osztálydiagram Tervezés: Rectangle - _width :int - _height :int + Rectangle(int, int) + area() :int + perimeter() :int + getwidth() :int + getheight() :int + setwidth(int) :void + setheight(int) :void ELTE IK, Szoftvertechnológia 3:19

Az osztálydiagram Megvalósítás: class Rectangle // téglalap típusa { private: int _width; // szélesség int _height; // magasság public: // látható rész Rectangle(int w, int h) { } // 2 paraméteres konstruktor művelet int area(); // téglalap területe int perimeter(); // téglalap kerülete }; ELTE IK, Szoftvertechnológia 3:20

Az osztálydiagram kiegészítései Az osztálydiagram számos kiegészítést tartalmazhat feltételeket (invariánst) szabhatunk a mezőkre, metódusokra a { } jelzéssel speciálisan a lekérdező műveleteket a {query} jelzéssel jelölhetjük jelölhetünk kezdőértéket a mezőkre (amelyet a konstruktor állít be) <osztálynév> - <mezőnév> :<típus> = <kezdőérték> {<feltétel>} + <metódusnév>() :<típus> {query} ELTE IK, Szoftvertechnológia 3:21

Az osztálydiagram kiegészítései adhatunk sablont a típusnak további tulajdonságokat jelölhetjük, illetve csoportba foglalásokat végezhetünk a << >> jelzéssel «csoport» <osztálynév> <sablon> «csoport» - <mezőnév> :<típus> «csoport» + <metódusnév>() :<típus> ELTE IK, Szoftvertechnológia 3:22

Az osztálydiagram kiegészítései Feladat: Valósítsuk meg a téglalap (Rectangle) osztályt, amely utólag átméretezhető, és le lehet kérdezni a területét és kerületét. a téglalap méretei nem lehetnek negatívak, ezt mind a mezőknél, mint a paramétereknél megadhatjuk feltételként (a paraméternek jelöljük a nevét) az implementációban is biztosítanunk kell a feltételek ellenőrzését a terület és kerület műveletek csak lekérdező műveletek, ezt jelölhetjük a tervben és a megvalósításban (const) a lekérdező, illetve beállító műveleteket külön csoportokba sorolhatjuk ELTE IK, Szoftvertechnológia 3:23

Az osztálydiagram kiegészítései Tervezés: Rectangle - _width :int { _width > 0 } - _height :int { _height > 0 } + Rectangle(w : int, h : int) { w > 0, h > 0 } + area() :int {query} + perimeter() :int {query} «getter» + getwidth() :int {query} + getheight() :int {query} «setter» + setwidth(w : int) :void { w > 0 } + setheight(h : int) :void { h > 0 } ELTE IK, Szoftvertechnológia 3:24

Az osztálydiagram kiegészítései Megvalósítás: class Rectangle { public: Rectangle(double w, double h) { if (w < 0) // feltétel ellenőrzése } double area() const; // konstans művelet double perimeter() const; }; ELTE IK, Szoftvertechnológia 3:25

Az osztálydiagram kiegészítései Feladat: Valósítsuk meg a verem (Stack) adatszerkezetet aritmetikai reprezentáció mellett. Lehessen elemet behelyezni (push), kivenni (pop), kitörölni a teljes vermet (clear), lekérdezni a tetőelemet (top), üres-e (isempty), illetve tele van-e a verem (isfull), valamint mi az aktuális mérete (size). a vermet sablonos segítségével valósítjuk meg, így eltároljuk az adott típusú elemek tömbjét (_values), valamint az elemek számát (_top) a konstruktorban megadhatjuk a verem maximális méretét, így a megvalósításban dinamikus tömböt használunk gondoskodnunk kell a törlésről is destruktor segítségével ELTE IK, Szoftvertechnológia 3:26

Az osztálydiagram kiegészítései Tervezés: T : class Stack - _values :T[] - _top :int { _top 0 } - _size :int { _size 0 } + Stack(int) + ~Stack() + isempty() :bool {query} + isfull() :bool {query} + push(t) :void + pop() :T + top() :T {query} + clear() :void + size() :int {query} ELTE IK, Szoftvertechnológia 3:27

Az osztálydiagram kiegészítései Megvalósítás: template <class T> // elemtípus sablonja class Stack { // verem típus private: T* _values; int _top; int _size; public: Stack(int max); // konstruktor bool push(t value); // elem behelyezése T pop(); // elem kivétele }; ELTE IK, Szoftvertechnológia 3:28

Kapcsolatok A programot általában több osztály alkotja, az osztályok, illetve objektumok között pedig kapcsolatokat építhetünk fel, úgymint függőség: szemantikai kapcsolat asszociáció (társítás): szerkezeti kapcsolat (csak objektumok között) aggregáció (hivatkozás): laza összekapcsolás kompozíció (tartalmazás): szoros összekapcsolás általánosítás (generalizáció): általános és speciális kapcsolata (csak osztályok között) megvalósítás: szemantikai kapcsolat a fogalom és megvalósítója között (csak interfész és osztály között) ELTE IK, Szoftvertechnológia 3:29

Függőség A függőség (dependency) a legáltalánosabb kapcsolat, amelyben egy objektum (osztály) igénybe vehet funkcionalitást egy másik objektumtól (osztálytól) <osztály> <függőség> <osztály> a függőség kialakítható metódushívással, példányosítással, hivatkozással (pl. visszatérési értékként, paraméterként) oktat a függő osztály felületének megváltoztatása hatással van a másik osztály működésére Oktató ír Jegyzet Hallgató használ ELTE IK, Szoftvertechnológia 3:30

Függőség Feladat: Valósítsuk meg a verem (Stack) adatszerkezetet aritmetikai reprezentáció mellett. Lehessen elemet behelyezni (push), kivenni (pop), kitörölni a teljes vermet (clear), lekérdezni a tetőelemet (top), üres-e (isempty), illetve tele van-e a verem (isfull), valamint mi az aktuális mérete (size). amennyiben nem megfelelő az állapot a művelet végrehajtására (pl. üres, vagy tele), akkor azt jelezzük kivétellel a kivételeket felsorolási típussal adjuk meg, két kivétel az üres, illetve tele verem (STACK_FULL, STACK_EMPTY), illetve egy további a hibás veremméret (BAD_SIZE) ELTE IK, Szoftvertechnológia 3:31

Függőség Tervezés: T : class Stack - _values :T[] - _top :int - _size :int + Stack(int) + ~Stack() + isempty() :bool {query} + isfull() :bool {query} + push(t) :void + pop() :T + top() :T {query} + clear() :void + size() :int {query} «enumeration» Exceptions BAD_SIZE STACK_FULL STACK_EMPTY ELTE IK, Szoftvertechnológia 3:32

Függőség Megvalósítás: template <class T> // elemtípus sablonja class Stack { // verem típus public: enum Exceptions { BAD_SIZE, STACK_FULL, }; // kivételek felsorolási típusa }; Stack(int size) { if (size <= 0) // ellenőrizzük a paramétert throw BAD_SIZE; } ELTE IK, Szoftvertechnológia 3:33

Asszociáció Az asszociáció (association) egy kommunikációs kapcsolat, ahol egy objektum üzenetet küldhet egy (vagy több) további objektumnak <osztály> <asszociáció> <osztály> a kommunikáció lehet irányított, irányítatlan (kétirányú), reflexív (saját osztály másik objektumára) tart Előadás látogat beszélget Oktató beszélget Hallgató ELTE IK, Szoftvertechnológia 3:34

Asszociáció az asszociációnak lévő osztályoknak lehet szerepe, ami a relációbeli minőségükre utal, ezt az adott végponton jelöljük (ez is megjelölhető láthatósággal) multiplicitása, ami a relációbeli számosságukra utal (lehet rögzített, tetszőleges érték, vagy intervallum) a relációnak lehetnek további tulajdonságai, amelyeket függőségként csatolhatunk Oktató +előadó 1..3 tart * Előadás Prezentáció ELTE IK, Szoftvertechnológia 3:35

Asszociáció Feladat: Valósítsuk meg a 2D koordinátarendszerben ábrázolható pontokat (Point), valamint vektorokat (Vector). A pontok eltolhatóak vektorral, illetve megadható két pont távolsága. A vektornak ismert a hossza. a pont ábrázolható a vízszintes és függőleges értékkel (_x, _y), amelyek lekérdezhetőek (getx(), gety()) lekérdezhető a távolsága egy másik ponthoz képest (distance(point)), valamint eltolható egy vektorral (move(vector)) a vektor ábrázolható a vízszintes és függőleges eltéréssel (_deltax, _deltay), amelyek lekérdezhetőek (getdeltax(), getdeltay()), ahogy a hossza (length()) is ELTE IK, Szoftvertechnológia 3:36

Asszociáció Tervezés: - _x :int - _y :int Point + Point(int, int) + distance(point) :double {query} + move(vector) :void + getx() :int {query} + gety() :int {query} distance(point) move(vector) Vector - _deltax :int - _deltay :int + Vector(int, int) + length() :double {query} + getdeltax() :int {query} + getdeltay() :int {query} ELTE IK, Szoftvertechnológia 3:37

Asszociáció Megvalósítás: class Point { public: Point(int x = 0, int y = 0) _x(x), _y(y) { } double distance(point p) const { return sqrt(pow(abs(_x p._x), 2) + pow(abs(_y p._y), 2)); } void move(vector v) { _x += v.getdeltax(); _y += v.getdeltay(); } }; ELTE IK, Szoftvertechnológia 3:38

Aggregáció Az aggregáció (aggregation) egy speciális asszociáció, amely az objektumok laza egymáshoz rendelését fejezi ki <osztálynév> <szerep> <osztálynév> egy tartalmazási, rész/egész kapcsolatot jelent, állandó kapcsolat a két objektum között a részt vevő objektumok életpályája különbözik, egymástól függetlenül is léteznek Kar +dékán +tanszékek 1..* Oktató Tanszék +oktatók 1..* ELTE IK, Szoftvertechnológia 3:39

Aggregáció Feladat: Valósítsuk meg a csoportosítható téglalapokat. A téglalapot (Rectangle) tetszőleges csoportba (Group) helyezhetjük (insert(rectangle)), illetve kivehetjük belőle (remove(rectangle)). Lehetőségünk van a csoportban lévő téglalapok összterületét (area()), illetve összkerületét (perimeter()) lekérdezni. a téglalap megvalósítása változatlan marad, a téglalapokat aggregációval rendeljük a csoporthoz egy téglalap több csoportban is szerepelhet, illetve egy csoportban tetszőleges sok téglalap lehet a csoportban felvesszük a téglalapok tömbjét (_rectangle) ELTE IK, Szoftvertechnológia 3:40

Aggregáció Tervezés: Rectangle - _width :int - _height :int + Rectangle(int, int) + area() :int + perimeter() :int + getwidth() :int + getheight() :int + setwidth(int) :void + setheight(int) :void -_rectangles * * Group - _rectangles :Rectangle[] + insert(rectangle) :void + remove(rectangle) :void + area() :int {query} + perimeter() :int {query} ELTE IK, Szoftvertechnológia 3:41

Aggregáció Megvalósítás: class Group { private: vector<const Rectangle&> _rectangles; // vector-t választunk a megvalósításban, és // csak hivatkozásokat kezelünk public: void insert(const Rectangle& rec); // csak hivatkozásokat veszünk át void remove(const Rectangle& rec); double area() const; double perimeter() const; }; ELTE IK, Szoftvertechnológia 3:42

Kompozíció A kompozíció (composition) egy speciális asszociáció, amely az objektumok szoros egymáshoz rendelését fejezi ki <osztálynév> <szerep> <osztálynév> fizikai tartalmazást jelent, így nem lehet reflexív, vagy ciklikus a tartalmazott objektum életpályáját a tartalmazó felügyeli a tartalmazó objektum megsemmisülésekor a tartalmazott is megsemmisül Prezentáció +diák 1..* Dia ELTE IK, Szoftvertechnológia 3:43

Kompozíció Feladat: Valósítsuk meg a 2D koordinátarendszerben ábrázolható téglalap (Rectangle) osztályt, amely párhuzamos/merőleges a koordinátatengelyre, lekérdezhető a területe, átméretezhető, illetve eltolható egy megadott vektorral. a téglalapot elhelyezzük a koordinátarendszerben, amihez el kell tárolnunk legalább egy koordinátáját, legyen ez a bal alsó sarok (_point) ehhez szükséges a pont (Point) típusa, amit egybekötünk a téglalap élettartamával, azaz kompozícióval helyezzük a téglalapba a téglalap eltolásához (move()) igazából a bal alsó koordinátát kell eltolnunk ELTE IK, Szoftvertechnológia 3:44

Kompozíció Tervezés: Point - _x :int - _y :int + Point(int, int) + distance(point) :double {query} + move(vector) :void + getx() :int {query} + gety() :int {query} Vector - _deltax :int - _deltay :int move(vector) + Vector(int, int) + length() :double {query} + getdeltax() :int + getdeltay() :int -_point move(vector) Rectangle - _width :int - _height :int - _point :Point + Rectangle(Point, int, int) + area() :int {query} + perimeter() :int + move(vector) :void + getpoint() :Point {query} + getwidth() :int {query} + getheight() :int {query} + setwidth(int) :void + setheight(int) :void ELTE IK, Szoftvertechnológia 3:45

Kompozíció Megvalósítás: class Rectangle { public: Rectangle(Point p, int w, int h) : _point(p), _width(w), _height(y) { } void move(vector v) { _point.move(v); } private: Point _point; int _width; int _height; }; ELTE IK, Szoftvertechnológia 3:46

Függőség Feladat: Valósítsuk meg a verem (Stack) adatszerkezetet láncolt reprezentáció mellett. Lehessen elemet behelyezni (push), kivenni (pop), kitörölni a teljes vermet (clear), lekérdezni a tetőelemet (top), üres-e (isempty), illetve tele van-e a verem (isfull), valamint mi az aktuális mérete (size). a megvalósításhoz szükséges egy verem elem rekord (StackNode), amely tartalmazza az adatot (value), és hivatkozik a rákövetkező elemre (next) a veremben elég a tetőelem mutatóját (_top), és a méretet (_size) eltárolnunk amennyiben nem megfelelő az állapot a művelet végrehajtására (pl. üres, vagy tele), akkor azt jelezzük kivétellel ELTE IK, Szoftvertechnológia 3:47

Függőség Tervezés: Stack T : class -_top «struct» StackNode + value :T + next :StackNode +next * - _top :StackNode - _size :int + Stack(int) + ~Stack() + isempty() :bool {query} + isfull() :bool {query} + push(t) :void + pop() :T + top() :T {query} + clear() :void + size() :int {query} «enumeration» Exceptions BAD_SIZE STACK_FULL STACK_EMPTY ELTE IK, Szoftvertechnológia 3:48

Kompozíció Megvalósítás: template <class T> struct StackNode { // verem elem rekordja T value StackNode* next; } template <class T> class Stack { // verem osztálya private: StackNode<T>* _top; int _size; }; ELTE IK, Szoftvertechnológia 3:49

Az objektumdiagram Az UML objektumdiagram (object diagram) a programban szereplő objektumokat, és kapcsolataikat ábrázolja az objektumnak megadjuk nevét, osztályát, valamint mezőinek értékeit ennek megfelelően az objektumdiagram mindig egy adott állapotban ábrázolja a rendszert, és tetszőlegesen sok lehet belőle az objektumdiagram mindig megfelel az osztálydiagramnak <objektumnév> :<osztálynév> - <mező> :<típus> = <érték> ELTE IK, Szoftvertechnológia 3:50

Az objektumdiagram Feladat: Példányosítsunk egy téglalapot (r), amely a 10, 15 koordinátákban helyezkedik el, és 25 széles, illetve magas. r :Rectangle - _width :int = 25 - _height :int = 25 _point :Point - _x :int = 15 - _y :int = 10 Feladat: Példányosítsunk két téglalapot (20 szélesség, 30 magasság, valamint 10 szélesség, 10 magasság), amelyeket egy csoportba helyezünk. :Rectangle - _width :int = 20 - _height :int = 30 :Group :Rectangle - _width :int = 10 - _height :int = 10 ELTE IK, Szoftvertechnológia 3:51