4it115»Objednavani Programu

Objednavani Programu

UML - Objednávání a stahování software

Zadání

Zadání je inspirováno objednáváním a stahováním programů z MSDN. Uživatel si může přes aplikaci vybrat, „objednat“ a následně stáhnout programy. Ke každému programu se generuje individuální licenční číslo platné pro konkrétního uživatele. Eviduje se, kolikrát si uživatel stáhl aplikaci. Standardně je možnost stáhnout software dvakrát, správce systému může uživateli u konkrétního programu změnit počet povolených stažení (většinou zvýší počet stažení). Uživatelé jsou v aplikaci evidováni. Vytvořte návrhový diagram tříd, který umožní následující případ užití.

Případ užití 1: Objednání a stažení software
Primární aktér: zájemce o programy
Rozsah: aplikace
Úroveň: uživatelský cíl
Vstupní podmínky: zájemce o programy je na WWW stránce s možností zadání přihlašovacích informací

Hlavní úspěšný scénář:
1. Zájemce zadá své jméno a heslo

Aplikace po ověření jména a hesla zobrazí přehled programů, které si uživatel objednal v minulosti. U každého vypíše název, licenční číslo, datum objednání, počet stažení, počet zbývajících stažení a tlačítko „stáhnout“ (pokud uživatel ještě může stahovat).

2. Zájemce zvolí tlačítko „objednat další software“

Aplikace zobrazí nabídku jednotlivých programů k objednání. U každého programu je zobrazen jeho název a v případě že, ho ještě uživatel nemá objednán i tlačítko „Objednat“.

3. Zájemce vybere program a u něho stiskne tlačítko „Objednat“.

Aplikace zobrazí licenční ujednání pro konkrétní program.

4. Zájemce odsouhlasí licenci.

Aplikace vygeneruje individuální licenci a zobrazí přehled objednaných programů včetně nově objednaného programu – přejde se na bod 2.

Rozšíření:
1a. pokud uživatel zadá chybné heslo, systém zobrazí příslušné upozornění a opět přihlašovací obrazovku, pokračuje se bodem 1.
1b. pokud si uživatel nepamatuje heslo, může po zadání uživatelského jména stisknout tlačítko „vygenerovat heslo“. Aplikace zkontroluje, zda zná uživatelské jméno – pokud ano, odešle na evidovanou e-mailovou adresu nově vygenerované heslo.
2a. zájemce zvolí u některého zobrazeného programu tlačítko „stáhnout“. Začne se stahovat zvolená aplikace. Po ukončení stahování se zobrazí aktualizovaný seznam objednaných programů a pokračuje se bodem 2.

Chybná řešení

os01

  • abstraktní třída bez potomků je nepoužitelná - nelze vytvářet instance,
  • Vaše třídy popisují jednotlivé činnosti aplikace a ne statický pohled, který se popisuje pomocí diagramu tříd.

os02

  • u asociací mají být jména datových atributů a ne popisy. Ve Vašem případě jména vztahů odpovídají jménům datových atributů.
  • třída EvidenceUzivatelu je zbytečná - ve třídě Aplikace postačuje datový atribut seznamUzivatelu s prvky typu Uzivatel,
  • u třídy Uživatel nemá co dělat datový atribut pocetStahnutí - ten patří ke konkrétnímu objednanému programu
  • nechápu asociaci Program -> Uzivatel s popisem pocetStazeni - to by byl datový atribut typu Uzivatel ve třídě Program,
  • obdobně nechápu asociaci od třídy ProgramKZakoupeni ke třídě Aplikace s popisem generatorLicenci,
  • od třídy Program by měla být asociace ke třídě ProgramKZakoupení

os03

  • nechápu, proč by měla každá instance třídy Uživatel obsahovat odkaz na seznam všech uživatelů,
  • třída SeznamStaženýchProgramů má pouze jeden datový atribut - seznam uživatelů (datový atribut uzivatel u asociace ke třídě Uzivatel). Nechápu, jak na základě znalosti pouze seznamu uživatelů může vypsat stažené programy či ověřovat, že uživatel nemá překročen počet stažení konkrétního programu.
  • třída Program by asi měla představovat jednotlivé dostupné programy - poté ale do této třídy nepatří licenční číslo, počet stažení či datum objednání, neboť tyto atributy závisí na konkrétním uživateli,

