Szoftvertechnológia 8. gyakorlat. Tervezés Giachetta Roberto

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

3. Beadandó feladat dokumentáció

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

Szoftvertechnológia 2. gyakorlat. Projektdefiníció és elemzés Giachetta Roberto

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

Programozási technológia 1.

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

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

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

Programozási technológia 2.

Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

Adatok speciális megjelenítése

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Adatkezelés speciális eszközökkel. 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

2. Beadandó feladat dokumentáció

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Az iskolai rendszerű képzésben az összefüggő szakmai gyakorlat időtartama. 10. évfolyam Adatbázis- és szoftverfejlesztés gyakorlat 50 óra

Adatbázis-kezelés Access XP-vel. Tanmenet

Vonalkód olvasó rendszer. Specifikáció Vonalkód olvasó rendszer SoftMaster Kft. [1]

Elemi alkalmazások fejlesztése III.

1. beadandó feladat dokumentáció

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

Számítógépes Hálózatok. 5. gyakorlat

Webes alkalmazások fejlesztése 3. előadás. Objektumrelációs adatkezelés (ASP.NET)

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

3. Beadandó feladat dokumentáció

SSL VPN KAPCSOLAT TELEPÍTÉSI ÚTMUTATÓ

Nyilvántartási Rendszer

Az SQL*Plus használata

Objektumelvű programozás

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

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

Thermo1 Graph. Felhasználói segédlet

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

HASZNÁLATI ÚTMUTATÓ DOLGOZÓK IMPORTÁLÁSA KULCS BÉR PROGRAMBA AZ ONLINE MUNKAIDŐ NYILVÁNTARTÓ RENDSZERBŐL. Budapest, november 08.

2. Beadandó feladat dokumentáció

KAMIONIRÁNYÍTÓ RENDSZER

Név: Neptun kód: Pontszám:

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció

FRISSÍTÉSI LEÍRÁS A WINIKSZ PROGRAMCSOMAGHOZ

Pénzügyi algoritmusok

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

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?

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

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

2. Beadandó feladat dokumentáció

Programozás II. ATM példa Dr. Iványi Péter

C++ programozási nyelv

ABAP dictionary objektumok SAP adatmodell Táblák kezelése. Az SAP programozása 1. Tarcsi Ádám

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Adatelemzés SAS Enterprise Guide használatával. Soltész Gábor solteszgabee[at]gmail.com

Adatbázis, adatbázis-kezelő

C#---Access adatbáziskezelési gyakorlat

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

NAV online számla regisztráció SAP rendszerhez

Felhasználói segédlet a Web of Knowledge / Web of Science adatbázis használatához

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

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Az ErdaGIS térinformatikai keretrendszer

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

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

Felhasználói segédlet a Scopus adatbázis használatához

DebitTray program Leírás

Kormányzati Elektronikus Aláíró és Aláírás-ellenőrző Szoftver

Programozási technológia

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

AWK programozás Bevezetés

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

Számítógépes Hálózatok GY 3-4.hét

Adatbáziskezelés M/V architektúrában

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, Quantum GIS program alkalmazásával Útmutató 2010.

ELTE, Informatikai Kar december 12.

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

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

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

Cisco Catalyst 3500XL switch segédlet

Tartalomjegyzék 2. RENDSZER FELÉPÍTÉSE... 3

3. Osztályok II. Programozás II

ServiceTray program Leírás

Szerver oldali Java programozás /II. 1. óra. Elemkönyvtárak. Elemkönyvtárak használata Saját elemkönyvtár készítése.

ZH mintapélda. Feladat. Felület

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

Zimbra levelező rendszer

TERC V.I.P. hardverkulcs regisztráció

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Haladó irodai számítógépes képzés tematika

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

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

3. Ezután a jobb oldali képernyő részen megjelenik az adatbázistábla, melynek először a rövid nevét adjuk meg, pl.: demo_tabla

Felhasználói segédlet a Scopus adatbázis használatához

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

MŰSZAKI KÖVETELMÉNYEK, A KÖRKERESŐ SZOFTVER SPECIFIKÁCIÓJA, KÖLTSÉGVETÉS. A) Műszaki követelmények

ESZR - Feltáró hálózat

ContractTray program Leírás

Felhasználói útmutató CVR mobil kliens, ios rendszerhez.

Felhasználói kézikönyv - Android kliens

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Szoftvertechnológia 8. gyakorlat Tervezés 2013.11.04. Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

A szoftver életciklus Minden szoftver rendelkezik életciklussal, amely meghatározza létét a feladat kitűzésétől a program használatának befejeztéig Az életciklus a következő fázisokra tagolható: 1. projektdefiníció (project definition) 2. elemzés (analysis) 3. tervezés (software architecture) 4. implementáció (implementation) 5. tesztelés (testing) 6. kihelyezés (deployment, release) 7. tréning és támogatás (training and support) 8. karbantartás (maintenance) ELTE IK, Szoftvertechnológia 8:2

A tervezési folyamat A tervezés a készülő szoftver absztrakt megvalósítása, azaz: a rendszer szerkezetének meghatározása, a programegységek, részegységek feltérképezése a programrészek pontos ábrázolása, funkcióinak meghatározása, ezek közötti reláció, kommunikáció megvalósítása (adatmodellek, áramlások feltérképezése) a feladatmegoldás folyamatának meghatározása, a benne részt vevő programegységekkel, azok állapotváltozásaival, illetve a kiváltó események meghatározása A tervezés során főként az UML csomag, osztály, állapot és szekvencia diagramokat használjuk fel ELTE IK, Szoftvertechnológia 8:3

