Projekty ku kurzom

Informace k projektům

Projekty
- Sú súčasťou iba niektorých kurzov.
- Nie sú povinné pre dokončenie kurzu.
- Rozširujú balík edukačných materiálov.
- Môžete ich využiť na vlastnú prezentáciu pri hľadaní zamestnania.

Programátorské kurzy

Tvorba webových aplikácií v jazyku Java a Python

📋 Zadanie Python a Java

Evidencia poistenia - Základná verzia - Konzolová aplikácia

Naprogramuj konzolovú aplikáciu pre evidenciu poistných udalostí.

Základný projekt odporúčame začať spracovávať po dokončení prvej časti rekvalifikačného kurzu. Pred prezentáciou projektu zamestnávateľovi projektu si skontrolujte, či spĺňa kritériá uvedené na záložke nižšie. .[check]

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
  • 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 Java, Python)
    • SoC - Nekomunikujte s používateľom v tej istej triede, ktorá ukladá dáta (lekcie Java, Python)
    • 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 Java, Python)

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:

Evidencia poistenia - Plná verzia - webová aplikácia

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.

K vytvoreniu plnej verzie je potrebné naštudovať si bonusový e-learning, prípadne využiť umelú inteligenciu.
Python
Tvorba webov v Django frameworku pre Python
Java
Základy Spring Boot frameworku pre Javu
Databáza a Hibernate v Spring Boot

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:

❌ 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 slovenský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á.

  1. Pomenovanie identifikátorov - Skontroluj, či názvy premenných (lekcie Java, Python) a názvy tried (lekcie Java, Python) neobsahujú skratky a sú výstižne zvolené.
  2. 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 Java, Python).
  3. 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?
  4. 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 Java, Python).
  5. 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 Java, Python).
  6. Logika a primeraná zložitosť algoritmov - Skontroluj, či postupy nie sú zbytočne zložité a metódy nie sú príliš dlhé.
  7. Prítomnosť a kvalita komentárov. - Sú tvoje triedy a ich metódy zdokumentované (lekcie Java, Python)? Sú na kritických miestach v aplikácii komentáre?

Neprogramátorské kurzy

Kybernetická bezpečnosť

Kurz obsahuje dva projekty. Zadanie sa nachádza v e-learningových moduloch:

Tvorba WWW stránok (Webmaster)

Datová analýza

Konzultácie a GitHub

🤝 Konzultácie s lektorom

Postup pripojenia na konzultáciu týkajúci 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čené ako Čakáreň v sekcii Konzultácie. Bližšie info o tom, ako Discord nastaviť nájdeš tu.

Rezervovať konzultáciu

Pri tvorbe projektu sa snaž nenechať si všetko až na poslednú chvíľu! Naši koučovia tí 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ľ pre to nebudeš mať naozaj závažný dôvod. Pokiaľ 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.

📖 Nahranie projektu na súkromný Git

Projekt môžeš novému zamestnávateľovi prezentovať tak, že ho nahráš do súkromného (privátneho) repozitára na GitHube a následne pozveš zamestnávateľa do tohto repozitára, aby si projekt mohol prezrieť.

Repozitár nesmie byť verejný.

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:

Ak pre tvoj jazyk nie je lekcia k dispozícii, využi postup uvedený v lekcii GitHub Desktop kurzu Git.


 

Aktivity