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

Hasonló dokumentumok
Szoftvertechnológia 7. előadás. Objektumorientált tervezés: végrehajtás. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Összetett grafikus felületű alkalmazások. Giachetta Roberto

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

Programozási technológia II 3. előadás. Objektumorientált tervezés Giachetta Roberto

Összetett alkalmazások

Eseményvezérelt alkalmazások fejlesztése I 6. előadás. Összetett alkalmazások megvalósítása. Giachetta Roberto

Programozási technológia 2.

3. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció

ELTE, Informatikai Kar december 12.

2. Beadandó feladat dokumentáció

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Models are not right or wrong; they are more or less useful.

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

Programozási technológia II 2. előadás. Specifikáció és követelménymenedzsment

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése Giachetta Roberto

Programozási technológia 2.

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

Informatikai Kar. 4. fejezet. Giachetta Roberto

3. Beadandó feladat dokumentáció

Szoftvertechnológia 2. előadás. Specifikáció és követelménymenedzsment. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

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

Szoftvertechnológia 2. előadás. Every big computing disaster has come from taking too many ideas and putting them in one place.

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája

Dinamikus modell: állapotdiagram, szekvencia diagram

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

Általános szoftver architektúrák

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Általános szoftver architektúrák. Giachetta Roberto

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

Eseményvezérelt alkalmazások fejlesztése I 12. előadás. Összetett szoftver architektúrák. Giachetta Roberto

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

2. Beadandó feladat dokumentáció

1. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája. Grafikus felületű alkalmazások architektúrája

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

3. Beadandó feladat dokumentáció

Modell megvalósítása. Gregorics Tibor: Eseményvezérelt alkalmazások fejlesztése I.

Models are not right or wrong; they are more or less useful.

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

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

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Elemi alkalmazások fejlesztése III.

Felhasználói dokumentáció. a TávTagTár programhoz. Készítette: Nyíri Gábor, hdd@nc-studio.com GDF Abakusz regisztrációs kód: GDFAba43

VARIO Face 2.0 Felhasználói kézikönyv

3. Osztályok II. Programozás II

Szoftvertechnológia 1. előadás. A szoftverfejlesztési folyamat. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

OOP. Alapelvek Elek Tibor

Osztályok. 4. gyakorlat

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

ETR Hallgatói webes alkalmazás

Felhasználói kézikönyv

Alapok (a K2D rendszer alapjai)

A d m i n i s z t r á c i ó s f e l a d a t o k a I n t e g r á l t K ö n y v t á r i R e n d s z e r b e n

Dr. Mileff Péter

TANSZÉKI ADMINISZTRÁTORI SEGÉDLET: NEPTUN TÁRGYKEZELÉS, KURZUSKEZELÉS

Neptun rendszer jelentkezési segéd

Csavarda mobil áruház

2. Beadandó feladat dokumentáció

Egyetemi könyvtári nyilvántartó rendszer

Webes vizsgajelentkezés folyamata - Hallgatói felületek

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

In short, software is eating the world.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Felhasználói kézikönyv

Felhasználói útmutató

Műszaki online hibabejelentő kézikönyv

Felhasználói kézikönyv MAGYAR NEMZETI BANK. ERA keretrendszer

Webes vizsgakezelés folyamata Oktatói felületek

Választó lekérdezés létrehozása

POSZEIDON dokumentáció (1.2)

Neptun rendszer jelentkezési segéd

Operátori segédlet a Guest Manager szoftverhez

ALKALMAZÁSOK ISMERTETÉSE

1. beadandó feladat: egyszerű grafikus felületű alkalmazás. Közös követelmények:

Belépés a GroupWise levelező rendszerbe az Internet felől

Szekvencia diagram. Szekvencia diagram Dr. Mileff Péter

Azonosítások adatbázis

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 3/3

Felhasználói kézikönyv

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Mobil Telefonon Keresztüli Felügyelet Felhasználói Kézikönyv

Hungaropharma Zrt. WEB Áruház felhasználói útmutató. Tartalomjegyzék

Hiteles Elektronikus Postafiók