A tervezési folyamat A program szerkezetének meghatározása: 1. a feladat elemezése, igények és követelmények feltérképezése, felhasználói esetek megállapítása 2. tárgykörök azonosítása, objektumok, majd osztályok hozzárendelése 3. interfészek, kapcsolódási pontok, adatkezelés megtervezése 4. a belső reprezentáció, működési elvek (algoritmusok) feltérképezése 5. végrehajtási folyamat, állapotváltozások meghatározása 6. implementáció specifikus jellemzők meghatározása ELTE IK, Szoftvertechnológia 8:4

Rendszerterv A tervezés eredménye a szoftver rendszerterve (software design description, SDD), amely tartalmazza: a program statikus szerkezetét, azaz a programegységek feladatát, részletes leírását és a köztük lévő relációkat a program dinamikus szerkezetét, azaz a program eseményeinek kiváltódását és hatásait, a programegységek állapotainak változását, az üzenetküldések megvalósítását a tárolt, kezelt, és eredményül adott adatok formáját, leírását a programok belső és külső interfészeinek leírását ajánlásokat az implementáció számára (stratégia, függőségek, programozási nyelv, tesztelési módszerek) ELTE IK, Szoftvertechnológia 8:5

Rendszerterv A rendszerterv meghatározó jellemzői: kohézió: egy programegységen belül a komponensek összetartozása, akkor jó, ha erős az összetartó erő összekapcsolás: a programegységek egymáshoz való kapcsolódása és függése, akkor jó, ha gyenge a függés módosíthatóság: mennyiben módosítható a teljes program az egységek, vagy részegységek cseréjével fejleszthetőség: új komponensekkel való bővíthetőség lehetősége, mennyire szabványosak a csatolási felületek bonyolultság: a terv áttekinthetősége és megérthetőségének a mértéke ELTE IK, Szoftvertechnológia 8:6

1. esettanulmány: a feladat 1. esettanulmány: Készítsünk programot, amely Marika néni kávézójának eladási nyilvántartását végigköveti. a kávézóban 3 féle étel (hamburger, ufo, palacsinta 10%-os áfával), illetve 3 féle ital (tea, narancslé, kóla 25%-os áfával) 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 minden rendelés több ételből és több italból áll, és sorszámmal rendelkezik, esetlegesen törzsvásárlói számmal, amelyet hagyhatunk üresen is lehessen lekérdezni egy adott rendelésre, egy adott törzsvásárlóra, illetve összesítve a bruttó, nettó összeget ELTE IK, Szoftvertechnológia 8:7

1. esettanulmány: felhasználói esetek Felhasználói esetek: Új rendelés felvétele: megadható a törzsvásárlói szám ital felvétele: elég kiválasztani a megadott italt étel felvétele: az étel típusát ki kell választani, majd meg kell adni pontos nevét, illetve bruttó árát Rendelések lekérdezése: adott törzsvásárlóhoz: a törzsvásárlói szám megadásával csak a lényegi adatok lekérdezése összes: valamennyi rendelésről a statisztikák lekérdezése egy rendelés: a rendelés azonosító (sorszám) megadásával valamennyi adat egy rendelésről ELTE IK, Szoftvertechnológia 8:8

1. esettanulmány: felhasználói esetek uc Kávézó Kávézó Új rendelés «include» Étel felvétele «include» Ital felvétele felhasználó Rendelések lekérdezése «include» Törzsvásárló «include» «include» Egy rendelés Összes rendelés ELTE IK, Szoftvertechnológia 8:9

1. esettanulmány: statikus tervezés A program felépítése (1. fázis): a feladatban fellelhető tárgykörök a menü, a rendelések listája, a rendelés, valamint a rendelés elemei (italok, ételek) rendelés elemei (Item): hasonlóan viselkednek, ám némileg eltérően ezért megvalósításban öröklődést használunk, specializáljuk a 3 ételt, illetve italt rendelés (Order): tartalmazza az elemeket (mivel a rendelések száma változhat, ezért láncolt listát használ) menü (Menu): tartalmazza a rendeléseket (láncolt listában) ELTE IK, Szoftvertechnológia 8:10

1. esettanulmány: statikus tervezés class Kávézó Pancake Orange Ufo Hamburger Item -items * Tea Coke Order -orders * Menu List ELTE IK, Szoftvertechnológia 8:11

1. esettanulmány: statikus tervezés A program felépítése (2. fázis): láncolt lista (List): külön megvalósítást igényel, sablonos típusként kétszeresen láncolt, fejelemes, aciklikus reprezentáció lehetőséget ad a beszúrásra (elején, végén, közben), törlésre, kiürítésre, és méret lekérdezésre a listaelem (ListItem) tárolja az adatot és a két mutatót a hibát kivétellel jelezzük, egy felsorolási típussal (Exceptions) a lista bejárható, a bejáró (Iterator) a szabványos műveleteket tárolja ELTE IK, Szoftvertechnológia 8:12

1. esettanulmány: statikus tervezés A program felépítése (2. fázis): rendelési elemek (Item): közös tulajdonságaik a típusnév, a bruttó és nettó ár az ételek esetén további adatok a konkrét név, illetve ár rendelések (Order): tulajdonságai az azonosító (ez automatikus), a törzsvásárlói szám lehetőséget ad új elem felvételére, nettó/bruttó érték lekérdezésére menü (Menu): biztosítja a mentést/betöltést, valamint a menüfunkciókat ELTE IK, Szoftvertechnológia 8:13