os04

  • u většiny asociací Vám chybí šipky,
  • nechápu asociaci mezi třídou Uzivatel a třídou PrehledProgramu - to by se měl u každého uživatel individuální seznam instancí tříd PrehledProgramu???
  • ve třídě Program by datový atribut licence měl být typu String,
  • ve třídě ObjednanéProgramy je zbytečný datový atribut nazev - ten by se měl přiřadit na základě asociace ke třídě Program - ta Vám ale chybí,
  • nechápu asociaci od třídy Program ke třídě ObjednaneProgramy s názvem datového atributu jeObjednany - nechápu multiplicitu 1,

os05

  • nechápu asociaci od třídy Uzivatel ke třídě EvidenceUzivatelu s datovým atributem seznamUživatelů - to si každý uživatel bude evidovat seznam uživatelů. Zde měla být šipka u asociace obráceně.
  • Asociaci od třídy EvidenceUzivatelu ke třídě Uzivatel má nesmyslné jméno datového atributu (vygenerovaneHeslo) a multiplicitu (1).
  • Metoda generovaniHesla() by měla být spíš ve třídě Uzivatel.
  • V zadání byl zmiňován správce pouze v souvislosti s používáním programu. Do diagramu třída Spravce nepatří. Pokud by v zadání byly i případy užití z hlediska správce, tak stejně nejspíš správce byl řešen pouze jako příznak (datový atribut) ve třídě Uzivatel.
  • Nechápu třídu EvidenceProgramuUživatele - stačila by pouze asociace od třídy Uzivatel ke třídě ProgramUzivatele.
  • Licenční číslo je individuální pro uživatele, tj. nemá být ve třídě Program, ale ve třídě ProgramUzivatele.
  • Nechápu, proč by každá instance třídy Uzivatel měla mít odkaz na instanci EvidenceProgramu.

os06

  • k asociacím se v návrhovém diagramu tříd píší jména datových atributů a ne činnosti - činnosti se zapisují do dynamických diagramů, v diagramů tříd jsou pouze na úrovni názvů metod,
  • do diagramu nepatří třída Spravce - v zadání je správce zmiňován pouze jako uživatel aplikace, pokud by v zadání byly i případy užití za správce, tak by správce byl nejspíš řešen jako příznak/datový atribut ve třídě Uzivatel. Řešení přes potomky je problematické - nelze poté změnit správce na uživatele či z uživatele udělat správce.
  • vytvořit dědičnost mezi třídami SeznamProgramu a SeznamObjednanychProgramu je nesmyslná - když jeden uživatel objedná program, tak ho chcete přesunout ze seznamu programů do seznamu objednaných programů ? Ale to si již další uživatel nebude moci objednat.
  • Podobně nesmyslná je dědičnost mezi třídou Program a LicencovanyProgram -
  • počet stažení závisí na programu a konkrétním uživateli - tj. datový atribut pocetStazeni by neměl být ve třídě Program, ale ve třídě LicencovanyProgram.

os07

  • třída SeznamProgramu má čtyři (!!!) rozdílné datové atributy pojmenované seznamProgramu - toto jméno je použito u čtyřech asociacích vycházejících ze třídy SeznamProgramu
  • nechápu příliš rozdíly mezi třídami SeznamProgramu, Programy a Objednavka. Správně by měla být třída Program s atributy nazev, licenčníUjednání a třída ObjednanyProgram (či Objednavka), kde bude atributy spojené s objednávkou konkrétního uživatele - odkaz na Program, licenční číslo, datum objednání, počet stažení, počet zbývajících stažení.

os08

  • název třídy ObjednatProgram označuje činnost a ne předmět aplikace - toto patří do dynamických diagramů či jako název metody,
  • nikde není uložen seznam programů, ze kterého by uživatel mohl vybírat,
  • nikde ani nevidím seznam programů, které si uživatel objednal,
  • u asociací chybí jména datových atributů,
  • asociace mezi třídami ProgramKObjedani a LicenčníUjednani je obráceně. Vhodným řešením je i tyto třídy sloučit.

