Týden 1, 18.09.2024
- Základní pojmy
- Ovládání IDE
- Spuštění kódu
Prezentace ze cvičení: dostupná na Google drive
Týden 2, 25.09.2024
- OOP, objekty
- Metody
- Konstruktor
- Datové atributy
- getter, setter
- metoda toString
Prezentace ze cvičení: dostupná na Google drive
Kód ze cvičení: dostupný na Bitbucket
Domácí úkol
Úkol neodevzdávejte. Zadání:
Kód v metodě main:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Deklarace a inicializace psa a boudy
System.out.println(pes.getJmeno());
// František
int objemBoudy = pes.getObjemBoudy();
System.out.println(objemBoudy);
// 4
System.out.println(pes.zastekej());
// Haf
System.out.println(pes);
// Jsem pes František dlouhý 50cm. Haf
Týden 3, 02.10.2024
- Interface
Zadání na cvičení
Katalog může držet několik (4) instancí webové stránky, knihy, časopisu, písemnosti, nebo rozhovoru.
Pomocí metody printAll()
lze vypsat celý jeho obsah a pomocí metody find(String query)
lze vypsat pouze takové položky, které vyhovují hledanému řetězci.
Protože každý typ položky, které může katalog evidovat, je svou podstatou odlišný,
má i odlišné datové atributy. Každý typ položky má být ale prohledávatelný.
Proto existuje rozhraní Searchable
, které deklaruje všem typům položek implementovat
metody getDisplayName()
, která zobrazuje název položky v katalogu,
a prepareSearchableString()
, která připraví text, ve kterém lze vyhledávat.
Protože katalog zajímají výše zmíněné metody, se všemi typy položek pracuje jako s datovým
typem Searchable
. Pokud libovolný datový typ toto rozhraní implementuje, může být jeho instance
do katalogu evidována a prohledávána. A v tom tkví význam slova rozhraní (interface
) - tedy slouží
jako rozhraní pro komunikaci mezi objekty nezávisle na jejich typu a konkrétní implementaci.
Class diagram: Zadání. V konstruktorech tříd v balíku com.example.document
jsou vynechány parametry. Ve skutečnosti je zde přidejte. Diagram by jejich výpis činil nečitelně titěrným.
Zde je kód metody Application.main(String[] args)
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Catalog catalog = new Catalog();
Book book = new Book(
"Dášeňka čili život štěněte",
"978-80-242-2614-9",
"Knižní klub",
"2009",
80
);
WebPage page = new WebPage(
"https://fis.vse.cz",
"Fakulta informatiky a statistiky – Vysoká škola ekonomická v Praze",
"Fakulta sdružuje katedry a studijní programy zabývající se informačními systémy a statistickými, ekonometrickými i dalšími matematickými metodami aplikovanými ve všech oblastech hospodářského života."
);
Document document = new Document(
"198229-2/OAM-2022",
"Rozhodnutí o udělení stipendia",
"Dne 27.02.2024 Vám bylo uděleno stipendium."
);
Interview interview = new Interview(
"Karel Čapek",
"Josef Čapek",
"KČ: Dobrý den. JČ: Ahoj., ...",
27
);
catalog.setStoredItem1(book);
catalog.setStoredItem2(page);
catalog.setStoredItem3(document);
catalog.setStoredItem4(interview);
String all = catalog.printAll();
System.out.println("Vypisuji vše:");
System.out.print(all);
System.out.println();
String query = "život";
System.out.println("Vyhledávám výraz '" + query + "':");
String result = catalog.find(query);
System.out.println(result);
Dále dávám k dispozici kód metody Catalog.find(String query)
, protože obsahuje konstrukty prozatím neprobírané:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public String find (String query) {
String result = "";
if (storedItem1.prepareSearchableString().contains(query)) {
result += " - " + storedItem1.getDisplayName() + "\n";
}
if (storedItem2.prepareSearchableString().contains(query)) {
result += " - " + storedItem2.getDisplayName() + "\n";
}
if (storedItem3.prepareSearchableString().contains(query)) {
result += " - " + storedItem3.getDisplayName() + "\n";
}
if (storedItem4.prepareSearchableString().contains(query)) {
result += " - " + storedItem4.getDisplayName() + "\n";
}
if (result.isEmpty()) {
result = "Žádný záznam nevyhovuje...";
}
return result;
}
Domácí úkol
Model dále obsahuje rozhraní Readable
. Toto rozhraní obsahuje metodu printContents()
,
která navrátí textový obsah objektu (tzn. atribut contents
).
V metodě main se dále bude nacházet tento kód:
1
2
3
4
5
6
System.out.print(
page.printContents()
);
System.out.print(
document.printContents()
);
Domácí úkol (postačí složka src
) odevzdejte do vypsané odevzdávárny v InSIS.
Hodnoceno bude vše odevzdané, tedy nejen implementace rozhraní Readable
, ale i práce z cvičení. Za úkol dostanete maximálně 5 bodů.
Alternativní program pro programátory
Programátor ví, že sebelepší kód je k ničemu, když nejsou řešeny návazné procesy, jako automatické testování, deployment, závislosti, atp. Java má pro tyto případy velmi mocný nástroj jménem Maven. Maven řeší celý životní cyklus sestavení aplikace od validace až po deployment.
- Založte projekt pomocí builderu Maven (bez archetypu, jen v nabídce build system zvolte Maven).
- Vytvořte si metodu
main
, ať máte co spustit - Nastudujte si něco málo o tom co maven umí (task runner, builder, řešení závislostí, tester, balíkovač, deployment)
- Nakonfigurujte soubor
pom.xml
tak, aby:- z namespace
org.apache.logging.log4j
pořídil závislostilog4j-api
alog4j-core
v nejnovějších verzích. - po zbuildění kódu vše zabalil do spustitelného balíku JAR (nezapomeňte na to, že musíte Mavenu říct, ať závislosti do balíku nakopíruje, jinak při spuštění skončíte na výjimce).
- z namespace
- Naprogramujte zadání ze cvičení (budete mít do 10 minut) a pomocí log4j zaprotokolujte vše, co je vyhledáváno metodou
Catalog.find(...)
. - Udělejte i tu část s domácím úkolem, projekt zabalte (včetně adresáře
target
) a pošlete do odevzdávárny v InSISu. Dostanete body jako ostatní za domácí úkol. Gitový repozitář jsem nezaložil proto, že vás nechci nutit registrovat se na Bitbucketu.
Využijte k tomu vše co můžete (dokumentaci, fóra na webu, atp.). Maven je v IntelliJ IDEA velmi dobře integrován.
Pokud nemáte potuch o existenci projektů pip (Python), bundler (Ruby), composer (PHP), npm (JavaScript), yarn (JavaScript), nebo grunt (JavaScript task runner), bude to chtít trochu více trpělivosti, dobré shrnutí co Maven je najdete např. na youtube.
Týden 4, 09.10.2024
- Rozhodování
- Kolekce
- Cykly
Kód ze cvičení: dostupný na Bitbucket
Týden 5, 16.10.2024
- Rekapitulace všeho dosavadního
- Programování
Zadání na cvičení
Psí hotel. Hotel může ubytovávat psi, dokud se rozměrově a kapacitně vejdou do nějaké boudy. Když boudy dojdou, lze do hotelu přidat další, ale pouze tolik, kolik boud se rozměrově do hotelu vejde. Existují tři typy psích boud, přičemž každá má jiné rozměry a jinou ubytovací kapacitu.
Naplňte hotel boudami pro psi a ubytovávejte psi.
V metodě main používejte pouze metody objektu PsiHotel
.
Dávejte pozor na omezení maxmimálního možného objemu prostoru na boudy. A také zdali se pes (atribut Pes.delka
) do boudy vejde.
Class diagram: Zadání. Konstruktor boudy nepotřebuje přijímat žádné parametry.
Kód ze cvičení a základ pro domácí úkol: dostupný na Bitbucket
Domácí úkol
Rozšiřte připravený kód ze cvičení (použijte mou implementaci, kterou dávám k dispozici).
Doplňte kousky kódu, kde je ponecháno v komentáři TODO s vysvětlením a implementujte rozhraní Searchable
dle zadání.
Rozhraní Searchable
(z předchozího zadání) implementují Pes
a Bouda
.
Pes
napřímo, Bouda
tak, že jej podědí/rozšíří pomocí klíčového slova extends
- tedy
interface Bouda extends Searchable
- tento řádek kódu již rozhraní Bouda obsahuje, je třeba
jej pouze odkomentovat. Třída PsiHotel
bude obsahovat metodu find (String query): String
obdobnou
předchozímu zadání s katalogem. Pomocí tohoto bude celý psí hotel prohledávatelný (psi i boudy).
Boudu lze k tomuto účelu rozšířit o nějaké konkrétní textové jméno (např. označení boudy, jako označení
pokoje v hotelu).
Bonus: Pokaždé, když se hotel bude snažit ubytovat psa, který se do žádné přítomné boudy už nevejde, všichni ubytovaní psy zaštěkají, protože se s ním o svůj prostor dělit nechtějí.
S výjimkou výrazu extends
, který je v kódu již přítomný neobsahuje toto zadání žádný neprobraný jazykový konstrukt.
Nejprve je nutné se v zadání a v kódu zorientovat, a teprve poté jej začít upravovat.
Domácí úkol (postačí složka src
) odevzdejte do vypsané odevzdávárny v InSIS.
Hodnoceno bude vše odevzdané, tedy nejen implementace rozhraní Searchable
.
Za úkol dostanete maximálně 5 bodů.
Týden 6, 23.10.2024
- jUnit, testování
Kód ze cvičení: dostupný na Bitbucket
Alternativní program pro programátory
Programátor ví, že bez adekvátního frameworku se nemá smysl o něco pokoušet. Java v tomto ohledu disponuje velmi
těžkým aparátem, který má jméno Spring, pro naše potřeby využijeme projekt
Spring Boot. V předchozím zadání jste se seznámili s mvn
,
teď jej pojďme skutečně použít.
Použijte, preferovaně, kód s katalogem, který jste odevzdali jako domácí úkol.
Vytvoříte MVC webovou aplikaci. Ze Spring Boot si přes Maven pořiďte tyto závislosti:
1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Spring je opravdu velmi těžký aparát, k sestavení aplikace disponuje pluginem pro Maven,
který doporučuji zahrnout do pom.xml
:
1
2
3
4
5
6
7
8
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Po sestavení aplikace Spring spustí Tomcat (webový server), který při výchozí konfiguraci najdete publikovaný na localhostu na portu 8080.
Jako model přepoužijte to, co máte hotové z 3. týdne. Metoda main
bude obsahovat pouze:
1
SpringApplication.run(Demo1Application.class, args);
Veškerý další kód v původní metodě main
(zamyslíte-li se, zjistíte, že je to kód, který
přesně patří do controlleru) přesuňte do controlleru
(třída označená anotací @RestController
) a výpis pošlete na web (view).
To by bylo ale nebylo moc praktické, proto výpis jen tak neposílejte na výstup, ale použijte
šablonovací engine Thymeleaf, který je se Springem perfektně integrován.
Abychom i zde následovali hramonogram cvičení,
vytvořte test case pro třídu Catalog
a pomocí metod assert*(...)
otestujte různými způsoby funkcionalitu metody
Catalog.find(String q): String
. Spuštění jednotkových testů je součástí životního cyklu sestavení Mavenu,
proto jejich výsledek uvidíte pokaždé, když spustíte task test
.
Pokud v této chíli stále máte ještě dostatek kapacity, tak použijte
ke sběru uživatelského vstupu webový formulář.
A to alespoň tak, že formulář bude požadovat vyplnění textového pole, jehož obsah pošlete jako parametr metodě
Catalog.find()
a její odpověď vypíšete na výstup.
Pokud to chcete mít hezké, použijte css framework Bootstrap. Pokud nevíte o co jde, pro tento projekt to nedělejte - čas na seznámení by byl neúměrný výsledku.
Za vyhotovení této bonusové práce nabízím bod. Nebudu ale otevírat odevzdávárnu, abych nemátl ostatní. Zabalte projekt (tedy nejen jar, ale celý kód) a zašlete mi ho e-mailem. Dostanete bod navíc.
Týden 7, 30.10.2024
Průběžný test
Týden 8, 06.11.2024 (inovační den)
Týden 9, 13.11.2024
- Zahájení implementace semestrální práce
- Třída Věc
- Třída Batoh
- Vlastní příkazy
- Práce v projektu
Kód pro základ adventury: dostupný na Bitbucket
Vysvětlení fungování kódu pro základ adventury v českém jazyce:
Základním logickou entitou je Hra
, ta, přímo, či nepřímo, obsahuje a ovládá vše ostatní.
Hraje se tak, že použijete příkaz (IPrikaz
) v souvislosti s nějakým prostorem (Prostor
).
Hra
obsahuje seznam příkazů (SeznamPrikazu
) a seznam prostorů (HerniPlan
).
Příkaz se nějak jmenuje (IPrikaz.getNazev(): String
) a něco dělá (IPrikaz.provedPrikaz(...): String
).
K tomu, aby mohl dělat něco smyslupného může vyžadovat nějaké závislosti (např. HerniPlan
), které mu
lze předat v konstruktoru.
Hení plán je pouze “trochu chytřejším” seznamem prostorů. Všechny hře dostupné prostory inicializuje a nastavuje jejich vlastnosti. Dále si pamatuje, který prostor je ve hře právě aktuální.
Každý prostor se nějak jmenuje (Prostor.getNazev(): String
) a pamatuje si, které prostory s ním
sousedí (kód těmto prostorům říká východy).
Aby bylo možné hru hrát, tak musí být její rozhraní uživateli nějakým způsobem nabídnuto. O to se stará třída
TextoveRozhrani
, která obaluje třídu Hra
, čte příkazy z příkazové řádky, předává je hře a jejich
výsledek opět do příkazové řádky vypíše, a to do té doby, dokud hra nezahlásí “konec”.
Další instukce (zmínku o PMD neberte v potaz) jsou uvedeny na webu java.vse.cz.
Na tomto cvičení společně implementujeme třídu Vec
, která se, dle zadání, může nacházet v prostoru.
!!! Velmi důležité: Do příštího cvičení
- Napište zadání své adventury (semestrální práce v souladu s instrukcemi dostupnými na webu java.vse.cz)
- Implemntujte třídu
Batoh
, do které mohou být ukládány věciVec
. Myslte na to, že do batohu se nevejde vše, má jen omezenou kapacitu. Věc také nemusí být nutně přenositelná.
Týden 10, 20.11.2024
- Příkaz seber
- Výjimky (
Exception
) - Práce se systémem souborů
- Práce v projektu
Implementace vlastního příkazu
Vlastní příkaz vytvoříte tak, že implementujete rozhraní IPrikaz
.
Implementace tohoto rozhraní vyžaduje dvě metody.
První z nich IPrikaz.getNazev(): String
navrací název příkazu, tedy např.:
1
2
3
4
@Override
public String getNazev() {
return "seber";
}
Druhá metoda IPrikaz.provedPrikaz(String... parametry): String
má za úkol vykonat to, co je od příkazu očekáváno.
Za tímto účelem tato metoda obdrží libovolné množství textových parametů parametry[]: String
,
které jsou přístupné jako pole (učebnice strana 339). Má interpretace příkazu seber udělá postupně 4 činnosti:
- zkontroluje, zdali má k dispozici všechny parametry, které příkaz potřebuje a extrahuje parametry do lokálních proměnných,
- spustí metodu, která příkaz vykoná - v mém případě metodu
HerniPlan.seberVec(String nazev): Vec
, - ošetří výjimky, které mohou při zpracování této metody nastat, a pokud nastanou, vrátí jejich zprávu jako výstup příkazu, a
- vrátí zprávu o úspěšném vykonání příkazu, včetně dalších užitečných informací.
Implementace příkazů se bude u každé adventury lišit podle toho, co je v konkrétním případě potřeba. Ukázka mé interpretace příkazu seber:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public String provedPrikaz(String... parametry) {
if (parametry.length == 0) {
// pokud chybí druhé slovo (název věci), tak ....
return "Co mám sebrat - musíš napsat název věci, kterou mám sebrat.";
}
String nazev = parametry[0];
try {
this.plan.seberVec(nazev);
} catch (IllegalStateException exception) {
return exception.getMessage();
}
return "Věc '" + nazev + "' je nyní v batohu.\n" +
this.plan.getPopisObsahuBatohu();
}
Jak je z předchozího popisu, a z řádku 11 v ukázce zřejmé, příkaz je jen rozhraním pro uživatele, aby mohl spouštět
konkrétní funkcionalitu, kterou program obsahuje. Tato funkcionalita tedy musí být naprogramována a někam ve struktuře
programu umístěna. V tomto případě je to objekt typu HerniPlan
. Umístění funkcionality ve struktuře programu
je zcela ve vaší dikci a mělo by být takové, jaké z pohledu objektově orientovaného programování dává smysl.
Vyhněte se návrhovému vzoru God Class, což je jedna třída (zde se nabízí HerniPlan
),
která dělá vše, One Class to rule them all, and in the darkness bind them.
Automatické hraní ze souboru
Předmětem tohoto cvičení bude dále nastavení automatického hraní ze souboru. Hra bude číst textový soubor po řádcí a v každém řádku bude uveden jeden příkaz. Důvod, proč je implementace tohoto žádoucí je ten, aby bylo možné se při vývoji adventury soustředit na funkcionalitu aplikace a při každém pokusu o její otestování nebylo nutné manuálně hrát hru až do stavu, který testujete.
Níže uvedený úryvek kódu je implementací automatického hraní ze souboru.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public void hrajZeSouboru (String nazevSouboru) {
try (
// Dekorace (rozšiřování funkcionality) třídy FileReader třídou BufferedReader
BufferedReader cteni = new BufferedReader(new FileReader(nazevSouboru));
// Dekorace (rozšiřování funkcionality) třídy FileWriter třídou PrintWriter
PrintWriter zapis = new PrintWriter(new FileWriter("vystup.txt"))
) {
System.out.println(hra.vratUvitani());
zapis.println(hra.vratUvitani());
// Dokud je ve vstupním souboru další řádek textu, nebo hra neskončila, prováděj cyklus.
for (String radek = cteni.readLine(); radek != null && !hra.konecHry(); radek = cteni.readLine())
{
// Vypiš příkaz do výstupu
System.out.println("> " + radek);
zapis.println("> " + radek);
// Zpracuj příkaz
String vystup = hra.zpracujPrikaz(radek);
// Vypiš výsledek příkazu do výstupu
System.out.println(vystup);
zapis.println(vystup);
}
System.out.println(hra.vratEpilog());
zapis.println(hra.vratEpilog());
} catch (FileNotFoundException e) {
File file = new File(nazevSouboru);
System.out.println("Soubor nebyl nalezen!\nProhledávaná cesta byla: " + file.getAbsolutePath());
} catch (IOException e) {
System.out.println("Nelze hrát hru ze souboru, něco se pokazilo: " + e.getMessage());
}
}
V ideálním případě by adventura měla fungovat jak v režimu automatického hraní, kdy se příkazy vyčítají ze souboru (na každý řádek jeden příkaz viz ukázka, např. soubor “hra.txt” v kořenovém adresáři projektu), tak ve standardním režimu přímé interakce uživatele s hrou.
seber koště
jdi les
konec
Toho lze dosáhnout např. tak, že pokud je aplikaci předán vstupní parametr, který obsahuje cestu ke zdrojovému
souboru s příkazy, tak se hra bude hrát sama dle toho, jak jí to tento soubor diktuje. +- (spíše -, ale bez větších
úprav v kódu bychom ideálního stavu nedosáhli) vhodné místo k umístění kódu, jež hraje automaticky je třída
TextoveRozhrani
. Poté lze v metodě main
uvést zhruba toto:
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args)
{
IHra hra = new Hra();
TextoveRozhrani ui = new TextoveRozhrani(hra);
if (args.length == 0) {
ui.hraj();
} else {
// Hra může přejímat jeden parametr, takže
// args[0] obsahuje hodnotu např. "hra.txt"
ui.hrajZeSouboru(args[0]);
}
}
Domácí úkol
Implementujte příkazy (implementace rozhraní cz.vse.adventura.logika.IPrikaz
) dle zadání:
- Příkaz polož: Vyjme věc z batohu a vloží do aktuálního prostoru
- Příkaz vypiš: Přejímá jeden parametr, který může nabývat minimálně těchto hodnot:
- prostor: Vypíše vše, co je v prostoru (věci, východy, …?)
- batoh: Vypíše vše, co je v batohu (věci, …?)
- Další 3 vlastní příkazy dle svého odevzdaného zadání adventury
Domácí úkol (postačí složka src
) odevzdejte do vypsané odevzdávárny v InSIS.
Hodnocen bude každý implementovaný příkaz jedním bodem.
Za úkol dostanete maximálně 5 bodů.
Alternativní program pro programátory
Minule jste se seznámili s frameworkem Spring Boot. V dnešním cvičení jej použijte pro komunikaci vytvoření API, skrze které bude možné hrát adventuru.
Založte projekt, použijte Spring initializr, buďto webovou verzi, nebo preferovaně průvodce v IntelliJ. Použijte Maven, Spring Boot 3.0.5, závislosti vyberte:
- Spring Web - REST funkcionalita
- Lombok - zjednodušení režijního kódu
- Springdoc - implementace dokumentace Swagger OpenAPI a Swagger UI
- a cokoliv dalšího se vám líbí, s tímto si ale vystačíte.
Springdoc (asi není součástí Spring initializru):
1
2
3
4
5
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
</dependency>
Vytvořte Controller(y?) s anotací @RestController
, které budou umět zpracovávat příkazy adventury přes REST api.
Strukturu API si navrhněte sami. Nepotřebujete REST klienta jako Postman, protože Springdoc,
jakožto implementace Swaggeru spouští (pokud to nezakážete) na http://localhost:8080/swagger-ui.html
Swagger UI, kde uvidíte kompletní dokumentaci
vašeho API včetně interaktivního formuláře, na kterém můžete požadavky rovnou testovat.
Ideálně výsledek nahrajte někam na Github, nebo Bitbucket a pošlete mi odkaz mailem.
Týden 11, 27.11.2024
- Dědičnost
- Návrhové vzory
Kód ze cvičení: dostupný na Bitbucket
Dědičnost
Učebnice strana 261
Návrhové vzory
Zdroje: Učebnice strana 214, kniha Java Design Patterns dostupná zdarma v elektronické podobě přes knihovnu VŠE, případně kniha Návrhové vzory – 33 vzorových postupů pro objektové programování. Pro zájemce kultovní publikace Design Patterns Elements of Reusable Object-Oriented Software, jejíž obsah je velmi pěkně shrnut na DigitalOcean.
- Utility class - Knihovna, bezstavová třída nabízející funkcionalitu.
- Factory - Pomocná třída pro vytvoření instance nějakého objektu.
- Singleton - Třída, která může mít pouze jednu instanci.
- Enum - Výčtový (číselníkový) typ. Seznam hodnot bez potřeby další funkcionality. V Javě samostatný jazykový konstrukt
enum
. - Iterator - Procházení objektů. Už jsme se setkali např. s kolekcemi. V Javě implementace
Iterator<E>
. - Observer - Model “subscription” - registrace k odebírání událostí a následné notifikace
- Decorator - Dynamické obohacení objektu o další funkcionalitu
- Facade - Ucelování a zjednodušování přístupu k funkcionalitě programu.
Rozdíl v účelu návrhových vzorů Observer a Decorator nemusí být bez jejich hlubšího porozumnění zřejmý. Při nekorektním použití mohou oba tyto vzory dosáhnout obdobného výsledku, avšak vzor Observer je vhodný k synchronizaci změn stavů mezi objekty ve vztahu 1:N, zatímco vzor Decorator je vhodný k dynamickému rozšíření funkcionality původního objektu, a to bez změny jeho rozhranní.
Domácí úkol
V rámci své semestrální práce (adventury) implementujte
- dědičnost alespoň u dvou různých tříd (tzn. budou dědit funkcionalitu od různých předků). V kódu označte, např. formou komentáře, že tato část kódu je součástí domácího úkolu.
- vyberte si tři návrhové vzory ze zde uvedeného seznamu a implementujte je (např. Singleton pro batoh - je-li ve vašem případně vhodné, atp.). V kódu označte, např. formou komentáře, že tato část kódu je součástí domácího úkolu.
Domácí úkol (postačí složka src) odevzdejte do vypsané odevzdávárny v InSIS. Hodnocena bude každá dědičnost a implementace návrhového vzoru jedním bodem. Za úkol dostanete maximálně 5 bodů.
Týden 12, 04.12.2024
- Lambda funkce, generika
Týden 13, 13.12.2024
- Opakování
- Práce na adventuře
- Možnost konzultovat otázky o programování, souvislostech s řízením podnikové informatiky, zaměstnání programátora, atp.