1. esettanulmány: statikus tervezés A program felépítése (3. fázis): a cím szerinti hivatkozásokat mutatókon keresztül kezeljük a listaelemet és a lista kivételeit beágyazott osztályként hozzuk létre, a listaelem egyszerűsége miatt lehet rekord (struct) a lista megfelelő használatához szükséges destruktor, másoló konstruktor, értékadás művelet, kiíró operátor, indexelő operátor a rendelési elem ősosztályban megvalósítunk egy virtuális destruktort ELTE IK, Szoftvertechnológia 8:14

1. esettanulmány: statikus tervezés class CoffeShop (List) ValueType : class - _head :ListItem* - _size :int - _tail :ListItem* List -_next -_prev + _data :ValueType + _next :ListItem* + _prev :ListItem* «struct» ListItem + ListItem(ListItem*, ListItem*) + ListItem(ValueType, ListItem*, ListItem*) -_current Iterator - _current :ListItem* + Iterator() + Iterator(Iterator&) + operator++() :Iterator& + operator++(int) :Iterator& + operator--() :Iterator& + operator--(int) :Iterator& + operator*() :ValueType {query} + operator==(iterator&) :bool {query} + operator!=(iterator&) :bool {query} + List() -_tail + ~List() + List(List&) + operator=(list&) :List& + Begin() :Iterator {query} -_head+ End() :Iterator {query} + RBegin() :Iterator {query} + REnd() :Iterator {query} + Insert(Iterator&, ValueType) :void + InsertFirst(ValueType) :void + InsertLast(ValueType) :void + Remove(Iterator&) :ValueType + RemoveFirst() :ValueType + RemoveLast() :ValueType + Clear() :void + Size() :int {query} «friend» + operator<<(std::ostream&, List&) :std::ostream& «enumeration» Exceptions LIST_IS_EMPTY ELTE IK, Szoftvertechnológia 8:15

1. esettanulmány: statikus tervezés class CoffeShop (Items) Coke + Coke() + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} Hamburger - _name :std::string - _totalvalue :int + Hamburger(std::string, int) + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} Tea + Tea() + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} Orange + Orange() + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} Item + ~Item() + GetNetValue() :int {query} + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} Ufo - _name :std::string - _totalvalue :int + Ufo(std::string, int) + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} Pancake - _name :std::string - _totalvalue :int + Pancake(std::string, int) + GetTotalValue() :int {query} + GetType() :char {query} + GetName() :std::string {query} ELTE IK, Szoftvertechnológia 8:16

1. esettanulmány: statikus tervezés class CoffeShop (Orders) Menu - _orders :List<Order*> + Menu() + ~Menu() + Run() :void + LoadData() :void + SaveData() :void - WriteMainMenu() :void - WriteRatingsMenu() :void - AddOrder() :void - ShowRatingsForOrder(int) :void - ShowRatingsForCard(int) :void - ShowRatings() :void -_orders * Order - _cardnumber :int - _items :List<Item*> - _number :int + Order(int, int) + AddItem(Item*) :void + GetNumber() :int {query} + GetCardNumber() :int {query} + Items() :List<Item*>& {query} + GetNetValue() :int + GetTotalValue() :int {query} {ValueType = Order*} -_orders -_items -_items * List Item {ValueType = Item*} ELTE IK, Szoftvertechnológia 8:17

1. esettanulmány: adatkezelés A program adatkezelésének megvalósításához egyetlen szöveges fájlra lesz szükségünk legyen ez kavezo.dat, és a programmal azonos könyvtárban helyezkedik el a fájl szerkezete a következőképpen épül fel: <rendelés azonosító>;<italok/ételek száma>; <törzsv. szám> <típus: h/u/p/t/n/k>;<étel neve>;<étel ára> <típus: h/u/p/t/n/k>;<étel neve>;<étel ára> <rendelés azonosító>;<italok/ételek száma>;<törzsv. szám> ELTE IK, Szoftvertechnológia 8:18

1. esettanulmány: dinamikus tervezés A program működése: a lista végrehajt tevékenységet, ugyanakkor állapotai lényegteleneket a program futása szempontjából a menü hajtja végre a tényleges tevékenységeket a különböző metódusok (menüpontok) futtatásával, mivel a metódusok futtatása jellemzi a program különböző állapotait, így az állapotokat a tevékenységekhez kötjük a menüfuttatás mellett az adatok betöltése, valamint kimentése is szerepet játszik a működésben, ezért külön részletezzük a teljes program állapotait, valamint a menüfuttatás állapotait ELTE IK, Szoftvertechnológia 8:19

1. esettanulmány: dinamikus tervezés stm Kávézó LoadData() Run() SaveData() ELTE IK, Szoftvertechnológia 8:20

1. esettanulmány: dinamikus tervezés stm Run() AddOrder() WriteMainMenu() ShowRatingsForOrder(int) ShowRatingsForCard(int) WriteRatingsMenu() ShowRatings() ELTE IK, Szoftvertechnológia 8:21

1. esettanulmány: dinamikus tervezés sd CoffeShop Actor m :Menu LoadData() Run() SaveData() ELTE IK, Szoftvertechnológia 8:22

1. esettanulmány: dinamikus tervezés sd Add Order m :Menu Actor AddOrder() Order(int, int) Order :Order loop AddItem(Item*) _orders.insertlast(order*) ShowRatingsForOrder(int) GetNetValue() :int GetTotalValue() :int ELTE IK, Szoftvertechnológia 8:23

