4it115»Hotelove Rezervace

Hotelove Rezervace

UML - hotelové rezervace

Zadání

Aplikace umožňuje rezervovat pokoje v hotelu. Rezervace pokojů jsou minimálně na den, eviduje se typ požadovaného pokoje, datum od a do, údaje o zákazníkovi a volitelně pokoj. Při rezervaci se kontroluje, zda na daný termín je pokoj/ prostředek volný. Vytvořte návrhový diagram tříd, který umožní následující případ užití.

Případ užití 1: Rezervace hotelového pokoje zájemcem
Primární aktér: zájemce o ubytování
Rozsah: aplikace
Úroveň: uživatelský cíl
Vstupní podmínky: zájemce o ubytování je na WWW stránkách hotelu

Hlavní úspěšný scénář:
1. Zájemce zvolí v menu volbu “Rezervace ubytování”

Systém vygeneruje webovou stránku s následujícími políčky pro vyplnění (hvězdičkou vyznačeny povinné údaje):
  • Typ pokoje (rozevírací seznam s nabídkou, příklady typů: jednolůžkový, dvoulůžkový, třílůžkový, bungalov),
  • Datum příjezdu,
  • Datum odjezdu,
  • Jméno
  • Příjmení
  • Ulice
  • Město
  • PSČ
  • E-mailová adresa,
  • Telefon
  • Tlačítko „Odeslat rezervaci“

2. Zájemce vyplní Typ pokoje, Datum příjezdu a Datum odjezdu,

Systém zkontroluje, zda je k dispozici volný pokoj příslušného typu v daném termínu. Pokud neexistuje, zobrazí upozornění uživateli. Stejná kontrola se provede při každé změně kterékoliv z těchto položek.

3. Zájemce vyplní políčka Jméno, Příjmení, Ulice, Město, PSČ, E-mailová adresa a Telefon. Zájemce stiskne tlačítko Odeslat rezervaci.

Aplikace zkontroluje, zda jsou zadány povinné údaje. Pokud ne, zobrazí se zpět formulář s upozorněním na povinnost vyplnit chybějící údaje. Dosud vyplněné údaje budou předem vyplněny. Pokračuje se bodem 2.
Pokud jsou údaje vyplněny povinné údaje, aplikace uloží rezervaci. Zájemci se o tom zobrazí informace a současně odešle mail s potvrzením rezervace. Zájemci se zobrazí volba „Volba konkrétního pokoje“.

4. Zájemce zvolí tlačítko „Volba konkrétního pokoje“.

Systém zobrazí seznam dostupných pokojů, které splňují podmínky z rezervace (typ pokoje, datum příjezdu a datum odjezdu),

5. Zájemce si zvolí jeden konkrétní pokoj.

Systém zaznamená k rezervaci konkrétní vybraný pokoj.

Řešení s chybami

hr01

  • Třídy Rezervace a Zákazník by bylo vhodné sloučit do jedné třídy,
  • chybí seznam pokojů - bez něho nezjistíte volné pokoje,
  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj,
  • metody jeVyplnenZakaznik() a jeVyplnenoDatum() patří do grafiky,

hr02

  • u asociací chybí jména datových atributů,
  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj,
  • abstraktní třída pokoj nemůže evidovat datum příjezdu a datum odjezdu - to by v jednom pokoji mohla být pouze jedna rezervace na roky dopředu,

hr03

  • u asociací od třídy Gui Vám chybí jména datových atributů,
  • nerozumím třídě RezervacePokoju, která má u Vás tři datové atributy: seznam instancí třídy Zákazník, seznam instancí Datum a seznam pokojů. Pokud by tato třída měl představovat jednu rezervaci, tak by měla odkazovat na jeden pokoj, jednoho zázazníka a jeden datum. Potom ale chybí někde umístěný seznam pokojů.
  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj,
  • někde by měla být umístěna metoda, která bude zjišťovat, zda je v daném termínu volný pokoj,

hr04

  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • některé asociace máte obráceně - nemá být vztah od termínu ke třídě EvidencePokoju, ale spíš obráceně,
  • některé třídy a názvy vztahů popisují postup činnosti při vyplňování údajů - třída ZajemceOUbytováni s jediným datovým atributem rezervujePokoje. Dále datové atributy vyberTypuPokoje a vyberKonkretnihoPokoje.
  • chybí třída popisující jeden pokoj.
  • Třída SeznamVolnýchPokojů je podezřelá - seznamy jsou obvykle realizovány před datové atributy; když se pokoj obsadí, tak se měl asi přesunout do jiného seznamu - to je neobvyklé; není jasný pojem volný pokoj - volný je, když na něj není žádná rezervace nebo není rezervace v konkrétním termínu.

