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

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.

Zadání 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ávislosti log4j-api a log4j-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).
  • 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.

Zadání 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í

  1. Napište zadání své adventury (semestrální práce v souladu s instrukcemi dostupnými na webu java.vse.cz)
  2. Implemntujte třídu Batoh, do které mohou být ukládány věci Vec. 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:

  1. zkontroluje, zdali má k dispozici všechny parametry, které příkaz potřebuje a extrahuje parametry do lokálních proměnných,
  2. spustí metodu, která příkaz vykoná - v mém případě metodu HerniPlan.seberVec(String nazev): Vec,
  3. 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
  4. 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.