====== Domácí úkol 3 ====== //Tento domácí úkol se týká témat: UML, návrhový vzor Facade, Strategy a správný návrh aplikace..// ===== Zadání ===== Máte zadanou aplikaci, která dodržuje vícevrstevnatou architekturu. Je poměrně jednoduchá viz UML diagram níže: {{ :courses:b6b36omo:hw3omo.png?600 |}} ==== Rozdělení balíčků: ==== * **model** - datové objekty * **repository** - crud operace pro model balíček * **services** - logika aplikace * **strategy** - využití strategy * **facade** - facade pro centrální bod pro aplikaci * **dto** - transformovaný objekt - například pro FE Z diagramu je vidět, že se nejedná o čisté řešení, ale aplikace je připravena na migraci do microservice architektury. Proto entity neobsahuji vztahy na ostatni entity (s vyjimkou Address). Jedná se tedy o rozdělení na 3 domény a to Book, Author, Library. Zlepšete agregaci dat. Jedná se o velmi částý problém na projektech. Vidíte situaci na projektu, že některé metody jsou rozsáhlé, nepřehledné. Je zde hodně logiky na jednom místě. Špatně se debuguje. Rozšíření je hodně náročné. Je potřeba takové metody dekomponovat. Zde se velmi hodí použít zavedená pravidla. Využijte facade design pattern pro oddělení logiky kódu od spojování dat do složitější entity. ==== Facade ==== - Implementujte metody getByBookId v BookFacadeImpl Metoda má vrátit objekt BookDto Metoda nebude úplně jednoduchá kvůli servisní architektuře. 1/ Využijte pattern Facade pro skládání dat pro složitější objekty. Jedná se o metodu getByBookId v BookFacadeImpl. Tato metoda ma vrátit knížku (objekt BookDto) - obsahuje název knížky,knihovny a autora ==== Strategy ==== Většinou se tento pattern využívá pro redukci if příkazů. V kódu často bývá spoustu if příkazů, které při zpětné úpravě kódu budou dělat problémy (většinou je potřeba je všechny projít a upravit). Programátor bude muset upravovat podmínky na více místech v aplikaci. - a to rozhodně nechceme. - Implementujte metodu update definovanou v interfacu BookStrategy.java - Metoda by měla příjmat jako atribut pouze daný objekt knihy (Book) - Návratová hodnota je Book Při implementaci se zamyslete, jestli nemůžete využít něco z toho, co jste už implementovali. V naši aplikaci tento pattern využijeme pro jednotné místo pro funkcionalitu. Použijeme strategy na updateBook v service. Budou existovat 2 strategie: * **SimpleBookStrategy** - jednoduchý update, který najde objekt, a udělá aktualizaci * **ImutableBookStrategy** - "update", který přidá nový objekt ze starého objektu (a nových dat, které se měli aktualizovat). Při vytváření nezapomeňte zvýšit ID nového objektu o 1 oproti původnímu objektu. Pokud nevíte, co znamená imutable objekt, tak koukněte sem: (link zde: https://www.baeldung.com/java-immutable-object) ===== Odevzdání do brute ===== Šablona pro domácí úkol: {{ :courses:b6b36omo:omo-hw3-students_1.zip |}} Odevzdávají se soubory: * BookServiceImpl.java * BookStrategy.java * ImutableBookStrategy.java * SimpleBookStrategy.java * BookFacade.java * BookFacadeImpl.java Dodržujte pojmenování tříd, které jsou v projektu. Konstruktor **BookFacadeImpl(BookServiceImpl bookService, AuthorServiceImpl authorService, LibraryServiceImpl libraryService)** prosím neimplementujte. V testech se předpokládá, že je konstruktor bezparametrický. Malá rada na závěr: Možná vám pomůže následující diagram, kde jsou znázorněné vazby. {{ :courses:b6b36omo:omo_du3_classdiagram.png?600 |}}