Odovzdavanie (prezentovanie) projektov cviciacemu.
Category: Cvičenia
-
10. Cvicenie
Stiahnite si kod z 9. prednasky.
Uloha (java.lang.reflect)
Implementujte (s pouzitim reflexie) do triedy Steve metodu, ktora po zavolani vrati hodnoty vsetkych atributov triedy ako String.
Vystup bude napr. takyto:
logger: org.apache.logging.slf4j.Log4jLogger@30c15d8b serialVersionUID: 1 uuid: fa3f655e-231c-44fd-b8d8-469fa18250e9 hunger: 1 ...
Finalizujte projekty, konzultujte ich s Vasim cviciacim.
-
9. Cvicenie
Stiahnite si zdrojovy kod z 8. prednasky
IO
Vytvorte benchmark na porovnanie rychlosti Bufferovaneho zapisu do suboru vs nebufferovaneho zapisu do suboru. Nezabudnite, ze pre to aby vysledky boli statisticke vysledne, tak tieto testy nestaci spustit iba raz.
Spriemerujte hodnoty, vypocitajte napr. aj stdev (standardnu odchylku).
JavaDoc
Zdokumentujte triedu Steve pomocou JavaDoc. Vygenerujte JavaDoc pre cely projekt.
Logovanie
Pridajte logovanie do triedy Steve, pouzite viacero urovni. Pokracujte v pouzivani “stacku” (slf4j + log4j2) z prednasky, prestudujte si dokumentaciu ku konfiguracii log4j2 – https://logging.apache.org/log4j/2.x/manual/configuration.html – experimentujte s konfiguracnym suborom.
Poznamka: V pripade, ze IDE nestiahne samo potrebne kniznice, tak si pridajte a spustite tento Maven target:
-
8. Cvicenie
Stiahnite si kod z poslednej prednasky. Pracujte s triedou Steve, vase riesenia otestuje na netrivialnej vzorke.
Streamy
- Spocitajte vsetkych Stevov, ktori maju menej ako 50% svojho maximalneho healhu.
- Vytvorte mapu kde bude kluc ci Steve ma/nema godMode a hodnota bude priemerna hodnota healtu.
- Najdite top 3 Stevov s attackPower. Vysledok je Mapa, kluc je meno Steva a hodnota je jeho attackPower.
- Najdite vsetkych Stevov, ktori maju viac ako 50% svojho maxHealth a zaroven menej ako 40% svojho maxHunger. Zoradte ich podla mena.
Serializacia
- Ulozte (serializujte) zoznam Stevov.
- Nacitajte (deserializujte) zoznam Stevov.
-
7. Cvicenie
Stiahnite si zdrojovy kod zo 6. prednasky.
Uloha 1
Identifikujte a opravte chyby v nasledujucom kuse kodu (skuste si ho pustit, aj viackrat):
public class FunWithThreadsLive { List<String> listString = new ArrayList<>(); public static void main(String[] params) throws InterruptedException { FunWithThreadsLive f = new FunWithThreadsLive(); Random rand = new Random(); for (int i = 0; i <= 100; i++) f.listString.add(String.valueOf(UUID.randomUUID())); Thread threadOne = new Thread(() -> { for (String s : f.listString) System.out.println(s); }); Thread threadTwo = new Thread(() -> { for (int i = 0; i < 99; i++) f.listString.remove(rand.nextInt(f.listString.size())); }); threadTwo.start(); threadOne.start(); threadTwo.join(); threadOne.join(); }
Uloha 2
Vytvorte novy (dalsi view) pre triedu Steve v baliku mvc.
Tento view bude view pre CRUD operacie s triedou Steve v konzole (CLI), bude implementovat interface SteveView.
Bonus: aj v baliku mvp
-
6. Cvicenie
Naimportujte si zdrojovy kod z 5. prednasky.
Uloha 1
Vasou ulohou je napisat jednotkove testy pre triedu Steve. Cielom je dosiahnutie 100% BRANCH coverage.
Uloha 2
Vytvorte GUI vo Swingu pre triedu Steve:
- Je mozne vytvarat Stevov s pouzivatelskymi parametrami
- Vsetci takto vytvoreni Stevovia sa budu zobrazovat v zozname, ktory je mozne scrollovat
- Po kliknuti na zaznam v zozname sa zobrazia prehladne informacia o Stevovi
Bonus: pouzite vzor MVC alebo MVP alebo MVVM a pod.
Pomocky: Ako bolo povedane na prednaske, komponenty Swingu je mozne do seba vnarat, odporucame pozriet si dokumentaciu napr. k triede JPanel alebo aj JOptionPane.
-
5. Cvicenie
Stiahnite si zdrojovy kod z prednasky
Uloha 1
Majme nasledujuci kod:
Steve steve1 = new Steve("a", 1, 1, 1, 1, 1, 1, false); Steve steve2 = new Steve("b", 2, 2, 1, 1, 1, 1, false); Steve steve3 = new Steve("c", 3, 3, 1, 1, 1, 1, false); Steve steve4 = new Steve("d", 4, 4, 1, 1, 1, 1, false); Steve steve5 = new Steve("d", 4, 4, 1, 1, 1, 1, false); List<Steve> steveList = new ArrayList<>(); steveList.add(steve1); steveList.add(steve2); steveList.add(steve3); steveList.add(steve4); steveList.add(steve5);
Zabezpecte aby po pridani objektov Steve do vhodnej struktury boli ulozene iba unikatne objekty a zaroven ich bolo mozne ziskat (iterovat) podla mena (name).
Pouzite na to vhodnu strukturu a doimplementujte pripadne potrebne zavislosti.
Uloha 2
Pokracujte v predchadzajucom priklade. Vasou ulohou je teraz zvolit taku strukturu, aby sme vedeli ziskat vsetky objekty Steve, ktore maju rovnake meno. Napr. struktura.get(“Jurajko”) vrati vsetky objekty ktore maju name Jurajko.
Uloha 3
Upravte implementaciu tak, aby nebolo mozne vytvorit novy objekt Steve s nezmyselnymi parametrami.
Praca na projekte
Pracujte na projekte, nezabudnite najprv vytvorit rozhrania a az potom implementaciu. Rozhrania nasledne pouzijete napriklad pre GUI.
Nezabudnite zacat pouzivat GitHub (ako je popisane na stranke projekt) – deadline je 19.3.2025 do 20:00.
Uzitocne linky
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Collection.html
-
4. Cvicenie
Naimportujte si nasledujuci zdrojovy kod:
Uloha 1
Pridajte novy typ (strategiu) utoku (minecraft.item.weapon).
Malo by to byt pomerne jednoduche a priamociare – takyto by mal byt dobre napisany a navrhnuty OOP kod – otvoreny na rozsirovanie, ale uzavrety na upravy.
Uloha 2
Prestudujte si balik minecraft.item.potion.
Co keby chceme kombinovat rozne typy potionov? Ked chceme nabalovat jeden za druhym?
Ake by bolo potrebne vykonat zmeny (keby pokracujeme v zauzivanom trende)? Bude takyto kod splnat OOP principy a princip KISS?
Zistite ktory navrhovy vzor by bol vhodny na riesenie takehoto problemu. Implementujte ho.
Jeden “typ potionu” je mozne pouzit aj viackrat, t.j. mozem napriklad zmiesat aj viac Speed potionov.
Uloha 3
Implementujte pocitadlo kolko “efektov na potion”(globalne v celom programe) bolo vytvorenych. Pouzite na to vhodny navrhovy vzor.
Pocitadlo by mal byt objekt, nie len staticka trieda a mal by byt dostupny z celeho programu.
Uzitocne linky:
Literatura:
Head first design patterns 2nd edition
Nezabudnite konzultova a aj odovzdat svoje zamery do ais miesta odovzdania, neskorsie odovzdanie NIE je mozne.
-
3. Cvicenie
Uloha 1
Stiahnite si kod (pokracovanie cvicenia 2)
Mozete pokracovat aj vo vasom projekte z minuleho cvicenia (pokial sa podarilo spravit vsetko potrebne).
Vytvorte system enchantingu pomocu rozhrani (zjednoduseneho z hry minecraft), vytvorte si najprv rozhrania a potom podla nich urobne konkretnu implementaciu. Postupujte systematicky (ako bolo vysvetlene na konci prednasky).
- Zmente Enchantment na rozhranie (diskutujte, preco toto chceme/nechceme, je to dobre, nie je to dobre?)
- Majte minimalne rozhrania ktore abstrahuju nasledujuce veci/udalosti/vlastnosti/atd:
- Enchantment
- To ze objekt moze byt vylepseny
- Kontrola ci objekt bol vylepseny
- Iny objekt vie aplikovat vylepsenie
- Iny objekt vie zrusit vylepsenie
- Objekt moze mat aplikovanych viacero vylepseni (pouzite napriklad ArrayList)
- Implementujte aspon 2 rozne typy vylepseni (mozete aj viac), ktore mozu mat rozne urovne
Uloha 2
Vytvorte si novy projekt a experimentujte s modifikatormi pristupu (k triedam, atributom, metodam a konstruktorom).
Budete potrebovat viacero balickov a viacero hierarchii dedenia. Mozete byt kreativni (budte!).
Uloha 3
Konzultujte zamer Vasho projektu.
-
2. Cvicenie (piliere OOP)
Zadanie
Naimportujte si nasledujuci zdrojovy kod do IDE:
V tomto projekte neboli (ocividne) aplikovane zakladne principy objektovo orientovaneho programovania. Zanalyzujte tento projekt a upravte ho aby splnal aspon zakladne standardy a principy OOP.
Mozete aj doimplementovat niektore chybajuce herne mechaniky, absak primarne sa sustredte na opravu povodnej implementacie.
Toto su zakladne principy OOP:
Enkapsulacia (encapsulation) – napr. nie je ziaduce pracovat priamo s datami (mimo triedy)
Dedenie (inheritance) – hladame ci vieme napr. vytvorit nadriedu z ktorej vieme zdedit (prebrat) jej vlastnosti a metody
Polymorfizmus (overriding, overloading) – potrebujem mat pri dedeni specificke spravanie v podtriede? potrebujem sa specificky rozhodovat napriklad pri utoku podla toho na koho utocim?
Abstrakcia (abstraction) – napriklad je potrebne aby bolo mozne zo vsetkych tried vytvarat objekty?
Dbajte napriklad aj na spravne clenenie tried alebo balikov.
Poznamky:
Vasa implementacia by mala splnat aj tieto poziadavky:
Meno (name) objektov nie je mozne menit. Zabezpecte aby bolo mozne meno nastavit iba pri vytvarani noveho objektu (mimo tela samotnej triedy/podtriedy).
Pokial najdete logicku chybu v implementacii, tak ju pokojne opravte.
Bonus:
Vytvorte simulaciu subojov (nahodny pocet Steve vs nahodny pocet Creeperov (nemusite dodrziavat vsetky herne mechaniky), vlasnosti mozu byt tiez inicializovane nahodne). Implementaciu mozete (pravdepodobne aj potrebujete) upravit pre potreby tejto ulohy.
Pozor! V tomto tyzdni uz ste za pracu na cviceniach hodnoteni.