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

  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

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

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 naj­neskô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.


 

Aktivity