Webes étkezés rendelés felhasználói kézikönyv

DMS One Oktatási Portál Felhasználói segédlet. DMS One Zrt

Objektumelvű programozás

Szoftvertechnológia 6. előadás. Objektumorientált tervezés: állapotkezelés. Objektumorientált tervezés: állapotkezelés

A Statisztikai adatszolgáltatás menüpont alatt végezhető el az adatlap kitöltése. 3 Statisztikai adatszolgáltatás menetének részletes bemutatása

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

KÉPZÉSSZERVEZŐ ALKALMAZÁS FELHASZNÁLÓI ÚTMUTATÓ. Nemzeti Közszolgálati Egyetem Vezető- és Továbbképzési Intézet

Sú gó az ASIR/PA IR Públikús felú lethez

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

ISA Internetes rendelési felület

Szoftvertechnológia 8. gyakorlat. Tervezés. Tervezés A szoftver életciklus

TÁRGYTEMATIKA RÖGZÍTÉSE A NEPTUN RENDSZERBEN

Magyar Telekom WFMS Light KEZELÉSI ÚTMUTATÓ. MAGYAR TELEKOM 1097 Budapest, Könyves Kálmán krt. 36.

Mikrobiológia MOODLE - gyakorló és vizsgarendszer használata az ELTE TTK Biológiai Intézet E- learning felületén

Szülői modul. Belépés a TANINFORM rendszerbe. Főoldal

ERA KERETRENDSZER Felhasználói kézikönyv v

Átírás:

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

Objektumok állapota 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 amennyiben egy objektum csak egy állapottal rendelkezik, akkor az objektum változtathatalan (immutable) 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) ELTE IK, Szoftvertechnológia 6:2

Állapotok modellezése Amennyiben egy objektumorientált szoftver működését szeretnénk megvizsgálni, fontos szerepet tölt be az objektumok lehetséges állapotainak modellezése mivel a lehetséges állapotok a viselkedési mintától függenek, ezért az osztályok alapján állapítjuk meg Az objektumok állapotait, és a köztük lévő állapotátmeneteket az állapotdiagram, vagy állapotautomata (state machine) segítségével tudjuk modellezni <állapot> <értékek> <esemény> <állapot> <értékek> ELTE IK, Szoftvertechnológia 6:3

Állapotok modellezése Állapot (state): az objektum értékeinek (mezőinek) összessége, amely befolyásolja az objektum felhasználhatóságát, az objektummal végezhető tevékenységeket rendelkezik egy (egyedi) elnevezéssel megadhatjuk benne a konkrét értékeket, vagy használhatjuk csupán az elnevezést általában nem egy konkrét értékkombinációt, hanem értékkombinációk lehetséges halmazát ábrázolja, amelyekre egy adott feltétel, az állapotinvariáns fennáll az állapot addig marad fent, amíg az adatok értékei kielégítik az invariánst ELTE IK, Szoftvertechnológia 6:4

Állapotok modellezése Esemény (event, trigger): az objektummal végzett tevékenység, kommunikáció (metódushívás, eseménykiváltás) lehet elnevezése, paraméterei, feltétele és hatása lehet reflexív, ebben az esetben nem okoz állapotváltást, és belső eseménynek nevezzük Pl. (egyetemi kurzus): feliratkozás üres feliratkozás leiratkozás szabad helyekkel rendelkezõ feliratkozás leiratkozás megtelt leiratkozás ELTE IK, Szoftvertechnológia 6:5

Állapotok modellezése 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 verem működését a tömbben lévő elemek száma befolyásolja ha nincs elem a tömbben, nem lehet kivenni, lekérdezni ha a tömbben lévő elemek száma eléri a maximumot, nem lehet behelyezni ennek megfelelően három különböző állapotot különíthetünk el (empty, normal, full) ELTE IK, Szoftvertechnológia 6:6

Állapotok modellezése Szerkezeti 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 6:7

Példa Dinamikus tervezés (állapotkezelés): empty _top = 0 push(t) pop() push(t) normal _top < _size and _top > 0 pop() push(t) pop() full _top = _size ELTE IK, Szoftvertechnológia 6:8

