Cvičení 8
Cílem cvičení je implementovat „sklad“ na základě níže uvedeného třídního diagramu. Sklad bude umožňovat přidávání produktů, které následně bude možné filtrovat na základě jejich vlastností.

-
Vytvořte knihovnu tříd (například Store), která bude obsahovat veškerý kód aplikace (kromě metody Main).
-
Třída Stock bude reprezentovat sklad.
- Sklad bude možné vytvořit pro konkrétní typ produktu (například sklad aut, sklad telefonů apod.). Jedinou podmínkou bude, že tento typ musí implementovat rozhraní IProduct.
- Produkty budou do skladu přidávány pomocí metody Add. Pokud dojde k přidání duplicitního produktu (stejné instance produktu – object.ReferenceEquals), dojde k vyvolání vlastní výjimky DuplicateProductException. Tato výjimka ponese informaci o produktu, který její vyvolání způsobil.
- Metoda Filter bude vracet filtrovaný seznam produktů, které jsou na skladě. Pro samotné filtrování bude využita třída FilterEvaluator (viz níže).
-
Třída FilterEvaluator
- Bude obsahovat seznam filtrů (IFilter), do kterého bude možné přidávat nové filtry pomocí metody Add.
- Bude obsahovat metodu IsMatch, v jejímž rámci dojde ke kontrole, zda produkt odpovídá všem filtrům.
-
Produkty
- Všechny produkty budou v namespace Products.
- Budou implementovat rozhraní uvedené v UML diagramu.
-
Filtry
- Všechny filtry budou v namespace Filters.
- Budou implementovat rozhraní uvedené v UML diagramu.
- WidthFilter – umožní filtrování na základě minimální a maximální šířky fyzického produktu. Minimální ani maximální šířka nebude povinná. Pokud nebude vyplněna ani minimální, ani maximální šířka, dojde k vyvolání výjimky InvalidFilterArgumentsException s popisem chyby.
- PriceFilter – umožní filtrování na základě minimální a maximální ceny produktu. Minimální ani maximální cena nebude povinná. Pokud nebude vyplněna ani minimální, ani maximální cena, dojde k vyvolání výjimky InvalidFilterArgumentsException s popisem chyby.
- WheelCountFilter – umožní filtrování na základě konkrétního počtu kol.
-
Kód otestujte.
- Vytvořte sklad a naplňte jej několika produkty.
- Při plnění skladu zkuste vložit dvakrát tutéž instanci produktu a odchyťte výjimku DuplicateProductException. Po zachycení této výjimky vypište do konzole informaci o chybě, která nastala, a produkt, který ji způsobil.
- Vytvořte FilterEvaluator a přidejte do něj několik filtrů.
- Vypište vyfiltrované produkty.
- Zkuste vytvořit WidthFilter, u kterého budou minimální i maximální šířka nastaveny na null (mělo by dojít k vyvolání výjimky).
- Zkuste vytvořit sklad, který bude moci obsahovat pouze kolová vozidla.