Semestralni_prace_Taxisluzba

author(s): Vladimír Říha

Tématem mé práce je Taxislužba.

Taxislužba má nějaké příjmy, výdaje (obojí se bude počítat pomocí metod) a zisk (rozdíl příjmů a výdajů). Samozřejmě má také pracovníky, kteří se dělí na řidiče a úřednici (všichni ostatní - neřidiči), a adresu (adresu centrály). Pomocí metody pocetAut a pocetZamestancu lze zjistit, kolik má daná firma vozidel a pracovníků. Má také vlastní ceník, pomocí něhož se budou počítat ceny jednotlivých jízd (rit) a dále pomocí Jízdních nákladů (Jizdni_naklady) se spočítají náklady na každou jízdu. Tyto příjmy a náklady pak budou použity pro výpočet zmíněných příjmů a výdajů dané taxislužby.

Zaměstnanci se dělí na úředníky a řidiče. Každý úředník má oproti řidiči popis práce. Řidič pak má vůz, spadá pod stanoviště (kde čeká na zákazníky) a je uveden u každého rita (zakázky) pro případné dohledání.

Stanoviště mají jako vlastnosti data, od kterých a po které má firma licenci na tato místa (může tam mít své zaměstnance).
______________________________________________________________________________________________________________
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Navrhove vzory

Protoze nemam zadne zkusenosti, jak delat navrhove vzory, pokusim se sem jako "laik" napsat par uvah, jake vzory by se teoreticky mohly pouzit.

Singleton - tvorivy vzor
Na obekt tridy Taxisluzba by se mozna dal pouzit navrhovy vzor Singleton. Jestli jsem spravne na cviceni z Javy pochopil singleton, pak ho lze pouzit tehdy, kdyz chci vytvorit pouze jeden objekt dane tridy. Protoze se jedna o model taxisluzby, tak by bylo asi dobre mit pouze jeden objekt tridy Taxisluzba, abych tak zamezil pripadnym problemum.

Dekorator (Decorator) - strukturalni vzor
Hodil by se pro reseni problemu Ridic - Zamestnanec - Urednik. Jako "Komponenta" by se urcil Zamestnanec, pote bychom mu mohli pridavat protokoly bud pro Ridice nebo Urednika.

Stav (State) - behavioralni vzor
Konkretne by se dal pouzit pro vztah Taxisluzba - Vyhlaska. Protoze objekty tridy Vyhlaska se budou casem menit (mesto je upravi). Vyhlaska by tedy byla "vnorenym objektem" a hlavni informace by byly v objektu Taxisluzba.

______________________________________________________________________________________________________________
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Normalizace

1) Urcite jsem neudelal vhodne system Ridic - Zamestnanec - Urednik.
Zamestnanec totiz "nezna" zamestnavatele. To napr. zpusobuje, ze kdyz chci propustit nejakeho zamestnance, musim pak propustit (upravit promennou zamestnavatel) ridice nebo urednika, coz ale zase nezpusobi zmenu promennych u objektu Zamestnanec, cili je pak treba to udelat zdlouhave a slozite jinak. Musel jsem tedy zdlouhave menit asociace mezi tridami. Zde by se hodil vice system Osoba (misto Zamestnanec) s potomky Ridic a Urednik. Osoba by znala sveho Zamestnavatele, cili by tuto promennou zdedil i Ridic a Urednik. Protoze jsem to udelal pomoci "skladani", tak abych se alespon priblizil funkcnosti s dedenim, musel bych do tridy Zamestnanec dat promennou zamestnavatel. Tim bych ale zase zbytecne duplikoval data, protoze tato promenna je jiz u Ridice a Urednika. Odtud bych ji mohl teoreticky smazat, ale pak bych nemohl propustit napr. 2 ridice, protoze bych nezjistil, jestli propoustim ridice nebo urednika (trida Zamestnanec nema promenne, ktere by to symbolizovaly)

2) Nevim, jestli nasledujici problem resi normalizace, ale jedna o problem funkcnosti. Ma-li ridic zakaznika (Rito), pak se pozna, kterym vozem byl svezen. Problem ale nastane, kdyz ridic zmeni automobil, cili u vsech jeho predchozich klientu to bude vypadat, ze je vezl novym autem, coz neni pravda. Chtelo by to udelat napr. novou promennou "Vozem" (typu Object) ve tride Rito, kam by se navic vkladalo, kterym autem se jelo. Pak by ale opet doslo k duplikaci dat, protoze to lze zjistit dotazem pres objekt tridy Ridic, ktery ma promennou "vuz", cili by se opet nejednalo o normalizovane reseni. Teoreticky by slo pridat do Rito promennou String nazvanou "vozem", kam by se muselo rucne napsat typ vozu. To by ale zase nebylo moc flexibilni ani pohodlne.