Feltételek és hatás Az esemény rendelkezhet: paraméterekkel, amelyek az eseményre vonatkoznak feltétellel (guard), amelynek a teljesülése szükséges az átmenet bekövetkeztével hatással (effect), amely egy, az állapotátmenet hatására végrehajtott tevékenység (akció) <esemény>(<paraméterek>) [<feltétel>] /<hatás> <állapot> <állapot> ELTE IK, Szoftvertechnológia 6:9

Feltételek és hatás Pl. (egyetemi hallgató): tárgyat teljesít [még van hátra tárgya] regisztrál a félévre aktív tárgyat teljesít [összes tárgyát teljesítette] /megszűnik a diákigazolványa regisztrál a félévre passziváltat /csökken a passzíváltatható féléve abszolvált passzív passziváltat [egy féléve passzív] ELTE IK, Szoftvertechnológia 6:10

Kezdő és végállapot Az objektumok létrehozásukkor egy kezdeti állapotból (initial state) indulnak, majd életciklusuk végén egy végállapottal (final state) terminálnak <állapot> <állapot> a kezdőállapotnak és végállapotnak általában nem adunk nevet kezdőállapotba és végállapotból nem vezet átmenet, a kezdőállapotból történő átmenetnek nincs feltétele ELTE IK, Szoftvertechnológia 6:11

Kezdő és végállapot Pl. (egyetemi hallgató): felvételizik gólya évfolyamot vált felsőbb éves évfolyamot vált tárgyat teljesít [összes tárgyát teljesítette] /abszolváltatják záróvizsgázik [záróvizsga sikeres] /diplomát kap abszolvált záróvizsgázik [záróvizsga sikertelen] ELTE IK, Szoftvertechnológia 6:12

Kezdő és végállapot Feladat: Készítsünk egy programot, amelyben egyetemi oktatók, hallgatók és kurzusok adatait tudjuk tárolni. a kurzus (Course) rendelkezik névvel, oktatóval, hallgatókkal, kreditszámmal és maximális létszámmal a hallgató felveheti a kurzust (register), amennyiben még van szabad hely, és még nem jelentkezett rá (ekkor a kurzus megjelenik a hallgatónál is), és lejelentkezhet róla (unregister), amennyiben jelentkezett már rá (ekkor a kurzust a hallgatótól is elvesszük) kezdetben a kurzus üres (nincs jelentkezett hallgató), és csak üres kurzus törölhető ELTE IK, Szoftvertechnológia 6:13

Kezdő és végállapot Szerkezeti tervezés: UniversityCitizen UniversityStudent -_students * Course UniversityTeacher -_teacher - _coursename :string - _teacher :UniversityTeacher - _credits :int - _maxcount :int - _students :vector<universitystudent> -_courses * + Course(string, UniversityTeacher, int, int) + register(universitystudent) :bool + unregister(universitystudent) :void + name() :string {query} + teacher() :UniversityTeacher* {query} + credits() :int {query} + maxcount() :int {query} + currentcount() :int {query} ELTE IK, Szoftvertechnológia 6:14

Kezdő és végállapot Dinamikus tervezés (kurzus állapotai): empty _students.size() = 0 unregister(u : UniversityStudent) [(_students.size() = 1) and (_students.contains(u))] /u.removecourse(cource) unregister(u : UniversityStudent) [(_students.size() > 1) and (_students.contains(u))] /u.removecourse(cource) unregister(u : UniversityStudent) [_students.contains(u))] /u.removecourse(cource) running full _students.size() = _maxheadcount register(u : UniversityStudent) /u.newcourse(course) register(u : UniversityStudent) [(_students.size() < _maxcount - 1) and (not _students.contains(u))] /u.newcourse(course) register(u : UniversityStudent) [(_students.size() == _maxcount - 1) and (not _students.contains(u))] /u.newcourse(course) ELTE IK, Szoftvertechnológia 6:15