2. esettanulmány: a feladat 2. esettanulmány: A feladat egy adatbázis alapú, grafikus felületű alkalmazás megvalósítása egy apartmanokkal foglalkozó utazási ügynökség számára, amelyben a felhasználóknak lehetősége van apartmanok foglalására. az adatbázisban városokra csoportosítva találunk épületeket, és épületen belül apartmanokat a programba a felhasználóknak be kell előbb jelentkeznie, így kapnak lehetőséget az adatok megtekintésére és szerkesztésére a felhasználó lehetőséget kap az egyes adatok megtekintésére és szerkesztésére, valamint apartmanok foglalására ELTE IK, Szoftvertechnológia 8:24

2. esettanulmány: felhasználói esetek uc TravelAgency Bejentkezés «precedes» Foglalás «include» Foglalások listázása «precedes» «include» Új foglalás «include» Fizetés Felhasználó Adminisztráció «include» Városok szerkesztése Szezonok szerkesztése «include» «include» «include» «include» Épületek szerkesztése «include» «include» Árak szerkesztése Apartmanok szerkesztése Felhasználók szerkesztése Ügyfelek szerkesztése ELTE IK, Szoftvertechnológia 8:25

2. esettanulmány: statikus tervezés A program felépítése (1. fázis): a program szerkezetét a Qt modell/nézet architektúrának megfelelően építjük fel az adatbázis kezelésére táblamodell osztályokat alkalmazunk, amelyek tartalmát megfelelő táblamegjelenítőkkel és egyéb vezérlőkkel jelenítjük meg a beépített architektúrát több ponton kiegészítjük, ahol egyedi viselkedésre/megjelenésre van szükségünk, továbbá megvalósítjuk a megjelenítő ablakokat bejelentkezést diaglógusablakban végezzük (LoginDialog) ELTE IK, Szoftvertechnológia 8:26

2. esettanulmány: statikus tervezés class TravelAgency QDialog AppartmentRentDialog -rentwidget -pricesortfiltermodel QSortFilterProxyModel PriceSortFilterProxyModel QWidget RentListWidget -rentlistwidget QWidget AppartmentListWidget -appartmentlistwidget QSqlRelationalTableModel RentTableModel -renttablemodel QSqlRelationalDelegate BuildingTableDelegate QListWidget FeatureEditorListWidget -buildingtabledelegate QMainWindow MainWindow -mainwindow 5 QWidget TableEditorWidget QSqlRelationalTableModel AppartmentTableModel -appartmenttablemodel LoginDialog QDialog -buildingtablemodel QSqlRelationalTableModel BuildingTableModel ELTE IK, Szoftvertechnológia 8:27

2. esettanulmány: statikus tervezés A program felépítése (2. fázis): főablak (MainWindow): egy MDI megjelenítőt (QMdiArea) tartalmaz, valamint egy menüsort legyártott akciókkal példányosítja a megfelelő táblamodelleket (setupmodels), illetve az épületek esetén egy egyedi megjelenítőt (BuildingTableDelegate) az akciók végrehajtása a megfelelő beágyazott ablak megnyitását kezdeményezi minden ablak ekkor kapja a táblamodell mutatókat, amelyeket a szerkesztésre felhasznál, így a táblákat nem töltjük be többszörösen a memóriába ELTE IK, Szoftvertechnológia 8:28

2. esettanulmány: statikus tervezés A program felépítése (2. fázis): táblamodellek: az AppartmentTableModel specialitása, hogy az apartman állapotát kijelölő mezőn keresztül tudja kezelni. a BuildingTableModel új oszlopokat definiál az állapot, apartman szám, valamint minimum/maximum árak kezelésére, továbbá adatellenőrzéseket végez. a RentTableModel letiltja a nézetek számára a szerkesztést, valamint a fizetési állapotot kijelölést formájában adja vissza ELTE IK, Szoftvertechnológia 8:29

2. esettanulmány: statikus tervezés class TravelAgency (Models) QSqlRelationalTableModel AppartmentTableModel + AppartmentTableModel(QObject*) + data(qmodelindex&, int) :QVariant {query} + setdata(qmodelindex&, QVariant&, int) :bool - setupmodel() :void QSqlRelationalTableModel BuildingTableModel + BuildingTableModel(QObject*) + data(qmodelindex&, int) :QVariant {query} + columncount(qmodelindex&) :int {query} + flags(qmodelindex&) :Qt::ItemFlags {query} + setdata(qmodelindex&, QVariant&, int) :bool - setupmodel() :void - model_beforeinsert(qsqlrecord&) :void - model_datachanged(qmodelindex&, QModelIndex&) :void ELTE IK, Szoftvertechnológia 8:30