3) Stejny problem jako u druheho bodu nastane v pripade, ze propustime ridice. Zakaznik (Rito) bude vedet, kdo ho vezl, ale kdyz ridice zamestna jina taxisluzba, bude to vypadat, ze vsechny Rita vezl jen u nove taxisluzby. Mozne reseni je dat do tridy Rito promennou typu Object, ktera by zastupovala zamestnavatele ridice (ale nesmela by se vkladat pres Ridice, ale primo jako Taxisluzba).

4) Nejsem si jisty, ale asi by slo upustit od promenne "pouzivana stanoviste" ve tride Taxisluzba, protoze to vlastne ukazuje to same, co u tridy Ridic promenna "stanoviste". Slo by pouze udelat sber vsech stanovist u ridicu, jejichz zamestnavatelem je dana Taxisluzba. Pak by ale mohl nastat problem, ze ridic by byl na stanovisti cizi taxisluzby a nikdo by to nepoznal. Takze v ramci normalizace by bylo lepsi to zmenit, ale kvuli zachovani funkcnosti bych to ponechal tak, jak to je.

5) Opet podobny problem jako v bude 2 a 3. Rito ma promenne symbolizujici prijmy a vydaje za rito. Ty se ale pocitaji podle ceniku, ktery kdyz zmenim, tak by to zmenilo vsechna stara i budouci rita (uskutecnena pred a po zmene ceniku). Zde by melo stacit dat ve tride Taxisluzba u promenne cenik typ Set. Pak bychom mohli mit vice ceniku.
_____________________________________________________________________
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Scenare

Jedna se o takovou malou simulaci zivotniho cyklu imaginarni taxisluzby.
_______________________________________________________
Scenar 1

Chceme zamestnat ridice do konkretni taxisluzby. Je treba, aby ridic mel vlastni auto.
Prikazy:
1) Musime vytvorit instanci tridy Zamestnanec s parametry, ktere jsou potreba (jmeno, prijmeni...). Budeme predpokladat, ze jiz existuje nejaka taxisluzba (objekt tridy Taxisluzba), ze existuji nejaci jeji zamestnanci (alespon 1 objekt tridy Urednik).

2) provedem prikaz "najmiRidice", ktery ma definovany objekt tridy Urednik.
najmiRidice: RidicA doFirmy: taxiA iNezamestnaneho: BezPraceA
2.1) Nejprve se zkontroluje, zda je Urednik sef, cili ma v popisu prace Sef.
^self popis_prace = 'Sef'
2.2) Pak se zkontroluje, zda je ridic jiz zamestnant u jine firmy (muze byt zamestnan u "abstraktni" tridy BezPrace).
RidicA zamestnavatel = nil | (RidicA zamestnavatel = BezPraceA)
2.3) Jestlize ne, pak pokracuje ve svem vykonavani.
self zamestnavatel = taxiA
2.4) Jinak vyhodi vyjimku (error). Nasledne je treba, aby mel ridic vlastni auto.
(RidicA vuz = nil) not
2.5) Je-li to splneno, je ridic zamestnan u dane taxisluzby.
RidicA zamestnavatel: taxiA

_______________________________________________________
Scenar 2

Chceme ridice priradit na nejake stanoviste.
Prikazy:
1) Objekt tridy Urednik vykona prikaz pridejRidice... naStanoviste. To lze jen tehdy, pokud neni ridic u jineho ridice.
pridejRidice: ridicA naStanoviste: s1
^ridicA stanoviste = nil
ifTrue: [ridicA stanoviste: s1]
ifFalse: [self error: 'Ridic se uz nachazi na nejakem stanovisti']
_______________________________________________________
Scenar 3

Jiz mame zamestnaneho ridice u taxisluzby a priradili jsme ho na nejake stanviste. Nyni mu priradime zakaznika (rito). To ma na starost opet urednik.
Prikazy:
1) Urednik s popisem prace "Dispece" vykona metodu priradRito...ridici...seStatusem. Pokud se nejedna o dispecera, pak nastane chyba, protoze jen dispecer je natolik zdatny, aby tento ukol zvladnul.
priradRito: ritoA ridici: ridicA seStausem: s1
^self popis_prace = 'Dispecer'

2) Je treba overit, ze ridic neveze zrovna zakaznika.
2.1) Je treba overit metodu promenne jedeZrovnaJizdu u daneho ridice.
ridicA jedeZrovnaJizdu = 0