Tevékenység állapotok Az állapothoz általában a működésben egy időintervallum, az eseményhez egy időpont tartozik programfutás állapot esemény állapot Ugyanakkor egy adott tevékenység időben is elhúzódhat, így magát a tevékenységet is ábrázolhatjuk állapotként a tevékenység állapotba vezető, és onnan kivezető esemény sokszor csak a tevékenység kezdetét és végét jelenti, ezért nem kap külön elnevezést ELTE IK, Szoftvertechnológia 6:16

Tevékenység állapotok Pl. (sakkjátszma): világos gondolkozik világos feladja világos lép (Figura) sötét lép (Figura) megegyezés sötét gondolkozik megegyezés sötét feladja ELTE IK, Szoftvertechnológia 6:17

Elágazások Az állapotváltások során könnyen előfordulhatnak elágazások, ciklusok, amelyeket modellezhetünk feltételhez kötött eseménnyel választással (choice), ahol csak a feltételeket adjuk meg Az elágazás végeztével újra egy pontban egyesül az állapot, amely ábrázolható csomóponttal (junction) <állapot> [<feltétel>] <állapot> <esemény> <állapot> <esemény> <állapot> [<feltétel>] <esemény> ELTE IK, Szoftvertechnológia 6:18

Általánosított állapotok Pl. (egyetemi hallgató vizsgaidőszaka): [sikeres] jókedvű stresszes vizsgázik szomorú [sikertelen] vizsganaptárat néz [még van hátra vizsga] vizsganaptárat néz [nincs hátra vizsga] ELTE IK, Szoftvertechnológia 6:19

Állapotok leírása Az állapoton belül is megfogalmazhatjuk a tevékenységeket, ehhez három fázist vehetünk fel a belépési (entry) fázis tartalmazza az állapotba való belépéskor végrehajtandó tevékenység a végrehajtó (do) fázis az állapotban végrehajtandó tevékenység a kilépési (exit) fázis az állapotból kivezető tevékenység Pl. (egyetemi oktató): előadásra készül előadást tart + entry / belép a terembe + do / magyaráz + exit / elköszön a hallgatóságtól ELTE IK, Szoftvertechnológia 6:20

Általánosított állapotok Lehetőségünk az állapotok általánosítására (generalization), amely egy általános állapottal ábrázolunk több lehetséges állapotot, és a köztük lévő átmenetet <állapot> <általánosított állapot> <állapot> ekkor az általános állapot is egy állapotautomata lesz, amelynek tartalmát kifejthetjük (a későbbiekben) az általánosított állapot belépési pontja lesz az állapotautomata kezdőállapota, kilépési pontja pedig a végállapota ELTE IK, Szoftvertechnológia 6:21

Általánosított állapotok Pl. (egyetemi hallgató): Szorgalmi időszak Vizsgaidőszak Pihenő Órán alvó Szorgalmi időszak hazamegy órára megy Otthon alvó ELTE IK, Szoftvertechnológia 6:22

Esettanulmányok Tic-Tac-Toe játék Feladat: Készítsünk egy Tic-Tac-Toe programot, amelyben két játékos küzdhet egymás ellen. a programban jelenjen meg egy játéktábla, amelyen végig követjük a játék állását (a két játékost az X és 0 jelekkel ábrázoljuk) legyen lehetőség a játékosok neveinek megadására, új játék indítására, valamint játékban történő lépésre (felváltva) a program kövesse végig, melyik játékos hány kört nyert program automatikusan jelezzen, ha vége egy játéknak, és jelenítse meg a játékosok pontszámait ELTE IK, Szoftvertechnológia 6:23

Esettanulmányok Tic-Tac-Toe játék Szerkezeti tervezés: TicTacToeGame TicTacToeConsole - _game :TicTacToeGame + run() :void + exit() :void - getposition() :int - readplayernames() :void - readstep() :void - showgamestate() :void - _currentplayer :int - _gametable :int[,] - _playernames :string[] - _playerscore :int[] - _stepnumber :int + newgame() :void + stepgame(int, int) :void + setplayers(string, string) :void + getfield(int, int) :int {query} + getscore(int) :int + getwinner() :string {query} + isgameover() :bool {query} ELTE IK, Szoftvertechnológia 6:24