2. esettanulmány: statikus tervezés class TravelAgency (MainWindow) MainWindow QMainWindow - userlevel :int - mdiarea :QMdiArea* - rentmenu :QMenu* - administermenu :QMenu* - rentlistaction :QAction* - rentmakeaction :QAction* - cityaction :QAction* - buildingaction :QAction* - appartmentaction :QAction* - seasonaction :QAction* - customeraction :QAction* - useraction :QAction* - appartmentlistwidget :AppartmentListWidget* - rentlistwidget :RentListWidget* - cityeditorwidget :TableEditorWidget* - buildingeditorwidget :TableEditorWidget* - appartmenteditorwidget :TableEditorWidget* - seasoneditorwidget :TableEditorWidget* - customereditorwidget :TableEditorWidget* - usereditorwidget :TableEditorWidget* - citytablemodel :QSqlTableModel* - buildingtablemodel :QSqlTableModel* - appartmenttablemodel :QSqlTableModel* - seasontablemodel :QSqlTableModel* - renttablemodel :QSqlTableModel* - customertablemodel :QSqlTableModel* - usertablemodel :QSqlTableModel* - buildingtabledelegate :BuildingTableDelegate* + MainWindow(int, QWidget*) + ~MainWindow() # closeevent(qcloseevent*) :void # rentlistaction_triggered() :void # rentmakeaction_triggered() :void # cityaction_triggered() :void # buildingaction_triggered() :void # appartmentaction_triggered() :void # seasonaction_triggered() :void # customeraction_triggered() :void # useraction_triggered() :void - setupmenu() :void - setupmodels() :void -buildingtabledelegate -buildingtablemodel QListWidget FeatureEditorListWidget + FeatureEditorListWidget(QWidget*) + setfeatures(int) :void + getfeatures() :int {query} + getfeaturesstring() :QString {query} BuildingTableDelegate QSqlRelationalDelegate + BuildingTableDelegate(QObject*) + paint(qpainter*, QStyleOptionViewItem&, QModelIndex&) :void {query} + createeditor(qwidget*, QStyleOptionViewItem&, QModelIndex&) :QWidget * {query} + seteditordata(qwidget*, QModelIndex&) :void {query} + setmodeldata(qwidget*, QAbstractItemModel*, QModelIndex&) :void {query} - shorelist() :QStringList {query} QSqlRelationalTableModel BuildingTableModel ELTE IK, Szoftvertechnológia 8:31

2. esettanulmány: adatkezelés Adatkezelést adatbázis biztosítja a következő táblákkal: városok (city): azonosító, városnév; épületek (building): azonosító, név, város azonosító, utca, tengerpart távolság, tengerpart-típus (számként), jellemzők (binárisan összeillesztve), megjegyzés; apartmanok (appartment): azonosító, épület azonosító, szám, ágyak száma, pótágyak száma, felújítás alatt van-e; ügyfelek (customer): azonosító, név; foglalások (rent): azonosító, ügyfél azonosító, apartman azonosító, kezdődátum, befejező dátum, fizetett-e az ügyfél, összeg; ELTE IK, Szoftvertechnológia 8:32

2. esettanulmány: adatkezelés ELTE IK, Szoftvertechnológia 8:33

2. esettanulmány: dinamikus tervezés A program működése: a program indításkor ellenőrzi az adatbázis-kapcsolatot, amennyiben az nem megfelelő, azonnal terminál a program elsőként a bejelentkező ablakot nyitja meg, amelyben a felhasználó megadhatja az azonosítót, illetve jelszót (ezek ellenőrzésre kerülnek az adatbázis alapján) amennyiben az azonosítás sikeres, megnyílik a főablak, amelyben elérhetővé válnak a menüpontok minden ablak megnyitásakor az alkalmazás betölti az adatokat az adatbázisból, ablak bezárásakor (vagy mentés gombra) pedig elmenti azokat (amennyiben sikerült) ELTE IK, Szoftvertechnológia 8:34

2. esettanulmány: dinamikus tervezés stm TravelAgency 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 8:35

2. esettanulmány: dinamikus tervezés stm TravelAgency db.open() open success [db.open() == true] loginbutton_clicked() [query.count() == 0] logindialog.show() loginbutton_clicked [query.count() > 0] mainwindow.show() closebutton_clicked open failed [db.open() == false] closebutton_clicked() ELTE IK, Szoftvertechnológia 8:36

2. esettanulmány: dinamikus tervezés stm Főablak megjelenítése 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 8:37

2. esettanulmány: dinamikus tervezés stm Show MainWindow tablemodel->select() [tablemodel->submitall() == true && closing == false] View/edit data savebutton_clicked() tablemodel->submitall() [tablemodel->submitall() == true && closing == true] closebutton_clicked() [tablemodel->submitall() == false] [closing == false] errordialog->show() [closing == true] ELTE IK, Szoftvertechnológia 8:38

3. esettanulmány: a feladat 3. esettanulmány: A feladat egy olyan programrendszer (ETRImporter) megvalósítása, amellyel lehetőség nyílik különböző adatok betöltésére az ETR központi adatbázisába. a program felhasználói megadott formátumokban importálhatnak, illetve szerkeszthetnek adatokat a programban, melyet végül elküldhetnek egy központi szervernek, amely betölti az adatokat az adatbázisba az adatok táblázatos formában kerülnek betöltésre, azok utólagos szerkesztését is biztosítanunk kell a programban a táblák formátumát központilag szabályozzák, de a későbbiekben tetszőleges módosítás alá kerülhetnek, illetve új adatformátumok kerülhetnek a rendszerbe ELTE IK, Szoftvertechnológia 8:39

3. esettanulmány: felhasználói esetek uc ETRImporter Kliens Importálás Üres tábla létrehozása «include» Szövegből Adatok importálása «include» Excelből «include» CSV-ből Közvetítő Táblakezelés Esemény naplózás Felhasználó Adatok szerkesztése «include» Helyesség ellenőrzés Adatok feltöltése Sorok szűrése Tábla feltöltése Felhasználó kezelése Beállítások Bejelentkezés Rendszergazda ELTE IK, Szoftvertechnológia 8:40

3. esettanulmány: statikus tervezés A rendszert az alábbiaknak megfelelően építjük fel: a kliens (ImporterClient) egy grafikus felületű alkalmazás, amely biztosítja az adatok betöltését, kezelését, valamint hálózaton történő továbbítását a szerver oldali szolgáltatás (ImporterService) állandó jelleggel fut a háttérben a szerveren, a szolgáltatás feladata lesz a kliensek kéréseinek kiszolgálása, a kommunikáció, az adatok kezelése és bevitele az adatbázisban, illetve az eseménynaplózás a közvetítő program (ImporterAdmin) feladata korlátozódik az eseménynapló, valamint a csatlakoztatott kliensek megtekintésére, esetleges üzenetküldésre ELTE IK, Szoftvertechnológia 8:41

