DASKALOS vypracování příkladu eshop Vypracoval: Martin Papík Praha 2007
Obsah 1. Daskalos příklad eshop 1.2 Popis zadání 1.3 Možný návrh řešení 2. Daskalos tvorba datového modelu eshopu 2.2 Spuštění prostředí Daskalos 2.3 Vytvoření nového projektu 2.4 Vytváření tříd 2.5 Vytváření atributů 2.6 Vytváření instancí 2.7 Vytváření skriptů 2.8 Zadání dotazu 3. Daskalos automaticky generované výstupy 3.2 Class diagram 3.3 HTML dokumentace 4. Příloha dokumentace eshop.html
1. Daskalos příklad eshop 1.2 Popis zadání Pokusme se navrhnout v prostředí DASKALOS jednoduchý objektový datový model internetového obchodu (eshopu) zaměřeného na výpočetní techniku. Pro pružný chod takového obchodu je potřeba vhodný datový model. Musí odrážet potřeby jak samotného prodejce (např. přehled o zboží, dodavatelích, zákaznících), tak i potřeby zákazníka (např. přehled zboží). Model by měl tedy minimálně uchovávat následující informace: Informace o zboží. Informace o dodavatelích. Informace o zákaznících. Informace o reklamacích. Z výše uvedeného zadání je vidět, že se jedná o školní příklad, pochopitelně praktický model by musel uchovávat mnohem větší objem informací. 1.3 Možný návrh řešení Návrh řešení vytvoříme na konceptuální úrovni analýzy, použijeme k tomu tříd. Nejdříve jmenujme třídy, které v tomto datovém modelu použijeme : Třída ZBOŽÍ uchovává evidence zboží (výrobků) které nabízíme v našem eshopu. Bude obsahovat následující atributy : Seriove_cislo, Nazev, Cena, Popis, Datum_nakupu, Datum_prodeje. Třída DODAVATEL uchovává informace o našich dodavatelích. Bude obsahovat následující atributy : Nazev, Ico, Dodano. Třída ZÁKAZNÍK uchovává informace o našich zákaznících (odběratelích). Bude obsahovat následující atributy: Login_informace, Prijmeni, Jmeno, Datum_nakupu, Zakoupeno. Třída REKLAMACE uchovává informace o reklamovaném (vrácenném) zboží. Bude obsahovat následující atributy: Cislo_reklamace, Datum_prijeti, Popis_problemu. Dále je nutné vytvořit třídu SUBJEKT, která bude předchůdcem tříd Zákazník a Dodavatel (resp. tyto dvě třídy jsou jejími potomky). Tato třída uchovává infomace o adresách a kontaktech. Bude obsahovat atributy: Mesto, Ulice, Cp, Psc, Zeme, Email, Telefon, Fax. Nyní, když jsme si vytvořili alespoň hrubou představu o struktuře datového modelu (databáze), přistoupíme k práci s prostředím DASKALOS.
2. Daskalos tvorba datového modelu eshopu 2.2 Spuštění prostředí Daskalos Nejprve musíme provést instalaci vývojového prostředí VisualWork určeného pro objektový jazyk SmallTalk. Toto prostředí (resp. samostatny program Daskalos vyčleněný z vývojového prostředí) lze pro potřeby výuky stáhnout z webových stránek: http://kii.pef.czu.cz/~merunka/books. Vývojové prostředí spustíme souborem new74.im cesta k nemu je obyčejně JEDNOTKA\vw7.4nc\image\new74.im. Pokud máte samostatný program, tak jej spusťte ze souboru Daskalos.exe. Po spuštění VisualWorks pomocí menu spustíme DASKALOS (Tools Daskalos object modeling tutor) viz. obrázek níže. Poznámka: Prostředí DASKALOS je k dispozici i jako samostatně spustitelná aplikace, lze ji získat bezplatně z webových stránek: http://kii.pef.czu.cz/~merunka/documents/ 2.3 Vytvoření nového projektu Objeví se základní obrazovka prostředí DASKALOS (jde o první záložku Project). Zde vytvoříme nový projekt který pojmenujeme eshop a vyplníme příslušné údaje (to je důležitá část každého projektu, protože bez dokumentace je každý podobný projekt k ničemu) viz. obrázek níže.
Je tu dále možnost uložení projektu - Save to file (to doporučuji dělat průběžně) a případně později možnost otevřít projekt Load from file a smazat projekt Delete project. 2.4 Vytváření tříd Přepneme se do druhé záložky Classes. Zde budeme postupně vytvářet třídy, které jsme si již navrhly na začátku (viz. nadpis 1.3). Tlačítkem Create new class vytvoříme třídu Subjekt (tato třída je předchůdcem tříd Zákazník a Dodavatel). Dále vytvoříme třídu Dodavatel, protože je tato třída potomkem třídy Subjekt musí zůstat třída Subjekt během vytváření této třídy zamodřena (v opačném případě by nově vzniklá třída nebyla potomkem) viz. obrázek níže.
Analogicky budeme postupovat i při tvorbě dalších (zbývajících) tříd. 2.5 Vytváření atributů Ve chvíli, kdy už máme vytvořeny (definovány) všechny potřebné třídy, je čas k jejich naplnění atributy, které jsme si také definovali na začátku (viz. nadpis 1.3). Nejprve přistoupíme k plnění atributy u třídy Subjekt. Třídu Subjekt označíme (zamodříme) a klikneme na tlačítko Add inst.var., do řádku napíšeme Mesto a klikneme na OK, dale se objevý dialog ve kterém vybereme že tento atribut je typu String a klineme na OK. Takto budeme postupovat i u dalších atributů ve všech třídách. Důležité je aby dva atributy Dodano a Zakoupeno ve třídách Dodavatel a Zákazník byly typu Set (později uvidíme proč). Proces vytváření atributů je vidět na následujícím obrázku.
2.6 Vytváření instancí Nyní máme vytvořeny potřebné třídy a jejich atributy. Můžeme tedy začít s vytvářením konkrétních objektů (instancí) konkrétních tříd. Nacházíme se stale na druhé záložce Classes. Označíme (zamodříme) si třídu Zbozi a klikneme na tlačítko New instance, otevře se nám nové okno (instance třídy Zbozi). Nyní můžeme editovat jednotlivé atributy této instance. Opět označíme atribut, jehož hodnotu chceme změnit z počátečního nastaveni nil na nějakou konkrétní námi definovanou hodnotu. Například změníme hodnotu u atributu seriove_cislo, viz. následující obrázek.
Hodnoty (nil) ostatních atributů pak doporučujeme také změnit, abychom doopravdy pracovali s konkrétními objekty. Postačí nám vytvořit si (analogicky) řádové 2-3 objekty pro každou třídu (kromě třídy Subjekt jejíž atributy dědí třídy Dodavatel a Zakaznik). Určitě při postupném plnění objektů (instance) údaji narazíme na atribut dodano (je typu Set) ve třídě Dodavatel a atribut zakoupeno (Set) ve třídě Zakaznik. Tyto dva atributy v sobě jako hodnoty nesou uloženy množinu (Set) jiných objektů, v našem případě konkrétních objektů (instance) třídy Zbozi. Jak docílit naplnění hodnot těchto atributů jinými objekty si nyní předvedeme. Připravíme si okénka s instancemi objektů Zbozi a Zakaznik. V instance zakaznika si označíme (zamodříme) atribut zakoupeno a nyní pomocí drag-drop klikneme na :Zbozi držíme a přetáhneme na atribut zakoupeno v instanci zákazníka. Výsledek akce je znázorněn na následujícím obrázku. Nyní máme instanci zákazníka který si zakoupil konkrétní instanci třídy Zbozi. Ten proces vytváření instancí a jejich plnění údaji, který jsme právě probrali lze provést ještě jedním alternativním a možná pro mnohé příjemnějším způsobem, který si ukážeme v následující části. 2.7 Vytváření skriptů Přepneme se do záložky Script. Tato část prostředí DASKALOS slouží pro tvorbu vlastních skriptů, mohli bychom říci, že se jedná o jakýsi příkazový řádek.
Ukažme si nyní stejný proces, který jsme prováděli v předchozí části (viz. nadpis 2.6). Vytvoříme si instance tříd eshopu pomocí vlastního skriptu. Námi vytvořený skript bude vypadat například takto (můžeme použít i notepad apod.): Začátek skriptu. Zboziset:= Set new. Dodavatelset:= Set new. Zakaznikset:= Set new. Reklamaceset:= Set new. R_1:= Reklamace new. R_1 cislo_reklamace: '112'; datum_prijeti:'10-10-2006' asdate; popis_reklamace:'vadny HDD'. Reklamaceset add: R_1. V_1:=Zbozi new. V_1 seriove_cislo:'374897' asnumber; nazev:'hppc5100'; cena:'15000' asnumber; popis:'pc'; datum_nakupu:'7-1-2006' asdate; datum_prodeje:'9-1-2006' asdate. Zboziset add: V_1. V_2:=Zbozi new. V_2 seriove_cislo:'998797' asnumber; nazev:'asusxlt9050'; cena:'30000' asnumber; popis:'notebook'; datum_nakupu:'3-1-2006' asdate; datum_prodeje:'11-2-2006' asdate. Zboziset add: V_2. D_1:=Dodavatel new. D_1 nazev:'alzasoft'; ico:'9976571'asnumber; mesto:'praha'; ulice:'holesovicka'; cp:'66' asnumber; psc:'16000' asnumber; zeme:'cz'; email:'alza@alza.cz'; telefon:'602333666' asnumber. D_1 dodano add:v_1. Dodavatelset add: D_1. Z_1:=Zakaznik new. Z_1 login_informace:'1a66'; prijmeni:'papik'; jmeno:'martin'; datum_nakupu:'9-1-2006' asdate;
mesto:'roztoky'; ulice:'borivojova'; cp:'1789' asnumber; psc:'26200' asnumber; zeme:'cz'; email:'papik@seznam.cz'. Z_1 zakoupeno add:v_1. Zakaznikset add: Z_1. Z_2:=Zakaznik new. Z_2 login_informace:'1b7a66'; prijmeni:'paces'; jmeno:'matej'; datum_nakupu:'9-1-2006' asdate; mesto:'roztoky'; ulice:'borivojova'; cp:'1789' asnumber; psc:'26200' asnumber; zeme:'cz'; email:'mates@seznam.cz'. Zakaznikset add: Z_2. Konec skriptu. Tento skript spustíme pomocí tlačítka Perform script (viz obrázek). Nyní se přepneme do záložky Objects. Zde můžeme vidět námi vygenerované instance. Pokud označíme (zamodříme) v seznamu Work variables v pravé horní části například instance Z_1 (instance zákazníka) a poté označíme v dolní části záznam s jeho atributy a klikneme na tlačítko Browse elements ukáže se nám opět okénko s
instancí objektu na které jsme byli zvyklí z předchozího textu (viz následující obrázek). 2.8 Zadání dotazu Přepneme se do záložky Objects. Budeme chtít vytvářet vlastní dotazy nad existujícími instancemi (daty našeho modelu). To budeme dělat pomocí Workspace (levá horní část okna). Sestavme si dotaz, kterým zjistíme co si zakoupil zákazník s určitým příjmením příjmením. Dotaz napíšeme do Workspace a bude vypadat následovně: ((Zakaznikset select: [:x x prijmeni='papik' ]) collect: [:x x zakoupeno]) flatten collect: [:x x seriove_cislo]. Dotaz označíme (zamodříme) a klikneme na tlačítko Do it, poté obdržíme v dolní části okna výsledek, který je správně (viz. obrázek níže). V případě dalších dotazů postupujeme analogicky. Dalším dotazem zjistíme jaká je cena (suma) všech obchodem nakoupených výrobků: (Zboziset collect:[:x x cena]) inject: 0 into: [:sum :int sum+int]. Poslední jednoduchým dotazem vyhledáme všechny zákazníky jejichž jméno je Martin : (Zakaznikset select:[:x x jmeno = 'Martin' ]).
3. Daskalos automaticky generované výstupy 3.2 Class diagram Přepneme-li se do záložky Diagram, uvidíme class diagram (diagram tříd). Jedná se o automaticky generovaný diagram, který se vytváří postupně, jak procházíme všechny předešlé kroky. U našeho příkladu eshop se pochopitelně také vytvořil class digram, pomocí drag-drop si ho můžeme libovolně přizpůsobit (vazby se překreslují automaticky). Diagram našeho příkladu můžeme vidět níže.
3.3 HTML dokumentace Přepneme-li se do záložky Project a provedeme uložení projektu pomocí stisknutí tlačítka Save to file, automaticky se při každém uložení vytváří i html dokumentace. Najdeme si adresář do kterého jsme proveli uložení projektu a uvidíme čtyři soubory (eshop.gif, ehop.st, eshop.xml, shop.html). Dokumentace se skrývá pod po eshop.html. Tuto dokumentaci pak použijete jako základ Vašeho semestrálního projektu (dokumentace je součástí přílohy tohoto článku).
4. Příloha dokumentace eshop.html eshop author(s): Martin Papik Objetový datový model internetového obchodu (eshopu) zamereného na výpocetní techniku. Uchovává následující informace : " Informace o zboží. " Informace o dodavatelích. " Informace o zákaznících. " Informace o reklamacích. Trídy v tomto datovém modelu použijeme : " Trída ZBOŽÍ uchovává evidence zboží (výrobku) které nabízíme v našem eshopu. Bude obsahovat následující atributy : Seriové_císlo, Název, Cena, Popis, Datum_nakupu, Datum_prodeje. " Trída DODAVATEL uchovává informace o našich dodavatelích. Bude obsahovat následující atributy : Nazev, Ico, Dodano. " Trída ZÁKAZNÍK uchovává informace o našich zákaznících (odberatelích). Bude obsahovat následující atributy: Login_informace, Príjmení, Jméno, Datum_nakupu, Zakoupeno. " Trída REKLAMACE uchovává informace o reklamovaném (vrácenném) zboží. Bude obsahovat následující atributy: Cislo_reklamace, Datum_prijeti, Popis_problemu. " Dále je nutné vytvorit trídu SUBJEKT, která bude predchudcem tríd Zákazník a Dodavatel (resp. tyto dve trídy jsou jejími potomky). Tato trída uchovává infomace o adresách a kontaktech. Bude obsahovat atributy: Mesto, Ulice, Cp, Psc, Zeme, Email, Telefon, Fax. Workspace ((Zakaznikset select: [:x x prijmeni='papik' ]) collect: [:x x zakoupeno]) flatten collect: [:x x seriove_cislo]. (Zboziset collect:[:x x cena]) inject: 0 into: [:sum :int sum+int]. (Zakaznikset select:[:x x jmeno = 'Martin' ]).
Workspace Objects Dodavatelset :Set Reklamaceset :Set Zakaznikset :Set Zboziset :Set D_1 :Dodavatel R_1 :Reklamace V_2 :Zbozi Z_1 :Zakaznik Z_2 :Zakaznik Script Zboziset:= Set new. Dodavatelset:= Set new. Zakaznikset:= Set new. Reklamaceset:= Set new. R_1:= Reklamace new. R_1 cislo_reklamace: '112'; datum_prijeti:'10-10-2006' asdate; popis_reklamace:'vadny HDD'. Reklamaceset add: R_1. V_1:=Zbozi new. V_1 seriove_cislo:'374897' asnumber; nazev:'hppc5100'; cena:'15000' asnumber; popis:'pc'; datum_nakupu:'7-1-2006' asdate; datum_prodeje:'9-1-2006' asdate. Zboziset add: V_1. V_2:=Zbozi new. V_2 seriove_cislo:'998797' asnumber; nazev:'asusxlt9050'; cena:'30000' asnumber; popis:'notebook'; datum_nakupu:'3-1-2006' asdate; datum_prodeje:'11-2-2006' asdate. Zboziset add: V_2. D_1:=Dodavatel new. D_1 nazev:'alzasoft'; ico:'9976571'asnumber; mesto:'praha'; ulice:'holesovicka'; cp:'66' asnumber; psc:'16000' asnumber; zeme:'cz'; email:'alza@alza.cz';
telefon:'602333666' asnumber. D_1 dodano add:v_1. Dodavatelset add: D_1. Z_1:=Zakaznik new. Z_1 login_informace:'1a66'; prijmeni:'papik'; jmeno:'martin'; datum_nakupu:'9-1-2006' asdate; mesto:'roztoky'; ulice:'borivojova'; cp:'1789' asnumber; psc:'26200' asnumber; zeme:'cz'; email:'papik@seznam.cz'. Z_1 zakoupeno add:v_1. Zakaznikset add: Z_1. Z_2:=Zakaznik new. Z_2 login_informace:'1b7a66'; prijmeni:'paces'; jmeno:'matej'; datum_nakupu:'9-1-2006' asdate; mesto:'roztoky'; ulice:'borivojova'; cp:'1789' asnumber; psc:'26200' asnumber; zeme:'cz'; email:'mates@seznam.cz'. Zakaznikset add: Z_2.
Diagram Classes Subjekt instance variables cp :Number email :String fax :Number mesto :String psc :Number telefon :Number ulice :String zeme :String methods
cp cp: email email: fax fax: initialize mesto mesto: psc psc: telefon telefon: ulice ulice: zeme zeme: code of non-accessing methods: initialize "generated by Daskalos" super initialize. mesto := nil. ulice := nil. cp := nil. psc := nil. zeme := nil. email := nil. telefon := nil. fax := nil. Zbozi instance variables cena :Number datum_nakupu :Date datum_prodeje :Date nazev :String popis :String seriove_cislo :Number methods cena cena: datum_nakupu datum_nakupu: datum_prodeje datum_prodeje: initialize nazev nazev: popis popis:
seriove_cislo seriove_cislo: code of non-accessing methods: initialize "generated by Daskalos" super initialize. seriove_cislo := nil. nazev := nil. cena := nil. popis := nil. datum_nakupu := nil. datum_prodeje := nil. Reklamace instance variables cislo_reklamace :String datum_prijeti :Date popis_reklamace :String methods cislo_reklamace cislo_reklamace: datum_prijeti datum_prijeti: initialize popis_reklamace popis_reklamace: code of non-accessing methods: initialize "generated by Daskalos" super initialize. cislo_reklamace := nil. datum_prijeti := nil. popis_reklamace := nil. Dodavatel instance variables dodano :Set ico :Number nazev :String methods dodano ico ico: initialize nazev
nazev: code of non-accessing methods: initialize "generated by Daskalos" super initialize. nazev := nil. ico := nil. dodano := Set new. Zakaznik instance variables datum_nakupu :Date jmeno :String login_informace :String prijmeni :String zakoupeno :Set methods datum_nakupu datum_nakupu: initialize jmeno jmeno: login_informace login_informace: prijmeni prijmeni: zakoupeno code of non-accessing methods: initialize "generated by Daskalos" super initialize. login_informace := nil. prijmeni := nil. jmeno := nil. datum_nakupu := nil. zakoupeno := Set new. Links Data file and class source. Generated by Daskalos - Object Modeling Tutor (C) 2006 V. Merunka February 2, 2007