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:
- Získame si aktuálny dátum (bez času) pomocou DateTime.Today.
- 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.
- 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.
- 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:
- Získame si aktuálny dátum (bez času).
- Získame dátum ďalších narodenín pripočítaním veku + 1 k dátumu narodenia.
- 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 ObservableCollection. 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 ObservableCollection. 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. ObservableCollection () inicializujeme v konstruktoru.
Ak by sme chceli implementovať aj editáciu osôb, musela by trieda Osoba implementovať rozhranie INotifyPropertyChanged. 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 ObservableCollection. 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 ObservableCollection. 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