3. esettanulmány: statikus tervezés Célszerű a tábla típusainak kezelését külön könyvtárba kiemelni (TypeManagement), hiszen azt már három további komponens is használja Így a rendszer már összesen 4 komponensből áll ELTE IK, Szoftvertechnológia 8:42

3. esettanulmány: statikus tervezés A szerver gépen így megjelenik a közvetítő mellett a szolgáltatás, illetve ott és a kliens gépen is megjelenik a típuskezelés ELTE IK, Szoftvertechnológia 8:43

3. esettanulmány: statikus tervezés A kliens program funkcióit három csomag valósítja meg: felhasználói felület (GUISystem) adatimportáló (ImportSystem) adatkezelő (DataSystem) ELTE IK, Szoftvertechnológia 8:44

3. esettanulmány: statikus tervezés Az adatimportáló csomag a különböző formátumú fájlok betöltésére szolgál, a későbbiekben tetszőlegesen bővíthetőm megfelelően feldogozza a fájlt, és eltárolja a nyers adatokat ennek megfelelően szükség van egy általános osztályra, amely beolvassa (Open) és eltárolja (Data) az adatokat ebből származtatunk speciális feldolgozó osztályokat, amelyek a beolvasást felüldefiniálják ELTE IK, Szoftvertechnológia 8:45

3. esettanulmány: statikus tervezés class ImportSystem DataImporter # Data :List<String[]> # RowType :List<Char> # IsColumnFirst :Boolean # DataImporter() + Open(String, TypeProperties) :Boolean + GetData(Int32, Int32) :String + GetRow(Int32) :String[] «property» + Length() :Int32 «indexer» + this(int32) :String[] - Sign :Char TextDataImporter + TextDataImporter(Char, Boolean) + Open(String, TypeProperties) :Boolean ExcelDataImporter + ExcelDataImporter(Boolean) + Open(String, TypeProperties) :Boolean ELTE IK, Szoftvertechnológia 8:46

3. esettanulmány: statikus tervezés Az adatkezelő csomag az adatok táblázatos kezeléséért, valamint a kommunikáció lebonyolításáért felel a kommunikációs osztály (Connection) feladata a kapcsolat létrehozása (Connect) TCP kapcsolattal SSL titkosítást alkalmazva, tetszőleges adat feltöltése (SendData), letöltése (ReadData) az összes adat felügyeletét egy adatkezelő osztályra bízzuk (DataHandler), amely kezeli a táblákat (TableObject) a tábla, és annak sorainak, oszlopainak típusleírását külön osztályokra bízzuk (TableType, RowType, Column) a helyes formátum kialakítását külön osztályra bízzuk (DataFormat), amely ezt statikus műveletekkel végzi ELTE IK, Szoftvertechnológia 8:47

3. esettanulmány: statikus tervezés class DataSystem + IsUpdated :Boolean - IPAddress :String - Port :Int32 - ConnectionClient :TcpClient - Stream :SslStream «static» DataFormat Connection + Connection() + Connect() :void + Disconnect() :void + RefreshSettings() :void + CheckSettings() :void + SendData(String, System.Collections.Generic.Dictionary, String) :void + ReadData() :Boolean - OnCertificateValidation(object, X509Certificate, X509Chain, SslPolicyErrors) :Boolean «property» + IsConnected() :Boolean + Format(String, LocalDataType) :String + TypeOf(String) :LocalDataType - FormatToChar(String) :String - FormatToInteger(String) :String - FormatToFloat(String) :String - FormatToDate(String) :String - FormatToEmail(String) :String - FormatToGenre(String) :String - FormatToZipCode(String) :String - FormatToPhoneNr(String) :String - FormatToAccountNr(String) :String - FormatToFinancial(String) :String SettingsReader - InputFile :StreamReader + SettingsDate :String + amely :String - file :StreamReader - file :try = new StreamReade... + SettingsReader() «enumeratio... LocalDataType Text Char LargeText Integer BigInteger Float Date Email Genre Nation Town ZipCode PhoneNr IdentityNr AccountNr Financial +Type +Server «readonly» + Id :String + Name :String + Needed :Boolean + Type :LocalDataType + Description :String DataHandler + Tables :List<TableObject> - TableProperties :TableTypesData - Server :Connection + DataHandler(Connection) + NewTable(TableType) :void + NewTable(TableType, DataImporter) :void + NewTable(TableObject) :void + UploadTable(Int32) :void + CloseTable(Int32) :void + DeleteTable(Int32) :void + IsModified() :Boolean + IsModified(Int32) :Boolean + Close() :void «property» + TableCount() :Int32 + TempFileCount() :Int32 + TableTypes() :TableTypesData -TableProperties TableTypesData + Rows :List<RowType> - Types :List<TableType> + TableTypesData() - ProcessRow(String, SettingsReader) :void - ProcessTable(String, SettingsReader) :void «indexer» + this(int32) :TableType + this(string) :TableType «property» + TypeCount() :Int32 + RowCount() :Int32 «Serializable» Column + Column(String, String, Boolean, String, String) + Column(String, String, Boolean, LocalDataType, String) +Tables «Serializable» TableObject + TableDate :String + Rows :List<String[]> + Types :List<RowType> + IsModified :Boolean + Errors :Dictionary<Int32, String> «readonly» + FileName :String + Type :TableType + ColumnCount(Int32) :Int32 + TableObject(TableType) + TableObject(TableType, DataImporter) + Clear() :void + Delete() :void + NewRow() :void + NewRow(String[]) :void + NewRow(String[], RowType) :void + InsertRow(Int32, RowType) :void + InsertRows(Int32) :void + ModifyData(Int32, String[]) :void + ModifyData(Int32, Int32, String) :void + DeleteRow(Int32) :void + DeleteRows(Int32) :void - SaveData() :void + Format(TableType) :void «property» + Length() :bool + IsTempAvailable() :Boolean + IsOld() :Boolean +Rows -Columns +Types «Serializable» RowType - Columns :List<Column> «readonly» + Id :String + RowType() + RowType(String) + AddColumn(Column) :void «indexer» + this(int32) :Column «property» + ColCount() :Int32 -Rows «Serializable» TableType + Name :String +Type - Rows :List<RowType> - RowLength :List<Int32> + Description :String + VariedRowLength :Boolean «readonly» + Id :String -Types + TableType() + TableType(String) + TableType(String, String, String) + AddRow() :void + AddRow(RowType, Int32) :void + ModifyRow(Int32, RowType, Int32) :void + Length(Int32) :Int32 + RowTypeId(Int32) :Int32 + PrevId(Int32) :Int32 + NextId(Int32) :Int32 «indexer» + this(int32) :RowType «property» + RowCount() :Int32 + MaxColCount() :Int32 + TotalRowCount() :Int32 ELTE IK, Szoftvertechnológia 8:48