hr05

  • u asociací mají být v návrhovém diagramu tříd jména datových atributů a ne popisy vztahů,
  • u asociací chybí šipky,
  • duplicitní informace mezi třídami Zajemce a Rezervace jsou chybou - ponechal bych pouze třídu Rezervace,
  • nepoznám, zda někde je seznam pokojů,
  • od rezervace by měla být asociace na pokoj,

hr06

  • u některých asociací chybí jméno datového atributu,
  • nechápu atribut vsechnyPovinneUdaje ve třídě rezervace,
  • třída odeslat je nejspíš nesmysl, neboť označuje činnost, ne obsah,
  • jména atributů označují činnosti - "zobrat upozorneni", "vyber pokoje", "je volný", "vyplní" či "zadá údaje" - to jsou názvy pro metody a ne pro datové atributy,

hr07

  • třída "Zájemce WWW" do diagramu nepatří - to je uživatel aplikace,
  • nechápu, proč ve třídě Rezervace je datový atribut typPokoje typu List - správně by zde měl být datový atribut typPokoje vyjádřený pomocí asociace ke třídě TypPokoje,
  • od rezervace by měla být dále asociace ke třídě Pokoj - uživatel si může vybrat konkrétní pokoj,
  • třída "SeznamDostupnychPokoju" je divná - není jasné, co bude obsahem třídy. Dle mne je to úplně zbytečná třída.
  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • metoda kontrolaUdaju() ve třídě Rezervace patří spíš do grafiky a ne do třídy Rezervace,

hr08

  • dědičnost od třídy Udaje je nesmyslná - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné. Zde to jsou navíc konkrétní datové atributy ze třídy Rezervace.
  • u některých asociací chybí jména datových atributů,
  • uvedené datové atributy u asociací jsou nesmyslné - např. ve třídě TypPokoje by měl být dle Vás datový atribut obsadenyTyp typu Rezervace - nechápu. Obdobně ve třídě Datum je nesmyslný datový atribut "obsadenyDatum" typu Rezervace.

hr09

  • třída Rezervace má dle Vás dva datové atributy se jménem typPokoje - jednou u asociace ke třídě TypyPokoju, podruhé u asociace ke třídě ZabranePokoje,
  • názvy tříd by měli být v jednotném čísle,
  • chybí Vám třída se seznamem pokojů. Možná by mohl být ve třídě ZabranePokoje, ale u ní nechápu název třídy a hlavně proč má datové atributy datumOd, datumDo a typPokoje.
  • není příliš logické, aby třída TypyPokoju evidovala počet pokojů konkrétního typu - znamenalo by to, že vytvoříte nový pokoj, zařadíte někam do seznamu pokojů a ještě k tomu bude připočítávat jedničku do čítače u typu pokojů. Jednodušší by bylo, kdyby třída evidující pokoje měla metodu, která spočítá počet pokojů konkrétního typu.
  • nemáte dobře kompozici - když se zruší jeden pokoj, tak by se měl zrušit i odpovídající typ pokoje (např jednolůžkové pokoje),

hr10

  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj,
  • u třídy Pokoj nerozumím datovému atributu "Chybové hlášení" typu rezervace - zde se snažíte popsat činnost uživatelského rozhraní,
  • ani datový atribut "seznam pokoju" typu Pokoj ve třídě Rezervace není dobře - každá rezervace si má pamatovat seznam pokojů?
  • do diagramu nepatří třída Zajemce - to je uživatel aplikace a ne předmět aplikace,

hr11

  • u asociací nemáte napsány jména datových atributů, ale činnosti - např. "odeslatRezervaci" je název pro metodu, která odešle mailem rezervaci a ne jméno datového atributu typu Osoba ve třídě RezervaceUbytování (navíc by jste poté měl dva datové atributy typu Osoba).
  • V jedné instanci třídy Pokoj by neměl být evidován seznam pokojů (a navíc typu RezervaceUbytovani),
  • Nechápu třídu VolnyPokoj a ani třídu DataObsazeni.
  • Nemáte nikde seznam rezervací - bez tohoto seznamu nejste schopni zjistit, zda je k danému termínu volný pokoj příslušného typu.
  • V řešení by měla být třída TypPokoje, popř. výčtový typ - zákazník si může zarezervovat pouze typ pokoje.