3) Pokud neveze zakaznika, pak se u daneho ridice provede metoda noveRito.
3.1) metoda noveRito priradi ridici noveho zakaznika
ifTrue:
[ridicA noveRito: ritoA.

4) Dale musime "rici" danemu ritu (objektu tridy Rito), ktery ridic se o neho "postara" pomoci metody tridy Rito priradRidice
4.1) metoda priradRidice pak nastavi u daneho rita promennou ridic na hodnotu zastupujici daneho ridice (typ Object, trida Ridic)
ritoA priradRidice: ridicA.

5) Nyni je treba oznacit ridice jako "obsazeneho".
5.1) Pomoci metody tridy Ridic nazvane mamZakaznika zmenime hodnotu promenne jedeZrovnaJizdu.
ridicA mamZakaznika: s1
_______________________________________________________
Scenar 4

Ridic dovezl daneho zakaznika na misto, kam si to pral. Je povinnen to nyni dat najevo, cili zmenit hodnotu sve promenne jedeZrovnaJizdu.

Prikazy:
1) Ridic na sebe zavola metodu vysadilZakaznika, ktera zmeni potrebnou hodnotu promenne.
vysadilZakaznika: statusA
^self jedeZrovnaJizdu: statusA
_______________________________________________________
Scenar 5

Protoze je ridic znamenitym pracovnikem, zamestnavatel se rozhodl mu zmenit plat. Tento ukon udela objekt tridy Urednik, muze to udelat ale jen Ucetni.

Prikazy:
1) Je treba overit, ze dany urednik ma v popisu prace, ze je ucetni
ZamestnanciRidici: ridic zmenPlat: naCastku
^popis_prace = 'Ucetni'

2) Neni mozne, aby urednika taxisluzbyA menil plat ridici taxisluzbyB, cili je treba zkontrolovat, zda maji spol. zamestnavatele
ifTrue:
[zamestnavatel = ridic zamestnavatel
3) Nyni jiz nic nebrani, aby byl plat ridice zmenen.
ifTrue: [ridic ridic mzda: naCastku]
_______________________________________________________
Scenar 6

Taxisluzba hodne vydelava, ale jejimu sefovi to nestaci. Rozhodl se zvysit cenik. Ten ale musi byt v souladu s vyhlaskou daneho mesta. Zde ma zdrazeni na starosti samotna taxisluzba.

Prikazy:
1) Musime zkontrolovat, zda pozadovane hodnoty, o ktere se ma cenik zmenit, jsou v souladu s vyhlaskou. Pokud byt jen jedna z nich prekracuje meze dane vyhlaskou, pak nemuze ke zdrazeni dojit.
zdrazujeme: cenaKm rovnez: cenaMin spolus: CenaN

cenaKm <= cenik vSouladuSVyhlaskou cenaZaKm
ifTrue:
[cenaMin <= cenik vSouladuSVyhlaskou cenaMinutaCek
ifTrue:
[CenaN <= cenik vSouladuSVyhlaskou cenaNastup
ifTrue:
[cenik cenakm: cenaKm.
cenik cena_min_cekani: cenaMin.
cenik cena_nastupni: CenaN]
ifFalse: [self error: 'Nepripustne zdrazeni']]
ifFalse: [self error: 'Nepripustne zdrazeni']]
ifFalse: [self error: 'Nepripustne zdrazeni']
_______________________________________________________
Scenar 7

Bohuzel doslo ke zdrazeni nafty (napriklad nejaky ten hurikan ponicil rafinerii, nebo jen sejkove pritahli kohoutky. Nebo zlobivy Putin trucuje, protoze nechce radar v Cesku). Je tedy treba zmenit jizdni naklady, pricemz je hloupe je menit na stavajici hodnoty...

Prikazy:
1) Objekt tridy Jizdni_naklady provede prislusnou metodu
zmenitNaklady: castka1 spolu: castka2
^self amortizace_KcZaKm = castka1
ifTrue:
[benzinKcZaKm = castka2
ifTrue: [self error: 'Menis naklady na stavajici hodnoty, hloupe...']
ifFalse: [self benzinKcZaKm: castka2]]
ifFalse:
[benzinKcZaKm = castka2
ifFalse:
[self amortizace_KcZaKm: castka1.
self benzinKcZaKm: castka2]
ifTrue: [self error: '@!Menis naklady na stavajici hodnoty, hloupe...']]
_______________________________________________________
Scenar 8