Esettanulmányok Marika néni kávézója Dinamikus tervezés (állapotkezelés): A játék menetének állapotai: új játék kezdését (newgame) követően az első játékos (X) gondolkozik, majd lép (stepgame) lépést követően ellenőrizni kell a játékállást amennyiben nincs vége a játéknak (isgameover), megjelenítjük a játékállást (getfield), majd a másik játékos következik a másik játékos (O) gondolkozik, lép, majd ismét ellenőrizni kell a játékállást amennyiben vége van a játéknak, lekérjük a győztes nevét (getwinner) ELTE IK, Szoftvertechnológia 6:25

Kezdő és végállapot Dinamikus tervezés (állapotkezelés): newgame() player X thinks stepgame(int, int) [isgameover() = false and currentplayer = X] /getfield(int, int) player O thinks stepgame(int, int) check game [isgameover() = true] /getwinner() [isgameover() = false and currentplayer = O] /getfield(int, int) ELTE IK, Szoftvertechnológia 6:26

Esettanulmányok Marika néni kávézója Feladat: Készítsük el Marika néni kávézójának eladási nyilvántartását végigkövető programot. a kávézóban 3 féle étel (hamburger, ufó, palacsinta), illetve 3 féle ital (tea, narancslé, kóla) közül lehet választani az ételek ezen belül különfélék lehetnek, amelyre egyenként lehet árat szabni, és elnevezni, az italok árai rögzítettek a program kezelje a rendeléseket, amelyekben tetszőleges tételek szerepelhetnek, illetve a rendelés kapcsolódhat egy törzsvásárlóhoz biztosítsunk lehetőséget a függőben lévő rendeléseket lekérdezésére, valamint napi, havi és törzsvásárolói számra összesített nettó/bruttó fogyasztási statisztikák követésére ELTE IK, Szoftvertechnológia 6:27

Esettanulmányok Marika néni kávézója Szerkezeti tervezés: View::Menu - _ordermanager :OrderManager + Menu() + ~Menu() + run() :void - printmainmenu() :void - printaddorder() :void - printstatsmenu() :void - printstatsformonth() :void - printstatsforcustomer() :void + printstatsforday() :void + printopenorders() :void + printcloseorder() :void Model::OrderManager - _orders :List<Order> - _persistence :OrderPersistence + addorder(order) :void + closeorder(int) :void + openorders() :List<Order> {query} + order(int) :Order + loadorders(string) :void + saveorders(string) :void + monthlyincome(int, int) :int + dailyincome(int, int, int) :int + customerincome(int) :int Persistence::OrderPersistence + loadorders(string) :List<Order> + saveorders(string, List<Order>) :bool ELTE IK, Szoftvertechnológia 6:28

Esettanulmányok Marika néni kávézója Dinamikus tervezés: A rendelés elemei változtathatatlan objektumok, ezért nincsenek állapotaik A rendelésen és a rendeléskezelőn végrehajtunk tevékenységeket, ugyanakkor állapotaik nincsenek kihatással a program futására, használatára A menü futtatása biztosítja a lényeges tevékenységeket a különböző menüpontok segítségével, itt megjelenhet a főmenü, egyes statisztikák, az új rendelés megadása, vagy a nyitott rendelések a menü csak akkor lesz használható, ha az adatbetöltést elvégezzük, és természetesen terminálás előtt mentenünk is kell ELTE IK, Szoftvertechnológia 6:29

Esettanulmányok Marika néni kávézója Dinamikus tervezés (Menu állapotai): empty _ordermanager.loadorders(string) usable _ordermanager.saveorders(string) ELTE IK, Szoftvertechnológia 6:30

Esettanulmányok Marika néni kávézója Dinamikus tervezés (usable állapotai): open orders displayed printopenorders() [any orders open] printmainmenu() order input printaddorder() printmainmenu() main menu display run() printcloseorder() printstatsmenu() printmainmenu() printstatsforcustomer() stats menu displayed printstatsmenu() printstatsforday() printstatsformonth() stats displayes ELTE IK, Szoftvertechnológia 6:31

