IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

4. diel - PRIPOMIENKOVÉ narodenín v VB.NET - Logická vrstva

V minulom dieli, PRIPOMIENKOVÉ narodenín v VB.NET - Návrh formulárov , sme navrhli kompletne formuláre pre našu aplikáciu.

V tomto dieli sa budeme zaoberať návrhom logické vrstvy, teda tried, ktoré obsahujú logiku aplikácie.

Osoba

V našej aplikácii budú celkom iste figurovať osoby, vytvorme im teda triedu.

Vlastnosti

Osoba bude mať 2 vlastnosti: meno a narodeniny. Meno bude String, Narodeniny budú typu DateTime. Tieto vlastnosti nastavíme pomocou parametrického konstruktoru.

Public Class Osoba
    Public Jmeno As String
    Public Narozeniny As DateTime

    Public Sub New(jmeno As String, narozeniny As DateTime)
        Me.Jmeno = jmeno
        Me.Narozeniny = narozeniny
    End Sub
End Class

Metódy

Okrem konstruktoru bude trieda disponovať metódami SpoctiVek () a ZbyvaDni ().

SpoctiVek

Metóda vypočíta a vráti aktuálne vek osoby v celých rokoch. Výpočet bohužiaľ nie je len o tom odpočítať dva dátumy, pretože TimeSpan nevie zistiť počet rokov, iba počet dní. Výpočet veku teda vykonáme nasledujúcim spôsobom:

  1. Získame si aktuálny dátum (bez času) pomocou DateTime.Today.
  2. Vek spočítame ako rozdiel rokov v aktuálnom dátume a dátume narodenín. Asi je vám jasné, že tento vek nie je presný. Ak sme sa narodili 1.2.1990 a je 1.1.2010, nie je nám 20 rokov, ale len 19. Z toho dôvodu vykonáme korekciu.
  3. V prípade, že je aktuálny dátum menšia (skôr) ako dátum narodenia po pridaní nami vypočítaných rokov, nastal vyššie uvedený prípad a my vek o rok znížime.
  4. Hotový vek vrátime.

Kód metódy bude nasledujúci.

Public Function SpocitejVek() As Integer
    Dim dnes = DateTime.Today
    Dim vek = dnes.Year - Me.Narozeniny.Year
    If dnes < Narozeniny.AddYears(vek) Then
        vek -= 1
    End If
    Return vek
End Function

ZbyvaDni

Metóda nám vráti koľko dní zostáva do narodenín osoby. To zistíme nasledujúcim spôsobom:

  1. Získame si aktuálny dátum (bez času).
  2. Získame dátum ďalších narodenín pripočítaním veku + 1 k dátumu narodenia.
  3. Dáta odčítame a celkový rozdiel v dňoch vrátime. Keďže je rozdiel typu double, musíme ho skonvertovať na int.
Public Function ZbyvaDni() As Integer
    Dim dnes = DateTime.Today
    Dim dalsiNarozeniny As DateTime = Narozeniny.AddYears(SpocitejVek() + 1)

    Dim rozdil As TimeSpan = dalsiNarozeniny - dnes

    Return Convert.ToInt32(rozdil.TotalDays)
End Function

ToString

Keďže budeme osoby vypisovať, prepíšeme metódu toString () tak, aby vracala meno osoby:

Public Overrides Function ToString() As String
    Return Jmeno
End Function

Správca osôb

Ďalšie logickú komponentom aplikácia bude správca osôb. Trieda sa bude starať o osoby, bude ich vedieť pridávať, odoberať a ich zoznam ukladať do súboru a opätovne načítať. Konečne bude vedieť medzi osobami vyhľadať tú, ktorá má najbližšie narodeniny.

Pridajte si k projektu teda triedu SpravceOsob.

Vlastnosti a atribúty

Jedinou verejnú vlastnosťou triedy je zoznam osôb. Zoznam je typu BindingList. S touto kolekciou sme sa v seriáli ešte nestretli. Jedná sa o múdrejší list, ktorý na sebe vie vyvolať udalosť zmeny v prípade, že sa zmení jeho obsah. Vďaka tomuto mechanizmu sa automaticky obnoví všetky kontrolky na formulári, ktoré majú nastavený ako zdroj údajov práve tento BindingList. Asi si dokážete predstaviť, že obnovovať ručne desiatky kontroliek na formulári v prípade zmeny môže byť veľmi neprehľadné. Akonáhle v našej aplikácii pridáme novú osobu, bude ihneď vidieť v zozname osôb bez toho aby sme ho obnovovali, obnoví sa sám. BindingList inicializujeme v konstruktoru Osoby. BindingList bude vyžadovať import System.Componen­tModel. Visual štúdio ho importuje za vás, stačí mu to povedať cez chytrou značku.