3. esettanulmány: statikus tervezés A felhasználói felület csomagja a felhasználói interakció kezelésére szolgál a felhasználói felület több ablakból, amelyeknek megfeleltetünk egy-egy osztályt, és minden benne szereplő vezérlőnek egy-egy eseménykezelő alprogramot tartalmazza az adatimportáló, illetve adatkezelő alrendszer hivatkozásait attribútumként a következő feladatra kellenek ablakok: indítóablak (StartForm), főablak (MainForm), beállítások (SettingsForm), új tábla létrehozása (NewTableForm), táblatípusok megjelenítése (TypesForm) ELTE IK, Szoftvertechnológia 8:49

3. esettanulmány: statikus tervezés class GUISystem FormItems - ID :Int32 - LoadPeriod :Boolean - Title :List<String> - Parent :MainForm - ButtonNewRow :List<Button> - ButtonDeleteRow :List<Button> - ButtonFormat :List<Button> - ButtonUpload :List<Button> + Tables :List<DataGridView> - Columns :List<List<DataGridViewColumn>> - Data :DataHandler + FormItems(MainForm, DataHandler) + Add(TabPage, String) :void + Remove(Int32) :void - Reload(Int32) :void + Resize() :void - ButtonNewRow_Click(object, EventArgs) :void - ButtonDeleteRow_Click(object, EventArgs) :void - ButtonFormat_Click(object, EventArgs) :void - ButtonUpload_Click(object, EventArgs) :void - Table_RowsAdded(object, DataGridViewRowsAddedEventArgs) :void - Table_CellValueChanged(object, DataGridViewCellEventArgs) :void - Table_RowEnter(object, DataGridViewCellEventArgs) :void + InsertRows(Int32) :void + DeleteRows(Int32) :void + Format(Int32) :void + Upload(Int32) :void - ButtonNewRow_Selected(object, EventArgs) :void - ButtonDeleteRow_Selected(object, EventArgs) :void - ButtonFormat_Selected(object, EventArgs) :void - ButtonUpload_Selected(object, EventArgs) :void - Table_Selected(object, EventArgs) :void - Table_CurrentCellChanged(object, EventArgs) :void - Tables :TableTypesData TypesForm + TypesForm(TableTypesData) - ComboTypeSelect_SelectedIndexChanged(object, EventArgs) :void -rtf + Selected :Int32 RowTypeForm NewTableForm - ColumnTypes :TableTypesData - Handler :DataHandler - Importer :DataImporter MainForm - Handler :DataHandler - TableControls :FormItems - Counter :Int32 Form + RowTypeForm(TableType) - ButtonOk_Click(object, EventArgs) :void Form + NewTableForm() + SetData(TableTypesData, DataHandler) :void - RadioImport_CheckedChanged(object, EventArgs) :void - ButtonListDir_Click(object, EventArgs) :void - RadioText_CheckedChanged(object, EventArgs) :void - RadioCsv_CheckedChanged(object, EventArgs) :void - RadioExcel_CheckedChanged(object, EventArgs) :void - ButtonCancel_Click(object, EventArgs) :void - TextPath_TextChanged(object, EventArgs) :void - ButtonOk_Click(object, EventArgs) :void - ComboTypes_SelectedIndexChanged(object, EventArgs) :void -Parent -new_table Form -idform -main_form + MainForm() -TableControls + MainForm(DataHandler) - MainForm_Resize(object, System.EventArgs) :void ~ AddQuickHelp(String) :void - MenuTabletypes_Click(object, EventArgs) :void - MenuSettings_Click(object, EventArgs) :void - MenuNewTable_Click(object, EventArgs) :void - MenuTableLoad_Click(object, EventArgs) :void Form - MenuCloseTable_Click(object, EventArgs) :void - MenuDeleteTable_Click(object, EventArgs) :void -tf - MenuTableAddRow_Click(object, EventArgs) :void -settings - MenuTableDeleteRow_Click(object, EventArgs) :void - MenuTableFormat_Click(object, EventArgs) :void - MenuTableUpload_Click(object, EventArgs) :void - MenuExit_Click(object, EventArgs) :void - MenuHelpAbout_Click(object, EventArgs) :void ImportRowIdForm - CurrentType :TableType - Data :DataImporter + IsSet :Boolean Form + ImportRowIdForm(TableType, DataImporter) - ButtonAllSame_Click(object, EventArgs) :void - ButtonAllDifferent_Click(object, EventArgs) :void - ButtonCancel_Click(object, EventArgs) :void - ButtonOk_Click(object, EventArgs) :void ETRImporterClient:: Program - Main() :void SettingsForm Form + SettingsForm() - ButtonClose_Click(object, EventArgs) :void - ButtonSave_Click(object, EventArgs) :void - ButtonBase_Click(object, EventArgs) :void - ButtonTableDirBrowse_Click(object, EventArgs) :void - ButtonTableFileBrowse_Click(object, EventArgs) :void StartForm + Handler :DataHandler + Entering :Boolean - Con :Connection - StartReady :Boolean -start - Loading :Timer - TickNr :Int32 Form + StartForm() - ButtonEnter_Click(object, EventArgs) :void - ButtonExit_Click(object, EventArgs) :void - ButtonSettings_Click(object, EventArgs) :void - Loading_Tick(object, EventArgs) :void ELTE IK, Szoftvertechnológia 8:50