Ridic neni spokojen se svym postavenim ve firme (napr. sexualni obtezovani sekretarky nebo asistenta reditele...) a rozhodne se dat vypoved. Tu musi podat svemu zamestnavateli

Prikazy:
1) Pokud opravdu podava vypoved svemu zamestnavateli....
ridici: ridicA dejVypoved: Zamestnavateli presUrednika: Urednik1 aNechSeVyhodit: BezPraceA
^self zamestnavatel = Zamestnavateli
2) Pak ji podava pres urciteho urednika, ktery ji musi zpracovat
ifTrue: [Urednik1 zpracujVypoved: ridicA aVyhodHo: BezPraceA]

--> zpracujVypoved: ridicA aVyhodHo: BezPraceA
3) Pokud je dany urednik sefem, pak ridice bez sebemensich okolku vyhodi
^self popis_prace = 'Sef'
ifTrue:
[ridicA zamestnavatel: BezPraceA.
ridicA ridic: nil.
ridicA stanoviste: nil]
ifFalse: [self error: 'Jen Sef muze podepsat vypoved']



Workspace

"vypise ridice, kteri jsou na prvnim stanovisti"
Ridici select: [:v | v stanoviste=stanoviste1].

"vypise ridice, kteri maji automobil znacky Skoda"
Ridici select: [:c | c vuz vyrobce='Skoda'].

"vypise zamestnance z Prahy"
(Zamestnanec allInstances) select: [:h | h adresa mesto='Praha' ].

"Snaha o nalezeni zamestnance se jmenem Franta a prijmenim Novak"
(Zamestnanec allInstances) select:  [:n | (n jmeno='Franta') & (n prijmeni='Novak').]

"Snaha o nalezeni ridice, ktery sidli na 2 stanovistich, coz nelze"
(Ridici select:[:a | (a  stanoviste=stanoviste1) & (a stanoviste=stanoviste2) ]) collect: [:q | q ridic jmeno] with:[:q | q ridic prijmeni].

"najdi taxisluzbu, ktera ma predrazene ceny (coz se nesmi, protoze to vyhlaska zakazuje)"
(Taxisluzba allInstances select: [:w | (w cenik cenakm=120)  |  (w cenik cena_nastupni=120) | (w cenik cena_min_cekani=120)]) collect: [:e | e jmeno].

"Napise jmeno a prijmeni vsech ridicu z Prahy a poznavaci znacku jejich vozidel"
(Ridici select: [:a | a ridic adresa mesto='Praha' ]) collect: [:q | q ridic jmeno] with:[:q | q ridic prijmeni] with: [:q | q vuz spz].

"Hledani ridice dle id"
(Ridici select: [:a | a ridic id=1002]) collect: [:s | s ridic jmeno] with: [:r | r ridic prijmeni].

"jaky model automobilu ma ridic s danym id"
((Ridici select: [:a | a ridic id=1002]) collect: [:s | s  vuz]) flatten collect: [:r | r model].

"Celkovy zisk"
((Rito allInstances) collect:[:s | s zisk]) inject: 0 into: [:a :b|a+b].

"Celkove prijmy za vsechny rita"
((Rito allInstances) collect:[:s | s prijmyZaJizdu]) inject: 0 into: [:a :b|a+b].

"Celkove vydaje za vsechny rita"
((Rito allInstances) collect:[:s | s vydajeZaJizdu]) inject: 0 into: [:a :b|a+b].

"Vypsani a serazemi zamestnancu dle prijmeni"
(Zamestnanec allInstances) asList sortBy: [:a | a prijmeni].

"Vypsani a serazemi zamestnancu dle prijmeni, vypsani spolu s mestem, kde bydli"
((Zamestnanec allInstances) asList sortBy: [:a | a prijmeni]) collect:[:i | i id] with: [:f | f prijmeni] with: [:d | d jmeno] with: [:s | s adresa mesto].


"vypise ridice s vozy skoda na stanovisti1"
Ridici select: [:c | (c vuz vyrobce='Skoda') & (c stanoviste=stanoviste1)].

"vypise , kolik ma stanoviste ridicu"
(Ridic allInstances select: [:c | c stanoviste adresa =stanoviste1 adresa]) size.

"vypsani vsech ridicu taxisluzby"
Ridici select: [:c | c zamestnavatel=taxi1].

"nalezeni vsech uredniku s danym popisem prace"
Urednici select: [:c | c popis_prace='Dispecer'].

"Vypise ridice pracujici u firmy na adrese "adr9", jejich jmeno, prijmeni a adresu stanoviste"
(Ridici select: [:c | c zamestnavatel adresa=adr9]) collect: [:s | s ridic jmeno] with: [:i | i ridic prijmeni] with: [:t | t stanoviste adresa ulice].