os09

  • na výčtový typ Programy nevedou žádné vazby, takže je nejspíš zbytečný a neměl by v diagramu být,
  • uživatel dle zadání nemůže mít více přihlašovacích údajů - atributy jmeno a heslo by měly být přímo ve třídě Uzivatel (plus datový atribut e-mail, aby bylo možné mu poslat nové heslo),
  • chybí Vám seznam programů, ze kterého si může uživatel vybírat,
  • nikde nemáte umístěn text licenčního ujednání,

os10

  • nejjednodušší by bylo sloučit datové atributy tříd Licence, KontrolaStazeni a Objednavka do jedné třídy,
  • chybí Vám někde umístěný seznam dostupných programů - neměl by být uložen v každé instanci třídy Uzivatel, u uživatele by měl být pouze seznam objednávek (programů, které si již objednal),
  • třída Security nepatří obvykle do návrhového diagramu tříd - popisuje dynamickou složku aplikace - jedno konkrétní přihlášení. To se obvykle ošetřuje v grafice nebo v samostatném modulu řešícím přístupová práva k jednotlivým funkcím aplikace.

os11

  • ve třídě Zajemce by měl být ještě datový atribut e-mail,
  • nechápu, proč jste vytvořil samostatnou třídu nazev - to mělo být řešeno jako vnitřní datový atribut třídy Program. Nebo snad více programů bude sdílet jeden název?
  • nerozlišuje nabízený program (datové atributy název a licenční ujednání) od programu objednaného konkrétním uživatelem (odkaz na program, licenční číslo, datum objednání, počet stažení, počet zbývajících stažení),
  • třída Licence bez datových atributů je chybně - třída bez datových atributů je vždycky podezřelá,
  • jméno datového atributu "objednava" u asociace Zajemce -> Program odpovídá spíš názvu činnosti,

os12

  • ve třídě Uzivatel chybí datový atribut e-mail - bez něho nelze poslat nové heslo,
  • nechápu třídu Licence s datovým atributem "objednane programy" typu Program a multiplicitou 1. Dle mne je tato třída úplně zbytečná.
  • Třídu PrehledProgramu bych přejmenoval na NabizenyProgram - jedna instance představuje jeden program v nabídce. U této třídy by měl být ještě datový atribut s licenčním ujednáním.
  • Třída Program by měla odkazovat na třídu NabízenýProgram.
  • Chybí seznam nabízených programů - u třídy Uzivatel nemá smysl, neboť by to znamenalo, že se pro každého uživatele vytváří speciální nabídka programů. To ze zadání nevyplývá.

os13

  • činnosti patří do dynamických diagramů, do diagramu tříd pouze ve formě metod. Třídy "objednat", "stahnout", "objednatDalsiSoftware", "zobrazeniUpozorneni" či "vygenerovatHeslo" jsou nesmyslné,

os14

  • abstraktni třída bez potomků nemá žádný smysl - nemůžete vytvářet instance.
  • třída Program nemůže být potomkem třídy Programy - ze třídy Programy měla vést ke třídě Program asociace s hvězdičkou označující seznamProgramů,
  • nerozlišujete nabízené programy (datové atributy název a licenční ujednání) od programů objednaných konkrétním uživatelem (datum objednání, licenční číslo, počet stažení, počet zbývajících stažení),
  • do diagramu nepatří třída Spravce - v zadání je správce zmiňován pouze jako uživatel aplikace, pokud by v zadání byly i případy užití za správce, tak by správce byl nejspíš řešen jako příznak/datový atribut ve třídě Uzivatel,

os15

  • třídy bez datových atributů jsou podezřelé - u Vás se to týká třídy Licence. Potřebujete někam umístit text licenčního ujednání - já bych z toho udělat datový atribut ve třídě Program, popř. ve třídě Licence.To by mělo smysl v případě, že pro více různých programů je stejné licenční ujednání.
  • dědičnost je v tomto případě chybně - když si uživatel objedná program, tak zrušíte instanci třídy Neobjednane a vytvoříte instanci třídy Objednane? Problémová je i to, že třída Objednane je potomkem třídy Program. Mnohem jednodušší je udělat asociaci od třídy Objednane ke třídě Program.
  • chybí Vám seznam nabízených programů - je nevhodné, aby se evidoval u každého uživatele - to by znamenalo, že pro každého uživatele existuje speciální nabídka a to ze zadání nevyplývá. Problémy by nastaly v okamžiku, kdy by se začal nabízet další program.