hr12

  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné. U Vás mají stejný datový atribut, ale s různými hodnotami - to ale spíš ale odpovídá 4 instancím stejné třídy.
  • u asociací Vám občas chybí jména datových atributů,
  • duplikování datových atributů mezi třídami je obvykle chybou - třída Formular odpovídá grafickému rozhraní a neměla by být v návrhovém diagramu tříd.
  • Ve Vašem případě by bylo nejjednodušší sloučit třídy Formular, EvidenceRezervaci a EvidencePokoju do jedné třídy, která bude obsahovat seznam pokojů, seznam rezervací. A bude zjišťovat, zda je volný pokoj v daném termínu.
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj. Na tuto třídu by odkazovala třída Pokoj. Ve třídě EvidencePokoju nemají smysl samostatné sety pro jednotlivé typy pokojů.
  • ve třídě Pokoj bych zrušil datový atribut objednaneTerminy a místo něho udělal asociaci ke třídě Rezervace,

hr13

  • datové atributy id... patří do relačního schématu a ne do objektového modelu zaznamenaného v diagramu tříd,
  • pro vztahy mezi třídami se obvykle používá asociace se jménem datového atributu a ne závislost,
  • k zjištění, zda je nějaký pokoj volný v daném termínu, potřebujete mít někde seznam všech pokojů a seznam všech rezervací,
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj,

hr14

  • názvy datových atributů se píší k asociacím
  • datové atributy id a podobné patří do databázového relačního modelu a ne do objektového modelu, který se kreslí pomocí diagramu tříd,
  • ze zadání nevyplývá, že by jeden zájemce měl více rezervací, tj. třídy Zajemce a Rezervace je možné/vhodné sloučit,
  • jak může třídy TypPokoje vrátit pole pokojů, když je neeviduje,
  • zákazník má možnost zvolit si pouze typ pokoje a ne konkrétní pokoj, tj. měla by být asociace od Rezervace ke třídě TypPokoje,
  • proč má třída Pokoj metodu rezervuj s parametry od, do a zajemce, když neeviduje ani časy, ani zájemce.
  • v diagramu tříd se nepoužívá rozsah 0..N ale 0..*

hr15

  • Není jasné, zda máte seznam rezervací - u oboustranné asociace mezi EvidenceRezervací a Rezervace je uveden pouze jeden atribut a ten dle umístění říká, že jedna instance třídy Rezervace se odkazuje na seznam instancí třídy EvidenceRezervací.
  • dědičnost typů pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • od třídy TypPokoje vedou dvě asociace se jménem typPokoje - to by znamenalo, že ve třídě TypPokoje budou dva datové atributy stejného jména. Správně mají být obě dvě asociace obráceně.
  • třída, která bude zjišťovat zda je volný pokoj, musí mít k dispozici seznam pokojů a seznam rezervací - sloučit třídy SeznamPokoju a EvidenceRezervací dohromady,
  • metoda zobrazVolnePokoje - dle názvu bych to odhadoval na nějakou metodu z grafiky. Určitě ale nemůže být ve třídě Pokoj, neboť potřebuje mít k dispozici seznam pokojů a seznam rezervací.

hr16

  • název třídy "Webová stránka" odkazuje na uživatelské rozhraní - to nepatří do návrhového diagramu tříd,
  • u asociací chybí jméno datového atributu a šipka,
  • výčtový typ "Typ pokoje" se nikde nepoužívá, takže je je zbytečný,

hr17

  • u asociací nejsou jména datových atributů, mnohdy chybí i šipky,
  • Třídy Rezervace a Zákazník by bylo vhodné sloučit do jedné třídy,
  • chybí seznam pokojů - bez něho nezjistíte volné pokoje. Chybí také seznam rezervací. Dokáži si představit, že tyto seznamy by mohly být ve třídě nyní pojmenované Kontrola
  • dědičnost pokojů je problematická - pokud se potomci neliší v datových atributech či aspoň metodách, tak jsou zbytečné,
  • měla by existovat třída či enum TypPokoje - zájemce si nejdříve vybírá pouze typ pokoje, poté teprve konkrétní pokoj. Ve Vašem případě asi typ pokoje představuje abstraktní třída Pokoj.
  • každá instance třídy KonkretniPokoj by nejspíš neměla obsahovat seznam volných pokojů - při obsazení jednoho pokoje by se museli upravovat všechny pokoje. Existence seznamu volných pokojů je obecně problematická - vždy závisí na konkrétním termínu, pro různé termíny jsou to různé seznamy.

Správné řešení

  • místo výčtového typu TypPokoje může být použita klasická třída TypPokoje