Esettanulmányok Utazási ügynökség Feladat: Készítsük el egy utazási ügynökség apartmanokkal foglalkozó rendszerét. az apartmanok épületekben találhatóak, amelyek városokban helyezkednek el az épületek különböző adatokkal (leírás, szolgáltatások, pontos hely, tengerpart távolság, ), valamint képekkel rendelkeznek a vendégek számára biztosítsunk egy webes felületet, amelyen keresztül apartmanokat kereshetnek, foglalhatnak a munkatársak számára biztosítsunk egy alkalmazást, amelyben szerkeszthetik az apartmanok adatait, képeit, valamint kezelhetik a foglalásokat ELTE IK, Szoftvertechnológia 6:32

Esettanulmányok Utazási ügynökség Dinamikus tervezés (adminisztrátor): Elsőként be kell jelentkeznünk az alkalmazásba a helyes felhasználónév és jelszó megadásával egy dialógusablakban (többször is próbálkozhatunk) ehhez meg kell nyitni az adatbázissal a kapcsolatot A főablakban betöltődnek az adatok, majd lehetőségünk van az adatok megtekintésére, szerkesztésére, és mentésére, illetve bezáráskor is mentjük a módosításokat sikertelen mentés esetén hibajelzést kapunk Amennyiben nem sikerül megnyitni a kapcsolatot, vagy bezárjuk valamelyik ablakot, az alkalmazás kilép ELTE IK, Szoftvertechnológia 6:33

Esettanulmányok Utazási ügynökség Dinamikus tervezés (adminisztrátor állapotai): Adatbázis-kapcsolat megnyitása [sikeres kapcsolódás] bejelentkezés [sikertelen bejelentkezés] Bejelentkező dialógus megjelenítése bejelentkezés [sikeres bejelentkezés] Főablak megjelenítése ablak bezárása sikertelen kapcsolódás ablak bezárása ELTE IK, Szoftvertechnológia 6:34

Esettanulmányok Utazási ügynökség Dinamikus tervezés (főablak állapotai): Adatok betöltése [sikeres mentés és nem bezárás történt] Adatok megjelenítése/szerkesztése mentés Adatok mentése [sikeres mentés és bezárás történt] ablak bezárása [sikertelen mentés] [nem bezárás történt] Hibajelzés [bezárás történt] ELTE IK, Szoftvertechnológia 6:35

Aggregált állapotok Egymástól független, párhuzamosan fennálló állapotokat is kezelhetünk a programban, ekkor állapotok aggregációjáról (aggregation) beszélünk egy osztály állapotait kettő, vagy több szempont szerint állapítjuk meg, és eszerint különböző állapotokat definiálunk egy rendszer állapotát modellezzük, amely a benne szereplő osztályok állapotainak összessége Ugyan maguk az állapotok egymástól függetlenül léteznek, mégis hatással lehetnek egymásra tevékenységek, feltételek segítségével pl. ugyanazon tevékenység okozhat párhuzamos állapotváltásokat ELTE IK, Szoftvertechnológia 6:36

Aggregált állapotok [<részállapot>] <aggregált állapot> <állapot> [<részállapot>] <állapot> ELTE IK, Szoftvertechnológia 6:37

Aggregált állapotok Pl. (előadás): [oktató] Előadás prezentáció kérdést tesznek fel válaszadás elfogadják a választ [hallgató] figyel a prezentációra kérdést tesz fel elfogadja a választ figyel a válaszra jegyzetel ELTE IK, Szoftvertechnológia 6:38

Aggregált állapotok Állapot aggregáció esetén az állapotnak párhuzamos részállapotai (concurrent substate) keletkeznek a részállapotok lehetnek állapotátmenetek, általánosított állapotok, rendelkezhetnek kezdeti és végállapottal amennyiben az aggregált állapot rendelkezik kezdeti, vagy végállapottal, akkor minden részállapotnak is rendelkeznie kell vele az aggregált állapot belépési és kilépési eseményét, paramétereit, feltételét és hatását minden részállapot örökli ELTE IK, Szoftvertechnológia 6:39

