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í.

Třídní diagram

  1. Vytvořte knihovnu tříd (například Store), která bude obsahovat veškerý kód aplikace (kromě metody Main).

  2. Třída Stock bude reprezentovat sklad.

    1. 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.
    2. 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.
    3. Metoda Filter bude vracet filtrovaný seznam produktů, které jsou na skladě. Pro samotné filtrování bude využita třída FilterEvaluator (viz níže).
  3. Třída FilterEvaluator

    1. Bude obsahovat seznam filtrů (IFilter), do kterého bude možné přidávat nové filtry pomocí metody Add.
    2. Bude obsahovat metodu IsMatch, v jejímž rámci dojde ke kontrole, zda produkt odpovídá všem filtrům.
  4. Produkty

    1. Všechny produkty budou v namespace Products.
    2. Budou implementovat rozhraní uvedené v UML diagramu.
  5. Filtry

    1. Všechny filtry budou v namespace Filters.
    2. Budou implementovat rozhraní uvedené v UML diagramu.
    3. 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.
    4. 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.
    5. WheelCountFilter – umožní filtrování na základě konkrétního počtu kol.
  6. Kód otestujte.

    1. Vytvořte sklad a naplňte jej několika produkty.
    2. 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.
    3. Vytvořte FilterEvaluator a přidejte do něj několik filtrů.
    4. Vypište vyfiltrované produkty.
    5. 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).
    6. Zkuste vytvořit sklad, který bude moci obsahovat pouze kolová vozidla.