Projekt na skúšku - BASIC

Základný 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.

Základnú verziu projektu je nutné dokončiť pred účasťou na školení Firemný vývoj - na tomto kurze sa bude projekt kontrolovať. Pokročilý projekt vytvor len po dokončení základnej verzie

📋 Zadanie

Pre dokončenie kurzu je povinné naprogramovať základnú verziu projektu. Pokiaľ to zvládneš môžeš sa pustiť aj do pokročilej verzie. Aplikáciu s nami môžeš konzultovať na pravidelných konzultáciách do záverečnej skúšky.

Evidencia poistenia - Základná verzia (povinná)

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 (pre kurzy 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
  • 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:

Evidencia poistenia - Plná verzia (iba po dokončení základnej verzie)

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 sa prihlás na konzultáciu a preber tvoj nápad s lektorom.

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

  1. 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é.
  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 C#, Java, Python, JavaScript, PHP).
  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 C#, Java, Python, JavaScript, PHP).
  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 C#, Java, Python, JavaScript, PHP).
  6. 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#).
  7. Logika a primeraná zložitosť algoritmov - Skontroluj, či postupy nie sú zbytočne zložité a metódy nie sú príliš dlhé.
  8. 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

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.

📖 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ý.

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ý.

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:

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ý.

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 naj­neskôr 3 dni pred školením Firemný vývoj.


 

Aktivity