"najit ridice, kteri na jizde vydelali 97Kc, vypsat jeho jmeno a prijmeni"
(Rito allInstances select:[:c | c zisk=97 ]) collect: [:a | a ridic ridic jmeno] with:[:v | v ridic ridic prijmeni].

"najit taxisluzbu, pro kterou pracuje ridic Robinette Brodehead - mimochodem v serii knih o Gateway (nekolik cen Hugo a Nebula) od Frederika Pohla miliardar a majitel nekolika vesmirnych lodi"
(Ridici select: [:b | b ridic jmeno='Robinette']) collect: [:s | s zamestnavatel jmeno].

rito10:=Rito new z_mista:'Melnik'; do_mista:'Praha'; vzdalenost_km:29; cekani_min:5; dle_ceniku: cenik1; jizdniNaklady: naklady.
urednik2 priradRito: rito8 ridici: ridic3.

rito12:=Rito new z_mista:'Kralupy'; do_mista:'Praha'; vzdalenost_km:19; cekani_min:2; dle_ceniku: cenik1; jizdniNaklady: naklady.
urednik1 priradRito: rito12 ridici: ridic6.

ridic6:=Ridic new.
auto6:=Automobil new id:106; vyrobce:'BMW'; model:'635i'; rok_vyroby:2006; spz:'2E30107'; technicka_kontrola:2007.

urednik1 pridejRidice: ridic5 naStanoviste: stanoviste2.
urednik1 pridejRidice: ridic5 naStanoviste: stanoviste2.

urednik3 :=Urednik new.

urednik3 najmiRidice: ridic6 doFirmy: taxi1.
urednik1 priradRito: rito9 ridici: ridic5.

urednik1 priradRito: rito8 ridici: ridic6.
osoba9:=Zamestnanec new.
auto7:=Automobil new id:106; vyrobce:'Opel'; model:'Zafira'; rok_vyroby:2006; spz:'2E30107'; technicka_kontrola:2007.

ridic6 vysadilZakaznika: 0.
taxi2:=Taxisluzba new.
urednik3 najmiRidice: ridic6 doFirmy: taxi2. 

urednik2 ZamestnanciRidici: ridic6 zmenPlat: 3000. 
VisualLauncher open.

taxi1 zdrazujeme: 40 rovnez: 20 spolus: 20. 
naklady zmenitNaklady: 30 spolu: 20. 

urednik1 priradRito: rito2 ridici: ridic3 seStausem: 1.

urednik3 najmiRidice: ridic7 doFirmy: taxi1. 
urednik1 pridejRidice: ridic7 naStanoviste: stanoviste1.

ridic5 ridici: ridic5 dejVypoved: taxi1 pomoci: urednik3. 
ridic5 ridici: ridic5 dejVypoved: taxi1 presUrednika: urednik3 aNechSeVyhodit: BezPrace1. 
urednik3 najmiRidice: ridic5 doFirmy: taxi1 iNezamestnaneho:BezPrace1.
vyhlaska1:=Vyhlaska new.
taxi1 zdrazujeme: 50 rovnez: 30 spolus: 46.

Workspace Objects



Script

"Vytvoreni zamestnancu"
osoba1:= Zamestnanec new.
osoba2:= Zamestnanec new.
osoba3:= Zamestnanec new.
osoba4:= Zamestnanec new.
osoba5:= Zamestnanec new.
osoba6:= Zamestnanec new.

Ridici:= Set new.

ridic1 := Ridic new.
Ridici add: ridic1.
ridic3 := Ridic new.
ridic2 := Ridic new.

Ridici add: ridic2.
Ridici add: ridic3.

Urednici:= Set new.
urednik1:=Urednik new.
urednik2:=Urednik new.

Urednici add: urednik1; add: urednik2.

taxi1:=Taxisluzba new.

Taxisluzby:= Set new.
Taxisluzby add:taxi1.

Adresy:=Set new.
adr1:=Adresa new.
adr2:=Adresa new.
adr3:=Adresa new.
adr4:=Adresa new.
adr5:=Adresa new.
adr6:=Adresa new.
adr7:=Adresa new.
adr8:=Adresa new.
adr9:=Adresa new.
adr10:=Adresa new.

Adresy add:adr1;add:adr2;add:adr3;add:adr4;add:adr5;add:adr6;add:adr7;add:adr8;add:adr9;add:adr10.

