Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

7. diel - PRIPOMIENKOVÉ narodenín vo VB.NET WPF - Logická vrstva

V minulom dieli, PRIPOMIENKOVÉ narodenín v VB .NET WPF - Návrh okien , 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ť 4 vlastnosti: meno, narodeniny, vek a zostávajúci počet dní do najbližších narodenín. Meno bude string, Narodeniny budú typu DateTime, Vek integer a ZbyvaDni tiež integer. Prvé dve vlastnosti sú jednoduché:

Public Property Jmeno As String
Public Property Narozeniny As DateTime

Tieto vlastnosti nastavíme pomocou parametrického konstruktoru. Trieda vyzerá zatiaľ takto:

Public Class Osoba
    Public Property Jmeno As String
    Public Property Narozeniny As DateTime

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

End Class

Ďalšie dve vlastnosti nebudú obyčajnou premennú, ale budú obsahovať ďalšie logiku. Takéto vlastnosti je potom možné pomocou binding jednoducho zobrazovať na formulári.

Vek

Vlastnosť 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 vlastnosti bude nasledujúci.

Public Property Vek As Integer
    Get
        Dim aktualniDatum As DateTime = DateTime.Today
        Dim stari As Integer = aktualniDatum.Year - Narozeniny.Year
        If aktualniDatum < Narozeniny.AddYears(Vek) Then
            stari -= 1
        End If
        Return stari
    End Get

    Set(value As Integer)
    End Set
End Property

ZbyvaDni

Vlastnosť 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 Property ZbyvaDni As Integer
    Get
        Dim dnes As DateTime = DateTime.Today
        Dim dalsinarozeniny As DateTime = Narozeniny.AddYears(Vek + 1)

        Dim rozdil As TimeSpan = dalsinarozeniny - dnes
        Return rozdil.TotalDays
    End Get

    Set(value As Integer)
    End Set
End Property

ToString

Keďže budeme osoby vypisovať, prepíšeme triede ešte 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

Správca osôb disponuje tromi verejnými vlastnosťami. Prvý je zoznam osôb typu ObservableCollec­tion. 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 túto ObservableCollec­tion. 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. ObservableCollec­tion () inicializujeme v konstruktoru.

Ak by sme chceli implementovať aj editáciu 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 ObservableCollection(Of Osoba)

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

Ďalšími vlastnosťami sú DnesniDatum, ktorá vráti dnešný dátum. Ďalej NejblizsiOsoba, ktorá vráti osobu s najbližšími narodeninami. Ich kód:

Public Property NejblizsiOsoba As Osoba

Public Property DnesniDatum As DateTime
    Get
        Return DateTime.Now
    End Get

    Set(value As DateTime)
    End Set
End Property

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.

NajdiNejblizsi

Metóda nájde a uloží osobu, ktorá má najbližšie narodeniny. Na vyhľadanie osoby v zozname použijeme LINQ metódu orderby (), ktorá 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. Metódu by sme mali volať len vtedy, keď sú v zozname nejakej osoby. Bude tiež privátne, pretože ju budeme volať len vnútri triedy. Hoci by z kódu malo byť jasné, čo metóda robí, môžete sa samozrejme pozrieť na tutoriály v sekcii (dostupné iba pre C #) Kolekcia a LINQ v C# .NET, kde je technológia LINQ detailne popísaná.

Private Sub Najdinejblizsi()
    Dim serazeneOsoby = From o In Osoby Order By o.ZbyvaDni

    If serazeneOsoby.Count() > 0 Then
        NejblizsiOsoba = serazeneOsoby.First()
    Else
        NejblizsiOsoba = Nothing
    End If
End Sub

Pridajme

Metóda pridá novú osobu do ObservableCollec­tion. 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.

Pri zadávaní dáta kontrolkou DatePicker dostaneme dátum ako typ DateTime. Pokiaľ je v dátume Nothing, nebolo zadané a vyhodíme tiež výnimku.

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 = Nothing Then
        Throw New ArgumentException("Nebylo zadané datum narození")
    End If

    If datumNarozeni > 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)
    Najdinejblizsi()
End Sub

Na konci metódy vyhľadáme najbližšiu osobu, pretože to môže byť práve tá pridaná.

Odober

Metóda odoberie osobu z ObservableCollec­tion. Pretože vždy budeme chcieť odoberať už hotovú osobu, berie metóda v parametri práve tú. Po odobratí opäť obnovíme najbližšej osobu.

Public Sub Odeber(osoba As Osoba)
    Osoby.Remove(osoba)
    Najdinejblizsi()
End Sub

Pokračovať budeme nabudúce, PRIPOMIENKOVÉ narodenín v VB .NET WPF - Prepojenie vrstiev , 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é 86x (333.75 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
PRIPOMIENKOVÉ narodenín v VB .NET WPF - Návrh okien
Všetky články v sekcii
Okenné aplikácie vo VB.NET WPF
Preskočiť článok
(neodporúčame)
PRIPOMIENKOVÉ narodenín v VB .NET WPF - Prepojenie vrstiev
Č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