Projekt na skúšku - BASIC
Projekt odporúčame začať spracovávať po dokončení prvej časti rekvalifikačného kurzu. Pred odovzdaním projektu si skontrolujte, či spĺňa kritériá uvedené na záložke nižšie, podľa ktorých ho budeme hodnotiť.
Nezabudnite projekt odovzdať najneskôr 3 dni pred skúškou.
📋 Zadanie
Vyber si jedno zo zadaní nižšie a naprogramuj ho. Aplikáciu s nami môžeš konzultovať na pravidelných konzultáciách do záverečnej skúšky.
Evidencia poistenia - Zjednodušená verzia
Táto verzia je naozaj úplné minimum, čo by si si mal z kurzov odniesť. Môžeš s ňou začať a keď ti to pôjde dobre, skús určite aj plnú verziu.
Konzolová aplikácia (C#, Java, Python)
Naprogramuj konzolovú aplikáciu pre evidenciu poistných udalostí. Pred odovzdaním si skontroluj, že tvoj kód zodpovedá kritériám uvedeným na záložke nižšie.
Minimálne požiadavky na splnenie
- Aplikácia obsahuje správu poistených (to sú poistené
osoby, napr. "Ján Novák"):
- Vytvorenie poisteného
- Evidujte meno, priezvisko, vek a telefónne číslo
- Zobrazenie zoznamu všetkých poistených
- Vyhľadanie poisteného podľa mena a priezviska
- Vytvorenie poisteného
- Dané entity sú uložené v kolekcii v pamäti
- Aplikácia je naprogramovaná podľa dobrých praktík
- Využívajte konštruktory na inicializáciu objektov
toString()
pre ich výpis- SRP - Oddeľujte kód do samostatných tried a súborov (lekcie C#, Java, Python, JavaScript, PHP)
- SoC - Nekomunikujte s používateľom v tej istej triede, ktorá ukladá dáta (lekcie C#, Java, Python, JavaScript, PHP)
- Dodajte validácie aspoň prázdneho mena
- DRY - Neopakujte ten istý kód viackrát, ale taký kód vložte do metódy (napr. zadanie mena a priezviska sa v aplikácii môže opakovať viackrát, lekcie C#, Java, Python, JavaScript, PHP)
Editáciu a odstránenie poistených ani ukladanie dát po skončení aplikácie nie je treba riešiť.
Ukážkové obrazovky aplikácie
Pre predstavu si ukážme, ako môžu byť realizované niektoré z funkcií uvedené vyššie:
Pridanie poisteného:
Výpis všetkých poistených:
Vyhľadanie poisteného:
Webová aplikácia (JavaScript, PHP)
Naprogramuj webovú aplikáciu pre evidenciu poistných udalostí.
Minimálne požiadavky na splnenie
- Aplikácia obsahuje správu poistených (to sú poistené
osoby, napr. "Ján Novák"):
- Vytvorenie poisteného
- Evidujte meno, priezvisko, vek a telefónne číslo
- Zobrazenie zoznamu všetkých poistených
- Vytvorenie poisteného
- Dané entity sú uložené v kolekcii v pamäti (JS) alebo v databáze (PHP)
- Aplikáciu je možné pre zjednodušenie vytvoriť celú len na jednej stránke
- Aplikácia je naprogramovaná podľa dobrých praktík
Dobré praktiky
- Oddeľujte kód do samostatných tried a súborov
JavaScript
- Využívajte konštruktory na inicializáciu objektov
toString()
pre ich výpis
PHP
- Ideálne využite MVC architektúru
Ukážkové obrazovky aplikácie
Pre predstavu si ukážme, ako môže byť aplikácia realizovaná:
Evidencia poistenia - Plná verzia
Keď zvládneš vytvoriť aplikáciu podľa tohto zadania, výrazne si zvýšiš svoju úspešnosť na pohovoroch a hľadanie zamestnania ti potom zaberie len zlomok času.
Naprogramuj webovú aplikáciu pre evidenciu poistných udalostí.
Minimálne požiadavky na splnenie
- Aplikácia obsahuje kompletnú správu (CRUD) poistených
(napr. "Ján Novák") a ich poistenia (napr. "poistenie bytu"):
- Vytvorenie poisteného
- Vytvorenie poistenia
- Zobrazenie detailu poisteného vrátane jeho poistenia
- Zobrazenie detailu poistenia
- Zobrazenie zoznamu poistených
- Odstránenie poisteného vrátane všetkých jeho poistení
- Odstránenie poistenia
- Editácia poisteného
- Editácia poistenia poisteného
- Dané entity sú uložené v SQL databáze
- Aplikácia je naprogramovaná podľa dobrých praktík a je plne responzívna
Odporúčané rozšírenie
- Aplikácia podporuje používateľské role (poistený, administrátor), navrhni a implementuj, kto vidí a môže editovať aké dáta
- Aplikácia eviduje poistné udalosti poistených tiež pomocou kompletnej správy (CRUD)
Expertné rozšírenie
- Aplikácia podporuje rozlíšenie poistníkov (tých, ktorí platia poistenie) a poistených (tých, na koho sa poistenie vzťahuje). Namiesto zavedenia 2 databázových tabuliek sa zamysli nad riešením cez vymenovaný typ (enum).
- Aplikácia generuje štatistiky vo forme reportov
Ukážkové obrazovky aplikácie
Pre predstavu si ukážme, ako môžu byť realizované niektoré z funkcií uvedené vyššie:
Výpis poistených:
Detail poisteného:
Pridanie nového poisteného:
Pridanie už vytvoreného poistenia poistenému:
Vlastné zadanie
Pre schválenie vlastného zadania kontaktuj svojho študijného referenta.
❌ Najčastejšie chyby študentov
Nasledujúce chyby sú vykopírované z reálnych projektov našich študentov a sú vybrané tak, aby zastupovali najčastejšie problémy v ich projektoch. Kód je v rôznych programovacích jazykoch, avšak jazyky sú si tak podobné, že by malo byť jasné, v čom chyba spočíva, aj keď v tomto jazyku neprogramujete.
Nekonečné cykly
Nekonečné cykly sú všeobecne známa zlá praktika, kvôli ktorej je potrebné kód dodatočne skúmať, aby bolo poznať, kedy cyklus skončí, čo je neprehľadné:
✗ Nesprávne
while True: print("\nVyberte si akciu:") print("1 - Pridať nového poisteného") print("2 - Vypísať všetkých poistených") print("3 - Vyhľadať poisteného podľa mena a priezviska") print("4 - Koniec") ...
✔ Správne
while volba != "4": print("\nVyberte si akciu:") print("1 - Pridať nového poisteného") print("2 - Vypísať všetkých poistených") print("3 - Vyhľadať poisteného podľa mena a priezviska") print("4 - Koniec") ...
Alternatívne je možné použiť aj boolean premennú:
while not koniec: print("\nVyberte si akciu:") print("1 - Pridať nového poisteného") print("2 - Vypísať všetkých poistených") print("3 - Vyhľadať poisteného podľa mena a priezviska") print("4 - Koniec") ...
Nedodržanie SoC
Častou chybou študentov je, že komunikujú s používateľom v tej istej triede, ktorá slúži na prácu s dátami:
✗ Nesprávne
class EvidenciaPoistenych: def __init__(self): self.poistenie = [] def vytvor_poisteneho(self): meno = input("Zadajte meno: ") priezvisko = input("Zadajte priezvisko: ") vek = input("Zadajte vek: ") telefon = input("Zadajte telefónne číslo: ") poisteny = Poisteny(meno, priezvisko, vek, telefon) self.poistenie.append(poisteny) print("Dáta boli uložené. Pokračujte vo výbere akcie...")
✔ Správne
class EvidenciaPoistenych: def __init__(self): self.poistenie = [] def pridaj_poisteneho(self, poisteny): self.poistenie.append(poisteny) class UzivatelskeRozhranie: def __init__(self): self.evidencia = EvidenciaPoistenych() def vytvor_poisteneho(self): meno = input("Zadajte meno: ") priezvisko = input("Zadajte priezvisko: ") vek = input("Zadajte vek: ") telefon = input("Zadajte telefónne číslo: ") poisteny = Poisteny(meno, priezvisko, vek, telefon) self.evidencia.pridaj_poisteneho(poisteny) print("Dáta boli uložené. Pokračujte vo výbere akcie...")
Kód vyššie neobsahuje validácie a nespĺňa teda plne zadanie.
Nedodržanie SRP
Študentom sa občas podarí vytvoriť program iba s jednou triedou, ktorá reprezentuje poisteného. Ten zároveň vie vyhľadávať ostatných poistených a vypisovať všetkých, čo nedáva z hľadiska rozdelenia zodpovednosti (SRP) zmysel:
✗ Nesprávne
class Poistenec: meno = None priezvisko = None vek = None cislo = None def __init__(self, meno, priezvisko, vek, cislo): self.meno = meno self.priezvisko = priezvisko self.vek = vek self.cislo = cislo @staticmethod def pridaj_poisteneho(meno, priezvisko, vek, cislo): cursor.execute('INSERT INTO poistení(meno, priezvisko, vek, cislo) VALUES(?, ?, ?, ?)', (meno, priezvisko, vek, cislo)) return f"Pridané {meno} {priezvisko} {vek} {cislo} do databázy."
✔ Správne
class Poistenec: meno = None priezvisko = None vek = None cislo = None def __init__(self, meno, priezvisko, vek, cislo): self.meno = meno self.priezvisko = priezvisko self.vek = vek self.cislo = číslo class EvidenciaPoistenych: def pridaj_poisteneho(meno, priezvisko, vek, cislo): cursor.execute('INSERT INTO poistení(meno, priezvisko, vek, cislo) VALUES(?, ?, ?, ?)', (meno, priezvisko, vek, cislo)) return f"Pridané {meno} {priezvisko} {vek} {cislo} do databázy."
Zlé formátovanie
Začiatočníci mávajú problémy hlavne so správnym odsadzovaním kódu, ktorý je potom neprehľadný, pretože nie je dobre vidieť, ktorá vetva programu sa kedy spúšťa:
✗ Nesprávne
} printPersons() { const table = document.getElementById("data-table"); for (let i = 0; i < this.persons.length; i++) { const person = this.persons[i]; const row = table.insertRow(); const nameCell = row.insertCell(0); const surnameCell = row.insertCell(1); const telCell = row.insertCell(2); const ageCell = row.insertCell(3); const dateCell = row.insertCell(4); nameCell.innerHTML = person.name; surnameCell.innerHTML = person.surname; telCell.innerHTML = person.telephone; ageCell.innerHTML = person.age; dateCell.innerHTML = person.birthdate; } }
✔ Správne
} printPersons() { const table = document.getElementById("data-table"); for (let i = 0; i < this.persons.length; i++) { const person = this.persons[i]; const row = table.insertRow(); const nameCell = row.insertCell(0); const surnameCell = row.insertCell(1); const telCell = row.insertCell(2); const ageCell = row.insertCell(3); const dateCell = row.insertCell(4); nameCell.innerHTML = person.name; surnameCell.innerHTML = person.surname; telCell.innerHTML = person.telephone; ageCell.innerHTML = person.age; dateCell.innerHTML = person.birthdate; } }
Miešanie českých a anglických názvov
Existencia anglických kľúčových slov jazyka zvádza k pomenovávaniu vlastných identifikátorov tiež anglicky. Keď to tak chceme robiť, robíme to tak všade, a nie len niekde:
✗ Nesprávne
def save_to_database(self): cursor.execute(''' INSERT INTO zoznam_poistenych (meno, priezvisko, vek, telefon) VALUES (?, ?, ?, ?) ''', (self.meno, self.priezvisko, self.vek, self.telefon)) conn.commit() def odobrat_z_databazy(cls, id): cursor.execute("DELETE FROM zoznam_poistenych WHERE id = ?", (id,)) conn.commit()
✔ Správne
def save_to_database(self): cursor.execute(''' INSERT INTO zoznam_poistenych (meno, priezvisko, vek, telefon) VALUES (?, ?, ?, ?) ''', (self.meno, self.priezvisko, self.vek, self.telefon)) conn.commit() def remove_from_database(cls, id): cursor.execute("DELETE FROM zoznam_poistenych WHERE id = ?", (id,)) conn.commit()
Absencia použitia
metódy toString()
/ToString()
alebo
__str__()
Podľa zadania by triedy mali byť vypisované pomocou metódy
toString()
:
✗ Nesprávne
class Poistenec: def __init__(self, meno, priezvisko, datum_narodenia, telefonne_cislo): self.meno = meno self.priezvisko = priezvisko self.datum_narodenia = datum_narodenia self.telefonne_cislo = telefonne_cislo
✔ Správne
class Poistenec: def __init__(self, meno, priezvisko, datum_narodenia, telefonne_cislo): self.meno = meno self.priezvisko = priezvisko self.datum_narodenia = datum_narodenia self.telefonne_cislo = telefonne_cislo def __str__(self): return f"{self.meno} {self.priezvisko}"
💯 Hodnotiace kritériá
Predpokladáme, že si svoju aplikáciu pri tvorbe aspoň raz spustil a vyskúšal a teda, že funguje podľa funkčných požiadaviek vyššie. Preto sa pri hodnotení budeme zameriavať najmä na kód, ktorý si napísal, a to podľa nasledujúcich 8 kritérií. Zoznam obsahuje aj odkazy na dané lekcie, v ktorých je problematika vysvetlená.
- Pomenovanie identifikátorov - Skontroluj, či názvy premenných (lekcie C#, Java, Python, JavaScript, PHP) a názvy tried (lekcie C#, Java, Python, JavaScript, PHP) neobsahujú skratky a sú výstižne zvolené.
- Dodržanie princípov SRP, SoC - Každá trieda by mala mať len jednu zodpovednosť. Skontroluj, či nie je používateľské rozhranie v tej istej triede, ktorá pracuje s dátami (lekcie C#, Java, Python, JavaScript, PHP).
- Vhodné výbery dátových typov - Napr. telefónne číslo
nie je v skutočnosti číslo, pretože môže obsahovať predvoľbu a ďalšie
špeciálne znaky ako
+
. Ukladáš ho ako text? - Správne formátovanie kódu - Kód máš správne odsadený a má jednotný štýl zodpovedajúci konvenciám daného programovacieho jazyka (lekcie C#, Java, Python, JavaScript, PHP).
- Minimalizácia duplicitného kódu - Uisti sa, že
neopakuješ v aplikácii viackrát rovnaké alebo podobné úseky kódu, ktoré
by sa dali vyčleniť do jednej metódy, napr. že stále nekopíruješ tú
istú validáciu vstupu alebo opakujúce sa výpisy. Skontroluj absenciu
nekonečných cyklov
while (true)
a pod. (lekcie C#, Java, Python, JavaScript, PHP). - Validácia vstupných dát a ošetrenie neočakávaných vstupov - Čo keď niekto zadá prázdne meno? Pre študentov C#: Ideálne ošetri aj chybné zadanie čísel a pod. (C#).
- Logika a primeraná zložitosť algoritmov - Skontroluj, či postupy nie sú zbytočne zložité a metódy nie sú príliš dlhé.
- Prítomnosť a kvalita komentárov. - Sú tvoje triedy a ich metódy zdokumentované (lekcie C#, Java, Python, JavaScript, PHP)? Sú na kritických miestach v aplikácii komentáre?
🤝 Pravidelné konzultácie s koučom
Nemaj strach - rovnako ako v rámci štúdia lekcií a cvičení, aj tu ti s akýmkoľvek problémom radi pomôžeme. K dispozícii budeš mať pravidelné konzultácie s koučom, ktorých konkrétne dni a hodiny potom nájdeš tu:
Konkrétne časy konzultácií pre jednotlivé technológie
Pondelok
- 17:00 - 20:00 | HTML/CSS, Java - Rezervovať čas
- 17:00 - 20:00 | C# .NET, Java, JS, PHP, Python, DTB, ASP, Spring b. - Rezervovať čas
Utorok
- 17:00 - 20:00 | JavaScript, Python, Databáze, HTML/CSS, Django, React - Rezervovať čas
- 19:00 - 21:00 | Java, JavaScript, Python, Databáze, React, Spring Boot - Rezervovať čas
Streda
- 17:00 - 20:00 | Java, JavaScript, HTML/CSS, React, Spring Boot - Rezervovať čas
Štvrtok
- 16:30 - 19:30 | C# .NET, Java, PHP, Python, Databáze, Spring Boot - Rezervovať čas
Ako sa pripojiť na konzultáciu projektu
Postup pripojenia na konzultáciu týkajúcu sa projektu je rovnaký ako v
prípade štandardnej konzultácie. Po tom, čo si rezervuješ čas, sa už len
stačí v danú hodinu pripojiť na Discord server miestnosti
označenej ako Čakáreň
v sekcii Konzultácie
.
Bližšie info o tom, ako Discord nastaviť, nájdeš tu.
- Priamo do miestnosti sa potom pripojíš cez aplikáciu, viď obrázok nižšie:
Pri tvorbe projektu sa snaž nenechať si všetko až na poslednú chvíľu! Naši koučovia ti s čímkoľvek v priebehu štúdia radi pomôžu, nespoliehaj sa ale na to, že za teba projekt v mesiaci skúšky sami spracujú.
Rezervácia termínov je záväzná a preto ju neruš, pokiaľ na to nebudeš mať naozaj závažný dôvod. Ak sa tak stane, snaž sa z termínu odhlásiť vždy aspoň 24 hodín vopred. Pre každého študenta je potom vyhradená 1x polhodinová konzultácia s koučom a 1x polhodinová konzultácia projektu týždenne.
📖 Odovzdanie projektu na privátny GIT
Keď budeš mať projekt hotový, odovzdáš ho tým, že ho nahráš na GitHub do privátneho repozitára.
Repozitár nesmie byť verejný, inak tvoj projekt nebude ohodnotený!
Krok 1 - Tvorba repozitára zdieľaného s nami
Ako prvé vytvor pre projekt nový repozitár, ktorý s nami budeš zdieľať. Zaregistruj si nový účet na github.com alebo sa prihlás do existujúceho účtu, ak ho už máš. V pravom hornom rohu klikneš na tlačidlo + a z rozbaľovacej ponuky vyberieš New repository:
Následne vyplníš Repository name ako napr.
ZaverecnyProjektNovak
, z ponuky zvolíš Private a
klikneš na tlačidlo Create repository:
Repozitár nesmie byť verejný, inak tvoj projekt nebude ohodnotený!
Po vytvorení repozitára klikneš na Invite collaborators:
A ďalej na Add people:
Do vyhľadávacieho poľa zadáš itnetworkcz
a klikneš na
Add itnetwork to this repository:
Týmto si nám umožnil sa do repozitára pozrieť.
Krok 2 - Nahranie projektu do repozitára
Nahrávanie projektov do privátneho repozitára na GitHub teraz pridávame do Základných kurzov jednotlivých programovacích jazykov. K dispozícii je teraz:
- Java - Verzovací nástroj Git a IntelliJ IDEA
- PHP - Verzovací nástroj Git a NetBeans
- Python - Verzovací nástroj Git a PyCharm
- C# .NET - Verzovací nástroj Git a Visual Studio
- JavaScript - Verzovací nástroj Git a Visual Studio Code
Ak pre tvoj jazyk nie je lekcia k dispozícii, využi postup uvedený v lekcii GitHub Desktop kurzu Git.
Repozitár nesmie byť verejný, inak tvoj projekt nebude ohodnotený!
Krok 3 - Odoslanie emailu
Keďže GitHub pozvánka má obmedzenú životnosť, pre istotu ešte pošli e-mailom odkaz na repozitár svojmu študijnému referentovi najneskôr 3 dni pred záverečnou skúškou.
Krok 4 - Pozri sa na náš feedback a zapracuj pripomienky
Naši lektori ti v repozitári projektu vytvoria feedback ako súbor
hodnotenie.txt
.
Lektor tvoj repozitár tiež "ostaruje" (označí hviezdičkou), aby bolo vidieť, že je už ohodnotený. Preto svoj repozitár ty sám nestaruj.