StanovisteSet :=Set new.
stanoviste1:=Stanoviste new.
stanoviste2:=Stanoviste new.

StanovisteSet add:stanoviste1; add:stanoviste2.

Automobily:=Set new.
auto1:=Automobil new.
auto2:=Automobil new.
auto3:=Automobil new.

Automobily add:auto1;add:auto2;add:auto3.

Rita:=Set new.
rito1:=Rito new.
rito2:=Rito new.
rito3:=Rito new.
rito4:=Rito new.
Rita add:rito1;add:rito2;add:rito3;add:rito4.

cenik1 := Cenik new.

naklady := Jizdni_naklady new.
Zamestnanci:= Set new.
Zamestnanci add: osoba1;add: osoba2;add: osoba3;add: osoba4;add: osoba5;add: osoba6.

Ridici add:ridic6.
adr13:=Adresa new.
osoba10:=Zamestnanec new.
ridic7:=Ridic new.
auto8:=Automobil new id: 107; vyrobce: 'Dodge'; model: 'Viper'; rok_vyroby: 2005;spz: '3t51188'; technicka_kontrola:2009.


"vypise ridice, kteri jsou na prvnim stanovisti"
Ridici select: [:v | v stanoviste=stanoviste1].

"vypise ridice, kteri maji automobil znacky Skoda"
Ridici select: [:c | c vuz vyrobce='Skoda'].

"vypise zamestnance z Prahy"
(Zamestnanec allInstances) select: [:h | h adresa mesto='Praha' ].

"Snaha o nalezeni zamestnance se jmenem Franta a prijmenim Novak"
(Zamestnanec allInstances) select:  [:n | (n jmeno='Franta') & (n prijmeni='Novak').]

"Snaha o nalezeni ridice, ktery sidli na 2 stanovistich, coz nelze"
(Ridici select:[:a | (a  stanoviste=stanoviste1) & (a stanoviste=stanoviste2) ]) collect: [:q | q ridic jmeno] with:[:q | q ridic prijmeni].

"najdi taxisluzbu, ktera ma predrazene ceny (coz se nesmi, protoze to vyhlaska zakazuje)"
(Taxisluzba allInstances select: [:w | (w cenik cenakm=120)  |  (w cenik cena_nastupni=120) | (w cenik cena_min_cekani=120)]) collect: [:e | e jmeno].

"Napise jmeno a prijmeni vsech ridicu z Prahy a poznavaci znacku jejich vozidel"
(Ridici select: [:a | a ridic adresa mesto='Praha' ]) collect: [:q | q ridic jmeno] with:[:q | q ridic prijmeni] with: [:q | q vuz spz].

"Hledani ridice dle id"
(Ridici select: [:a | a ridic id=1002]) collect: [:s | s ridic jmeno] with: [:r | r ridic prijmeni].

"jaky model automobilu ma ridic s danym id"
((Ridici select: [:a | a ridic id=1002]) collect: [:s | s  vuz]) flatten collect: [:r | r model].

"Celkovy zisk"
((Rito allInstances) collect:[:s | s zisk]) inject: 0 into: [:a :b|a+b].

"Celkove prijmy za vsechny rita"
((Rito allInstances) collect:[:s | s prijmyZaJizdu]) inject: 0 into: [:a :b|a+b].

"Celkove vydaje za vsechny rita"
((Rito allInstances) collect:[:s | s vydajeZaJizdu]) inject: 0 into: [:a :b|a+b].

"Vypsani a serazemi zamestnancu dle prijmeni"
(Zamestnanec allInstances) asList sortBy: [:a | a prijmeni].

"Vypsani a serazemi zamestnancu dle prijmeni, vypsani spolu s mestem, kde bydli"
((Zamestnanec allInstances) asList sortBy: [:a | a prijmeni]) collect:[:i | i id] with: [:f | f prijmeni] with: [:d | d jmeno] with: [:s | s adresa mesto].


"vypise ridice s vozy skoda na stanovisti1"
Ridici select: [:c | (c vuz vyrobce='Skoda') & (c stanoviste=stanoviste1)].

"vypise , kolik ma stanoviste ridicu"
(Ridic allInstances select: [:c | c stanoviste adresa =stanoviste1 adresa]) size.

"vypsani vsech ridicu taxisluzby"
Ridici select: [:c | c zamestnavatel=taxi1].

"nalezeni vsech uredniku s danym popisem prace"
Urednici select: [:c | c popis_prace='Dispecer'].