os16

  • k jednomu programu je jedno licenční ujednání a ne seznam licenčních ujednání.
  • nechápu rozdíl mezi třídami Login a Uzivatel - obě mají stejné datové atributy. Mně připadá, že jste chtěl pomocí třídy Login vyjádřit činnost uživatele - to ale patří do dynamických diagramů.
  • nechápu, proč ve třídě EvidenceUzivatelu je opět jmeno a heslo. V této třídě bych si představoval, že bude seznam uživatelů.
  • jméno datového atributu "vyberProgram" u asociace mezi třídami Uzivatel a NabidkaProgramu evokuje činnost (jméno metody),
  • Asociace mezi třídami GeneratorLicenci a Program by měla být obráceně.
  • třída PrehledProgramu je chybně nazvaná - vhodnější je název "ObjednanyProgram", neboť dle atributů popisuje jeden program objednaný uživatelem. Asociace ke třídě Program by měla být obraceně.

os17

  • Licenční ujednání je jako datový atribut ve třídě Program, nepochopil jsem, proč ještě existuje třída LicenčníUjednani.
  • Třída PrehledProgramuKObjednani je divná - nechápu datový atribut nazev. Pokud to má být název programu, tak ten je již uveden ve třídě Program. Osobně bych si zde spíš představoval seznam všech dostupných programů - asociace vedoucí ke třídě Program.
  • počet stažení je již evidován ve třídě PrehledObjednanachProgramu - proč máte další třídu EvidenceStazeni s datovým atributem pocetStazeni?
  • třída PrihlasovaciUdaje duplikuje třídu Uzivatel - minimálně datové atributy. Mně připadá, že jste tím chtěla vyjádřit průběh aplikace - to ale patří do dynamických diagramů.
  • Chybí Vám seznam dostupných programů - nemůže být evidován u třídy Uzivatel.

os18

  • nakreslil jste ER diagram pro relační databáze, ne diagram tříd,

os19

  • třída Tlačítko patří do grafiky - a to včetně potomků Stahnout a Objednat. V diagramu tříd se nezobrazují činnosti, ty patří do dynamických diagramů.
  • u většiny asociací chybí jména datových atributů,
  • abstraktní třída bez potomků nemá smysl - nelze vytvořit instance. U Vás se to týká třídy Program.
  • nechápu třídy PocetStazeni a PocetZbyvající - tyto údaje závisí na konkrétní objednávce konkrétního uživatele,
  • licenční číslo by mělo být evidováno u objednávky, ve Vašem případě asi ve třídě Program. Třída Licenční číslo je potom zbytečná.
  • Ve třídě zájemce chybí datový atribut e-mail
  • nerozlišujete nabízené programy (datové atributy název a licenční ujednání) od programů objednaných konkrétním uživatelem (datum objednání, licenční číslo, počet stažení, počet zbývajících stažení),

os20

  • do diagramu nepatří třída Spravce - v zadání je správce zmiňován pouze jako uživatel aplikace, pokud by v zadání byly i případy užití za správce, tak by správce byl nejspíš řešen jako příznak/datový atribut ve třídě Zakaznik,
  • ve třídě Zakaznik Vám chybí datový atribut e-mail,
  • nechápu třídu Licence - pokud má obsahovat licenční číslo programu pro konkrétního uživatele, tak se duplikuje se třídou ZakoupeneProgramy (příště v jednotném čísle, tj. ZakoupenyProgram). Chybí Vám někde uložený text licenčního ujednání - ten by měl být buď ve třídě Programy (příště Program). Licenční ujednání by mohlo být i samostatně, pokud by více programů sdílelo stejné licenční ujednání (ze zadání nevyplývá).
  • chybí Vám seznam dostupných programů - nemůže být evidován ve třídě Zakaznik, neboť by to znamenalo, že pro každého zákazníka někdo připraví speciální seznam.

Správné řešení