Objektovo-orientované programovanie, ak. rok 2023/24

Cvičenie 5

(k prednáške 5)

späť


Projekt

Pokračujte v práci na projekte v zmysle doterajších inštrukcií. Prečítajte si inštrukcie k pracovnej verzii programu. Najneskôr na cvičení by ste mali od svojho vyučujúceho dostať link do classroomu na GitHube, v rámci ktorého si vytvoríte vlastný repozitár pre pracovnú verziu programu.

Uvažujte o použití návrhových vzorov. Môžete použiť aj iné ako tie, o ktorých sme hovorili na prednáškach. Často sa potreba za určitým návrhovým vzorom ukáže až po iniciálnej implementácii. Nezdráhajte sa uplatniť ho dodatočne, čím vlastne spravíte tzv. refaktorizáciu (refactoring): zmeníte kód, ale zachováte jeho správanie.

Pri používaní vášho programu by v pamäti mali vznikať objekty, ktoré reprezentujú zadané alebo odvodené údaje. Aby ste nemuseli po každom spustení ručne opakovať činnosti, ktoré vedú k vzniku týchto objektov, môžete príslušné objekty uložiť použitím serializácie.

^


Úlohy

  1. V hre s obrami a rytiermi z prednášky typ ArrayList nahraďte typom LinkedList (len pri jednej premennej alebo aj všade) a presvedčte sa, že hra stále funguje.
  2. Vyskúšajte príklad generického jednosmerne zreťazeného zoznamu. Implementujte metódu deleteNext(SLLElement<T> sll_e) na zrušenie prvku ktorý nasleduje za zadaným prvkom sll_e.
  3. V hre s obrami a rytiermi z prednášky si všimnite metódu calculateEnergy() triedy Game. Táto metóda má jeden parameter typu List<? extends Energy>. Nahraďte tento typ typom List<Energy>. Prekladač hlási chyby (aby ste ju videli, v prostredí Eclipse sa zo záložky Console prepnite na záložku Problems). V čom je problém?
  4. V hre s obrami a rytiermi z prednášky bola pomocou vzoru Composite pridaná možnosť tvorby organizačnej štruktúry rytierskej výpravy. Rytieri vo výprave figurovať samostatne (rola Leaf) alebo v oddieloch (rola Composite), čo je zabezpečené spoločným rozhraním (rola Component). Rytierská výprava vzniká v triede AlternateSwordsSquadGameSetup. Predstavme si, že by rovnakým spôsobom mohli byť organizovaní aj obri. Prispôsobte tomu jestvujúcu implementáciu vzoru Composite podľa nasledujúcich krokov:
    1. Aby sa oddiely mohli vzťahovať aj na rytierov, aj na obrov potrebné je zjednocujúce rozhranie. Vytvorte prázdne rozhranie Warrior.
    2. Dá sa pomocou rozhrania Warrior zabezpečiť, aby metóda getWarriors() rozhrania CombatUnit mohla vracať aj zoznam rytierov, aj zoznam obrov (tip: pozrite predchádzajúcu úlohu)? Rovnaký typ návratovej hodnoty treba nastaviť aj implementácii tejto metódy v triede WarriorSquad. Keďže nevieme, či oddiel bude oddielom rytierov alebo obrov, lokálny zoznam units musí byť všeobecného typu List<Warrior>.
    3. Ak ste správne vyriešili predchádzajúcu úlohu, implementácia metódy getWarriors() triedy Knight zostáva v platnosti. Pridajte analogickú implementáciu do triedy Ogre.
    4. V triede AlternateSwordsSquadGameSetup stačí zaradiť konverziu získaného zoznamu bojovníkov na zoznam rytierov, t. j. riadok:
      knights.addAll(knightsExpedition.getWarriors());
      nahradiť riadkom:
      knights.addAll((List<Knight>) knightsExpedition.getWarriors());
    5. Implementujte metódu report() v triedach obrov.
    6. Rozdeľte obrov do ich oddielov. Stačí skopírovať a trochu upraviť inicializačné slučky pre rytierov.
  5. Experimentujte s príkladom serializácie objektov. Pridajte ďalšie prvky. Vyskúšajte čo sa stane keď deklarujete atribút n triedy Data ako transient. Vyskúšajte príklad serializácie zoznamu. Všimnite si, že sa aj serializácia v hre s obrami a rytiermi vzťahovala aj na zoznamy. (Alternatívou k tejto úlohe je, aby ste uplatnili serializáciu vo vlastnom projekte.)
  6. Vyskúšajte príklady práce so vstupno/výstupným systémom Javy. Špeciálne si všimnite nasledujúce:
    1. príklad filtrovania obsahu adresára (aký návrhový vzor je tam použitý?)
    2. ako sa otvára a zatvára prúd údajov (stream)
    3. obaľovanie (wrapping) prúdov údajov pre ich efektívnejšie využitie
    4. štandardný vstupno/výstupný systém
    5. nový vstupno/výstupný systém (nio) a súbory zobrazené do pamäte (memory mapped files)

^


Práca s JAR archívmi

Ak chcete dodať svoju aplikáciu v kompaktnej forme, môžete ju zbaliť do tzv. JAR súboru. Detaily práce s JAR súbormi poskytuje príslušný tutoriál. Pozrieme sa na príklad tvorby jednoduchého JAR archívu z hry s obrami a rytiermi (použite vlastnú verziu alebo poslednú verziu z prednášok):

  1. Preložte zdrojové súbory. Vyhľadajte adresár bin v adresári pracovného priestoru (workspace) prostredia Eclipse s class súbormi.
  2. Spusťte príkazový riadok. Nastavte sa do adresára bin.
  3. Zadajte príkaz
    jar cfe hra.jar gui.StretGUI *
    Týmto príkazom zbalíte všetky súbory v aktuálnom adresári do JAR archívu s názvom hra.jar. Prepínače majú nasledujúci význam:

JAR súbor spustíte nasledujúcim príkazom (prípadne aj dvojitým kliknutím, ak je správne nastavená asociácia s JVM):

java -jar hra.jar

^



Valentino Vranić
vranic at stuba.sk