3. esettanulmány: adatkezelés A rendszer működése során 4 ki-, és bemeneti csatornát használ: adatok lokális mentése a kliens programban: használjunk szérializációt, azaz az adattáblák adatait közvetlenül az objektumorientált felépítésnek megfelelően írjuk ki kommunikáció a kliens és a közvetítő között: használjunk szabványos TCP kapcsolatot, amelyen ASCII formátumú adatsorozatok tartalmazzák az adatokat az adatformátumokat leíró fájl, amely XML formátumban tárolja a különböző tábladefiníciókat, és sorszerkezeteiket adatok mentése az adatbázisba: definiáljuk a megfelelő átmeneti táblákat, valamint a feldolgozó tárolt eljárásokat ELTE IK, Szoftvertechnológia 8:51

3. esettanulmány: adatkezelés Hálózati kommunikáció: a kapcsolat során a kliens, illetve a közvetítő üzeneteket küldenek egymásnak a hálózaton keresztül, TCP kapcsolat segítségével, a kliens elküldi üzeneteit, majd adott ideig vár a válaszra a titkosítás érdekében az azonosító adatokra alkalmazzunk MD5 kódolást, illetve a csatorna kommunikációjára használjunk SSL protokollt a közvetítő állandóan hallgatózik a hálózaton, és várja az új üzenet megérkeztét, a beérkező üzenetek egymás után kerülnek feldolgozásra ELTE IK, Szoftvertechnológia 8:52

3. esettanulmány: adatkezelés adattovábbítás: a kliens üzenetek formájában küldi el a teljes táblát, benne az azonosító számával és a lekérdezés típusával amennyiben a kliens nem kap választ adott időn belül egy módosítás eltárolására, akkor a küldés sikertelen üzenetszintaxis: egy üzenetkóddal indul, amely megadja az üzenet típusát, a tartalmi elemeket ;-vel választjuk el egymástól Üzenetfajta Kód Üzenet szövege Felhasználó (kliens) 10 felhasználó név; beállítás dátum; bejelentkezés kérés Beállítás frissítés kérés 11 azonosító szám;......... ELTE IK, Szoftvertechnológia 8:53

3. esettanulmány: adatkezelés Adatbázis kommunikáció: a közvetítő csak a fenntartott táblákat használja az ETR adatbázisában, azok feldolgozását tárolt eljárások végzik a tárolt eljárások hiba, összeütközés, ellentmondás, vagy hiányzó adat esetén szemantikus hibát jeleznek (soronként), amelyet a közvetítő visszaküld a kliensnek minden adatformátum egy, vagy több saját táblával rendelkezik az adatkezeléshez ETR_IMPORTER_TEMP_<táblatípus név>_p<sorszám> elnevezés konvecióval ezen felül vannak állandó táblák, amelyek a rendszer működéséhez szükségesek ELTE IK, Szoftvertechnológia 8:54

3. esettanulmány: adatkezelés ELTE IK, Szoftvertechnológia 8:55

3. esettanulmány: dinamikus tervezés A kliens program indulási folyamata: kapcsolat létrehozása a közvetítővel, felhasználó bejelentkeztetése táblatípusok frissítése, amennyiben szükséges adatkezelő objektum inicializálása a kapcsolattal korábbról megmaradt táblák ellenőrzése és betöltése továbblépés engedélyezése, amennyiben a folyamat sikerrel járt, hibák esetén csak kiléptetés engedélyezése Sikertelen kapcsolódás, vagy adatforgalom esetén a kapcsolatépítés, és a táblatípus frissítés minden feltöltés kezdeményezésre megismétlődik ELTE IK, Szoftvertechnológia 8:56

3. esettanulmány: dinamikus tervezés sd Client Load Sequence Program StartForm Connection Timer DataHandler Load() Start() Open() Timer_Tick() opt [Connected] RefreshSettings() Create(con: Connection) Timer_Tick() Timer_Tick() Timer_Tick() CheckTables() opt [checktables() == true] NewTable() ButtonEnter.Enabled() Timer_Tick() ButtonExit.Enabled() ELTE IK, Szoftvertechnológia 8:57