Esettanulmányok Memory játék Feladat: Készítsünk egy Memory kártyajátékot, amelyben két játékos küzd egymás ellen, és a cél kártyapárok megtalálása a játéktáblán. a játékosok felváltva lépnek, minden lépésben felfordíthatnak két kártyát amennyiben a kártyák egyeznek, úgy felfordítva maradnak és a játékos ismét léphet, különben visszafordulnak, és a másik játékos következik a játékot az nyeri, aki több kártyapárt talált meg lehessen a játékosok neveit megadni, kártyacsomagot választani, valamint a kártyák számát (a játéktábla méretét) szabályozni ELTE IK, Szoftvertechnológia 5:40

Esettanulmányok Memory játék Szerkezeti tervezés (modell): CardPack - _name :QString - _faces :QVector<QPixmap> - _back :QPixmap + CardPack(QString&) + getname() :QString {query} + cardcount() :int {query} + getfaces() :QVector<QPixmap> {query} + getback() :QPixmap& {query} + getface(int) :QPixmap& {query} -_cardpacks 1..* GameManager - _cardpacks :QVector<CardPack*> - _players :QVector<Player*> - _currentnumcols :int - _currentnumrows :int - _currentcardpackindex :int - _currentplayerindex :int - _timer :QTimer* - _cardfound :QVector<bool> - _foundcards :int - _cardids :QVector<int> - _firstcardindex :int - _secondcardindex :int QObject Player - _name :QString - _hits :int - _misses :int - _victories :int + Player(QString) + newgame() :void + addhit() :void + addmiss() :void + addvictory() :void + getname() :QString {query} + gethits() :int {query} + getmisses() :int {query} + getvictories() :int {query} -_players 2 + allcardpacks() :QVector<CardPack*> {query} + currentpack() :CardPack* {query} + currentplayer() :Player* {query} + firstplayer() :Player* {query} + GameManager() + ~GameManager() - loadpacks(qstring) :void + secondplayer() :Player* {query} - shufflecards() :void «signal» + cardchanged(int, QPixmap&) :void + gameover(qstring) :void + statuschanged(qstring) :void «slot» - hidecards() :void + newgame(int, int) :void + selectcard(int) :void + setcurrentpack(cardpack*) :void + setplayers(qstring, QString) :void ELTE IK, Szoftvertechnológia 5:41

Esettanulmányok Memory játék Szerkezeti tervezés (nézet): -configurationdialog ConfigurationDialog - _ui :Ui::ConfigurationDialog* - _cardpacks :QVector<CardPack*> - _cardlabels :QVector<QLabel*> QDialog + ConfigurationDialog(QVector<CardPack*>, QWidget*) + ~ConfigurationDialog() + firstplayername() :QString + secondplayername() :QString + numberofrows() :int + numberofcolumns() :int + selectedcardpack() :CardPack* - loadsettings() :void - savesettings() :void «slot» + setfirstplayername(qstring) :void + setsecondplayername(qstring) :void + setnumberofrows(int) :void + setnumberofcolumns(int) :void + checkvalues() :void + changecardpack(int) :void + setmaxrows() :void + setmaxcols() :void GameWidget - _ui :Ui::GameWidget* - _manager :GameManager* - _buttons :QVector<ImageButton*> - _isconfigured :bool - _configurationdialog :ConfigurationDialog* QWidget + GameWidget(QWidget*) + ~GameWidget() + gamemanager_cardchanged(int, QPixmap&) :void + gamemanager_gameover(qstring) :void «signal» + statuschanged(qstring) :void «slot» + newgame() :void + configuregame() :void + buttonclicked() :void -buttons 4..* - _image :QPixmap QPushButton ImageButton + ImageButton(QWidget*) + pixmap() :QPixmap {query} # paintevent(qpaintevent*) :void «slot» + setpixmap(qpixmap&) :void + clearpixmap() :void 2 -gamewidget QWidget PlayerStatusWidget - _ui :Ui::PlayerStatusWidget* - _player :Player* + PlayerStatusWidget(QWidget*) + ~PlayerStatusWidget() «slot» + setplayer(player*) :void + refreshplayer() :void QMainWindow MainWindow - _newgameaction :QAction* - _exitaction :QAction* - _configureaction :QAction* - _gamemenu :QMenu* - _gamewidget :GameWidget* + MainWindow(QWidget*) + ~MainWindow() # closeevent(qcloseevent*) :void ELTE IK, Szoftvertechnológia 5:42