"Vypise ridice pracujici u firmy na adrese "adr9", jejich jmeno, prijmeni a adresu stanoviste"
(Ridici select: [:c | c zamestnavatel adresa=adr9]) collect: [:s | s ridic jmeno] with: [:i | i ridic prijmeni] with: [:t | t stanoviste adresa ulice].

"najit ridice, kteri na jizde vydelali 97Kc, vypsat jeho jmeno a prijmeni"
(Rito allInstances select:[:c | c zisk=97 ]) collect: [:a | a ridic ridic jmeno] with:[:v | v ridic ridic prijmeni].

"najit taxisluzbu, pro kterou pracuje ridic Robinette Brodehead - mimochodem v serii knih o Gateway (nekolik cen Hugo a Nebula) od Frederika Pohla miliardar a majitel nekolika vesmirnych lodi"
(Ridici select: [:b | b ridic jmeno='Robinette']) collect: [:s | s zamestnavatel jmeno].

rito10:=Rito new z_mista:'Melnik'; do_mista:'Praha'; vzdalenost_km:29; cekani_min:5; dle_ceniku: cenik1; jizdniNaklady: naklady.
urednik2 priradRito: rito8 ridici: ridic3.

rito12:=Rito new z_mista:'Kralupy'; do_mista:'Praha'; vzdalenost_km:19; cekani_min:2; dle_ceniku: cenik1; jizdniNaklady: naklady.
urednik1 priradRito: rito12 ridici: ridic6.

ridic6:=Ridic new.
auto6:=Automobil new id:106; vyrobce:'BMW'; model:'635i'; rok_vyroby:2006; spz:'2E30107'; technicka_kontrola:2007.

urednik1 pridejRidice: ridic5 naStanoviste: stanoviste2.
urednik1 pridejRidice: ridic5 naStanoviste: stanoviste2.

urednik3 :=Urednik new.

urednik3 najmiRidice: ridic6 doFirmy: taxi1.
urednik1 priradRito: rito9 ridici: ridic5.

urednik1 priradRito: rito8 ridici: ridic6.
osoba9:=Zamestnanec new.
auto7:=Automobil new id:106; vyrobce:'Opel'; model:'Zafira'; rok_vyroby:2006; spz:'2E30107'; technicka_kontrola:2007.

ridic6 vysadilZakaznika: 0.
taxi2:=Taxisluzba new.
urednik3 najmiRidice: ridic6 doFirmy: taxi2. 

urednik2 ZamestnanciRidici: ridic6 zmenPlat: 3000. 
VisualLauncher open.

taxi1 zdrazujeme: 40 rovnez: 20 spolus: 20. 
naklady zmenitNaklady: 30 spolu: 20. 

urednik1 priradRito: rito2 ridici: ridic3 seStausem: 1.

urednik3 najmiRidice: ridic7 doFirmy: taxi1. 
urednik1 pridejRidice: ridic7 naStanoviste: stanoviste1.

ridic5 ridici: ridic5 dejVypoved: taxi1 pomoci: urednik3. 
ridic5 ridici: ridic5 dejVypoved: taxi1 presUrednika: urednik3 aNechSeVyhodit: BezPrace1. 
urednik3 najmiRidice: ridic5 doFirmy: taxi1 iNezamestnaneho:BezPrace1.
vyhlaska1:=Vyhlaska new.
taxi1 zdrazujeme: 50 rovnez: 30 spolus: 46.

Diagram


Classes

Adresa
instance variables
cislo_popisne :Number
mesto :String
psc :Number
ulice :String
methods
cislo_popisne
cislo_popisne:
initialize
mesto
mesto:
psc
psc:
ulice
ulice:

Adresa

code of non-accessing methods:

Zamestnanec
instance variables
adresa :Object
datum_naroz :Date
id :Number
jmeno :String
mzda :Number
prijmeni :String
telefon :Number
zamestnan_od :Date
methods
adresa
adresa:
datum_naroz
datum_naroz:
id
id:
initialize
jmeno
jmeno:
mzda
mzda:
prijmeni
prijmeni:
telefon
telefon:
zamestnan_od
zamestnan_od:

Kazdy zamestnanec je bud ridic nebo urednik

code of non-accessing methods:

Jizdni_naklady
instance variables
amortizace_KcZaKm :Number
benzinKcZaKm :Number
methods
amortizace_KcZaKm
amortizace_KcZaKm:
benzinKcZaKm
benzinKcZaKm:
initialize
zmenitNaklady:spolu:

Naklady na jednotlivou jizdu = Rito

code of non-accessing methods:

Automobil
instance variables
id :Number
model :String
rok_vyroby :Number
spz :String
technicka_kontrola :Number
vyrobce :String
methods
dalsiTechnickaKontrola
id
id:
initialize
model
model:
rok_vyroby
rok_vyroby:
spz
spz:
technicka_kontrola
technicka_kontrola:
vyrobce
vyrobce:

Automobil taxisluzby

code of non-accessing methods:

Rito
instance variables
cekani_min :Number
dle_ceniku :Object
do_mista :String
jizdniNaklady :Object
ridic :Object
vzdalenost_km :Number
z_mista :String
methods
cekani_min
cekani_min:
dle_ceniku
dle_ceniku:
do_mista
do_mista:
initialize
jizdniNaklady
jizdniNaklady:
prijmyZaJizdu
priradRidice:
ridic
ridic:
vydajeZaJizdu
vzdalenost_km
vzdalenost_km:
zisk
z_mista
z_mista:

Rito = jedna jizda, zakazka... Cili vyzvednuti zakaznika nekde a jeho nasledne vystoupeni jinde

code of non-accessing methods:

Stanoviste
instance variables
adresa :Object
license_do :Date
license_od :Date
methods
adresa
adresa:
initialize
license_do
license_do:
license_od
license_od:
pocetRidicu

Jedna se o stanoviste vozu taxisluzby. Kazde stanoviste ma adresu (Object), licensi platnosti od a do (Date)

code of non-accessing methods:

Urednik
instance variables
popis_prace :String
urednik :Object
zamestnavatel :Object
methods
initialize
najmiRidice:doFirmy:iNezamestnaneho:
popis_prace
popis_prace:
pridejRidice:naStanoviste:
priradRito:ridici:seStausem:
urednik
urednik:
ZamestnanciRidici:zmenPlat:
zamestnavatel
zamestnavatel:
zpracujVypoved:aVyhodHo:

Trida Urednik. Urednikem jsou vsichni, kdo nejsou ridici. Nikdo nemuze byt urednikem a ridicem zaroven. Promenna "urednik" typu Object obsahuje objekt tridy Zamestnanec

code of non-accessing methods:

Taxisluzba
instance variables
adresa :Object
cenik :Object
jizdni_naklady :Set
jmeno :String
pouzivanaStanoviste :Set
pracovnici :Set
methods
adresa
adresa:
cenik
cenik:
initialize
jizdni_naklady
jmeno
jmeno:
pocetRidicu
pocetUredniku
pouzivanaStanoviste
pracovnici
zdrazujeme:rovnez:spolus:

Reprezentuje taxisluzbu

code of non-accessing methods:

Ridic
instance variables
jedeZrovnaJizdu :Number
ridic :Object
rita :Set
stanoviste :Object
vuz :Object
zamestnavatel :Object
methods
initialize
jedeZrovnaJizdu
jedeZrovnaJizdu:
mamZakaznika:
noveRito:
ridic
ridic:
ridici:dejVypoved:presUrednika:aNechSeVyhodit:
rita
stanoviste
stanoviste:
vuz
vuz:
vysadilZakaznika:
zamestnavatel
zamestnavatel:

Ridic automobilu. Obsahuje promennou ridic typu Object, do ktere se "vklada" objekt typu Zamestnanec. Kazdy ridic ma vuz. Pokud ma ridic u jedeZrovnaJizdu jinou hodnotu nez 0, pak je obsazen a nemuze svest jineho zakaznika

code of non-accessing methods:

BezPrace
instance variables
jmeno :String
methods
initialize
jmeno
jmeno:

Trida je cista pomocna, kdyz vytvarim ridice nebo uredniky, je treba, aby meli nejakeho zamestnavatele. Tim jim bude prave trida BezPrace

code of non-accessing methods:

Vyhlaska
instance variables
cenaMinutaCek :Number
cenaNastup :Number
cenaZaKm :Number
methods
cenaMinutaCek
cenaMinutaCek:
cenaNastup
cenaNastup:
cenaZaKm
cenaZaKm:
initialize

Trida, ktera reprezentuje vyhlasku mesta o cenach taxisluzeb

code of non-accessing methods:

Cenik
instance variables
cenakm :Number
cena_min_cekani :Number
cena_nastupni :Number
vSouladuSVyhlaskou :Object
methods
cenakm
cenakm:
cena_min_cekani
cena_min_cekani:
cena_nastupni
cena_nastupni:
initialize
vSouladuSVyhlaskou
vSouladuSVyhlaskou:

Cenik taxisluzby

code of non-accessing methods:


Links

Data file and class source.

Generated by Daskalos - Object Modeling Tutor (C) 2006 V. Merunka
May 20, 2007