Týden 1, 18.02.2025
- Základní pojmy
- Ovládání IDE
- Spuštění kódu
Prezentace ze cvičení: dostupná na Google drive
Týden 2, 25.02.2025
- 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, 04.03.2025
Cvičení zrušeno
Týden 4, 11.03.2025
- 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.2025 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 5, 18.03.2025
- Rozhodování
- Kolekce
- Cykly
Kód ze cvičení: dostupný na Bitbucket
Týden 6, 25.03.2025
- jUnit, testování
- Rekapitulace všeho dosavadního
- Programování
Testování
Kód ze cvičení: dostupný na Bitbucket
Zadání na cvičení (psí hotel)
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ů.
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, 01.04.2025
Průběžný test
Týden 8, 08.04.2025 (inovační den)
Týden 9, 15.04.2025
- Zahájení implementace semestrální práce
- Třída Věc
- Třída Batoh
- Vlastní příkazy
- Práce v projektu
Týden 10, 22.04.2025
- Příkaz seber
- Výjimky (
Exception
) - Práce se systémem souborů
- Práce v projektu
Týden 11, 29.04.2025
- Dědičnost
- Návrhové vzory
Týden 12, 06.05.2025
- Lambda funkce, generika
Týden 13, 13.05.2025
- 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.