Zadanie - Pizzeria
Cieľom zadanie z OOP bude vytvoriť jednoduchý informačný systém pre prevádzku pizzerie. Samozrejme, jedná sa o zjednodušenú verziu, ktorej cieľom nie je 100% reprezentácia reálneho systému a niektoré časti budú mierne pritiahnuté za vlasy s cieľom využiť princípy OOP v rámci C#.
Zadanie môžete robiť ako Windows Forms application alebo WPF.
Hlavné okno si rozdeľte na dve časti:
- Jedna časť bude obsahovať dva tlačidlá ktoré otvoria sklad a pečenie
- Druhá časť bude obsahovať reprezentáciu stolov, kde sa pri kliknutí na stôl zobrazí objednávka
1. Sklad
Vytvorte si osobitnú knižnicu PizzaLib ktorá bude definovať triedy potrebné na prácu s dátami (v reálnej aplikácií by tu bol definovaný databázový model a kontext, my si však vystačíme s prácou so súbormi).
Nech sú tu definované nasledujúce triedy a rozhrania:
Item, Ingredient, MiscellaneousItem, Pizza sú triedy, ktoré definujú všeobecné správanie daného typu artiklov, nie jedného konkrétneho artiklu - artikle budú definované parametrami v rámci objektu danej triedy.
-
interface Sellable - definuje veci, ktoré sa dajú predať
- double GetPrice()
- void Order() - vykoná objednávku - odpočíta zo skladu tovar
-
interface CsvSerializable - definuje spôsob, ako serializovať objekt na uloženie do CSV súboru
- string ToCsvLine() - nech prvá hodnota je typ objektu, následne hodnoty, ktoré chcete uložiť
-
abstract class Item: CsvSerializable - definuje všeobecné správanie artiklov v sklade, musí obsahovať aspoň meno a hmotnosť / objem materiálu
- definujte si parametrický konštruktor: name, initialAmount, warningTreshold (hranica na upozornenie, že dochádza)
- definujte si gettery a nech táto trieda neobsahuje priamo settery ale priamo metódy na pridanie a ubranie množstva (teda nech nie je možné z vonku priamo nastaviť hodnotu)
- v prípade, že nie je dosť materiálu na sklade, nech sa pri pokuse zobrať vyvolá InsufficientIngredientsException
- boolean isLow() vráti true ak je na sklade málo danej veci
-
class InsufficientIngredientsException : Exception - chyba ktorá sa vyvolá v prípade, že nie je na sklade dostatok danej suroviny
-
class Ingredient : Item - definuje prísadu potrebnú na prípravu pizze napr. múku, pretlak, syr...
-
class MiscellaneousItem : Item, Sellable - prakticky to isté ako Ingredient, akurát tu budú rôzne iné veci, ktoré si môže človek objednať, napr. pitie, chrumky...
- nech konštruktor akceptuje ešte aj predajnú cenu ako parameter
-
class Inventory - trieda obsahujúca kolekciu vecí na sklade
- môžete ich mať uložené vo viacerých kolekciách a následne ich spojiť podľa potreby alebo ich mať všetky spolu a ak je to potrebné, vykonať typovú kontrolu a podľa toho ich rozdeliť
-
IEnumerable<Item> GetItems()
vráti zoznam všetkých vecí na sklade -
AddItem(item)
pridá danú vec do zoznamu, ak už v zozname je, vyvolajte ArgumentException (ak ju už vami použitá kolekcia nevyvolá sama) - ak máte osobitné kolekcie pre Ingredient a MiscellaneousItem, typovú kontrolu vykonajte tu. - Item GetItem(string name)
-
class Pizza : Sellable, CsvSerializable
- nech sú v konštruktore definované nasledujúce parametre: názov, cena, kolekcia potrebných ingrediencií a aké množstvo ich treba (tu sa oplatí použiť Dictionaty<TKey, TValue> ak neviete ako na to, google & stackoverflow, prípadne to môžete obísť vytvorením vlastnej triedy kde bude Item & price a použijete List)
- ingrediencie majte uložené ako názov (string), nie referenciu na objekt v sklade (Inventory) - danú vec si môže vyžadovať recept ale nie je evidovaná na sklade + zjednoduší vám to robotu.
- serializáciu zoznamu ingrediencií môžete vykonať aj ako JSON
-
class RestaurantMenu - trieda predstavujúca zoznam vecí dostupných na objednávku (tzn. Sellable)
-
class CsvFileHelper - trieda zodpovedná za čítanie a zápis CSV súborov, pri práci so súbormi používajte IDisposable pattern. https://en.wikipedia.org/wiki/Comma-separated_values
- konštruktor, kde bude definovaná cesta k súboru a spôsob otvorenia.
-
void SaveToFile(IEnumerable<CsvSerializable>)
- uloží kolekciu do súboru -
IEnumerable LoadFromFile()
- prečíta súbor, na samotné vytváranie použite Deserialize -
CsvSerializable Deserialize(string)
- vráti jeden deserializovaný objekt, bude sa jednať o návrhový vzor Factory Method https://en.wikipedia.org/wiki/Factory_method_pattern