Esettanulmányok Memory játék Dinamikus tervezés: A főablakot létrehozzuk, majd megjelenítjük (show) bezárásához (closeevent) megerősítést kérünk a felhasználótól, amelyben lehetősége van azt megszakítani (ignore), vagy elfogadni (accept) A megjelenítés alatt egymástól függetlenül kezeljük a játék modelljét (GameManager), valamint megjelenítését (GameWidget) a megjelenítésben fontos különbség, hogy a felület aktív, vagy sem, mivel csak előbbi esetben lehet egérrel kattintani (mouseclick) ELTE IK, Szoftvertechnológia 6:43

Esettanulmányok Memory játék Dinamikus tervezés: amennyiben új játékot kezdünk (newgame), a felület aktív lesz, játék végén (gameover) pedig inaktívvá válik a játék modellje kezdetben egy kártyát sem mutat, de új játék kezdésekor (newgame) az összes kártyát megmutatja, majd automatikusan elrejti őket (hidecards) kiválasztás (selectcard) hatására előbb egyet, majd kettőt megmutathat (cardchanged) amennyiben a két kártya egyezik, és minden kártyát felfedtünk, vége a játéknak (gameover) ELTE IK, Szoftvertechnológia 6:44

Esettanulmányok Memory játék Dinamikus tervezés (alkalmazás állapotai): loaded [View] displayed GameWidget closeevent(event: QCloseEvent) close confirmation show() [Model] GameManager event.ignore() event.accept() ELTE IK, Szoftvertechnológia 6:45

Esettanulmányok Memory játék Dinamikus tervezés (GameManager állapotai): all cards revealed gameover() [cards match] two cards revealed selectcard(int) /cardchanged(int, QPixmap&) hidecards() newgame(int, int) hidecards() /cardchanged(int, QPixmap&) all cards hidden some cards hidden one card revealed selectcard(int) /cardchanged(int, QPixmap&) ELTE IK, Szoftvertechnológia 6:46

Esettanulmányok Memory játék Dinamikus tervezés (GameWidget állapotai): buttonclick() /model.selectcard(int) clickable newgame() /model.newgame() model.gameover() /statuschanged() not clickable ELTE IK, Szoftvertechnológia 6:47

Hisztorizációs állapotok Általánosított állapotok esetén előfordulhat, hogy a végrehajtás megszakad, és a végrehajtást a megszakítás pontjában szeretnénk végezni, ebben az esetben hisztorizációs állapotot (history state) használatunk Pl. (előadás): előadás prezentáció válasz elfogadása kérdés tűzriadó válaszadás ELTE IK, Szoftvertechnológia 6:48

Terminálás Amennyiben az állapotátmenetet nem a végállapotban szeretnénk bejezni, lehetőségünk van terminálni (terminate) az állapotautomatát egy szabályos megszakítási pont, amely nem hagyja abnormális állapotban a programot (pl. kivétel kiváltás, párhuzamos futtatás megszakítása) Pl. (előadás): prezentáció bombariadó válasz elfogadása kérdés válaszadás ELTE IK, Szoftvertechnológia 6:49

Párhuzamos programok állapotai Amennyiben az alkalmazás párhuzamosan is tud tevékenységeket végezni, szétválaszthatjuk (fork) a végrehajtást, majd később összefuttathatjuk a párhuzamos működést (join) Pl. (előadás): [szóbeli] előadás magyaráz előadásra készülés [vizuális] diavetítés ELTE IK, Szoftvertechnológia 6:50