Múdra značka vo Visual Studiu - Okenné aplikácie vo VB.NET Windows Forms

Ak by sme chceli implementovať aj editácia osôb, musela by trieda Osoba implementovať rozhranie INotifyProper­tyChanged. Akákoľvek zmena (napr. Mená) by sa potom automaticky prejavila vo všetkých indikátoroch všetkých formulárov, kde osoba figuruje. Týmto sa však pre zjednodušenie zaoberať nebudeme. Trieda zatiaľ vyzerá takto:

Public Class SpravceOsob
    Public Property Osoby As BindingList(Of Osoba)

    Public Sub New()
        Osoby = New BindingList(Of Osoba)
    End Sub
End Class

Metódy

Okrem pridávanie a odoberanie bude trieda vedieť aj nájsť osobu s najbližšími narodeninami. Ukladanie a načítanie osôb do / zo súboru necháme na neskôr.

Pridajme

Metóda pridá novú osobu do BindingListu. Keďže osobu pridávame formulárom, hodí sa nám, aby metóda brala v parametroch vlastnosti osoby a na ich základe vytvorila novú inštanciu. Z dátumu narodenia uložíme iba časť s dátumom, teda bez času.

Pred pridaním skontrolujeme, či meno nie je príliš krátke alebo nie je zadaný dátum v budúcnosti. Ak nejaká z týchto situácií nastane, vyhodíme výnimku. Práve výnimky sú správnym spôsobom, ako s chybami v objektových aplikáciách pracovať.

Výnimky sú detailnejšie popísané v sekcii Práca so súbormi v VB.NET. Ak ste sa s nimi ešte nestretli, bude vám stačiť vedieť, že výnimka sa vyvolá pomocou kľúčového slova Throw, za ktorým nasleduje inštancie výnimky. Výnimiek máme niekoľko typov vrátane možnosti vytvoriť si vlastný. V našom prípade sa nám hodí ArgumentException (chyba v argumentu). Do konstruktoru výnimky zadávame text chyby. Akonáhle je výnimka vyvolaná, metóda už ďalej nepokračuje. Ako na chybu reagovať si ukážeme až budeme metódu volať z formulára.

Public Sub Pridej(jmeno As String, datumNarozeni As DateTime)
    If jmeno.Length < 3 Then
        Throw New ArgumentException("Jméno je příliš krátké")
    End If
    If datumNarozeni.Date > DateTime.Today Then
        Throw New ArgumentException("Datum narození nesmí být v budoucnosti")
    End If

    Dim osoba As New Osoba(jmeno, datumNarozeni)
    Osoby.Add(osoba)
End Sub

Odober

Metóda odoberie osobu z BindingListu. Pretože vždy budeme chcieť odoberať už hotovú osobu, berie metóda v parametri práve tú.

Public Sub deber(osoba As Osoba)
    Osoby.Remove(osoba)
End Sub

NajdiNejblizsi

Metóda nájde a vráti osobu, ktorá má najbližšie narodeniny. Na vyhľadanie osoby v liste použijeme LINQ, to osoby usporiada podľa toho, koľko dní zostáva do ich narodenín. Výsledok uložíme do kolekcie, ktorej typ neuvedieme, ako je u LINQ zvykom. Následne vrátime prvú osobu.

Public Function NajdiNejblizsi() As Osoba
    Dim serazeneOsoby = From o In Osoby Order By o.ZbyvaDni

    Return serazeneOsoby.First()
End Function

Pokračovať budeme nabudúce, PRIPOMIENKOVÉ narodenín - Prepojenie prezentačnej a logické vrstvy , kedy aplikáciu sprevádzkujeme. Doterajšie zdrojový kód je k stiahnutiu nižšie.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 204x (203.29 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
PRIPOMIENKOVÉ narodenín v VB.NET - Návrh formulárov
Všetky články v sekcii
Okenné aplikácie vo VB.NET Windows Forms
Preskočiť článok
(neodporúčame)
PRIPOMIENKOVÉ narodenín - Prepojenie prezentačnej a logické vrstvy
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity