Python týden
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
80 % bodů zdarma na online výuku díky naší Letní akci!

Lekce 4 - Upomínač narozenin - Logická vrstva

V minulé lekci, Upomínač narozenin - Návrh formulářů, jsme navrhli kompletně formuláře pro naši aplikaci.

V tomto tutoriálu se budeme zabývat návrhem logické vrstvy, tedy tříd, které obsahují logiku aplikace.

Osoba

V naší aplikaci budou zcela jistě figurovat osoby, vytvořme jim tedy třídu. Před třídu nezapomeňte dát modifikátor public.

Vlastnosti

Osoba bude mít 2 vlastnosti: jméno a narozeniny. Jmeno bude string, Narozeniny budou typu DateTime. Tyto vlastnosti nastavíme pomocí parametrického konstruktoru.

public class Osoba
{
    public string Jmeno { get; set; }
    public DateTime Narozeniny { get; set; }

    public Osoba(string jmeno, DateTime narozeniny)
    {
        Jmeno = jmeno;
        Narozeniny = narozeniny;
    }

}

Metody

Kromě konstruktoru bude třída disponovat metodami SpoctiVek() a ZbyvaDni().

SpoctiVek

Metoda vypočítá a vrátí aktuální věk osoby v celých letech. Výpočet bohužel není jen o tom odečíst dva datumy, jelikož TimeSpan neumí zjistit počet let, pouze počet dní. Výpočet věku tedy provedeme následujícím způsobem:

  1. Získáme si aktuální datum (bez času) pomocí DateTime.Today.
  2. Věk spočítáme jako rozdíl roků v aktuálním datu a datu narozenin. Asi je vám jasné, že tento věk není přesný. Pokud jsme se narodili 1.2.1990 a je 1.1.2010, není nám 20 let, ale jen 19. Z toho důvodu provedeme korekci.
  3. V případě, že je aktuální datum menší (dříve) než datum narození po přidání námi vypočítaných let, nastal výše uvedený případ a my věk o rok snížíme.
  4. Hotový věk vrátíme.

Kód metody bude následující.

public int SpoctiVek()
{
    DateTime dnes = DateTime.Today;
    int vek = dnes.Year - Narozeniny.Year;
    if (dnes < Narozeniny.AddYears(vek))
        vek--;
    return vek;
}

ZbyvaDni

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Metoda nám vrátí kolik dní zbývá do narozenin osoby. To zjistíme následujícím způsobem:

  1. Získáme si aktuální datum (bez času).
  2. Získáme datum dalších narozenin přičtením věku + 1 k datu narození.
  3. Data odečteme a celkový rozdíl ve dnech vrátíme. Jelikož je rozdíl typu double, musíme ho zkonvertovat na int.
public int ZbyvaDni()
{
    DateTime dnes = DateTime.Today;
    DateTime dalsiNarozeniny = Narozeniny.AddYears(SpoctiVek() + 1);

    TimeSpan rozdil = dalsiNarozeniny - DateTime.Today;

    return Convert.ToInt32(rozdil.TotalDays);
}

ToString

Jelikož budeme osoby vypisovat, přepíšeme metodu ToString() tak, aby vracela jméno osoby:

public override string ToString()
{
    return Jmeno;
}

Správce osob

Další logickou komponentou aplikace bude správce osob. Třída se bude starat o osoby, bude je umět přidávat, odebírat a jejich seznam ukládat do souboru a opětovně načíst. Konečně bude umět mezi osobami vyhledat tu, která má nejbližší narozeniny.

Přidejte si k projektu tedy třídu SpravceOsob a učiňte ji veřejnou.

Vlastnosti a atributy

Jedinou veřejnou vlastností třídy je seznam osob. Seznam je typu BindingList. S touto kolekcí jsme se v kurzu ještě nesetkali. Jedná se o chytřejší List, který na sobě umí vyvolat událost změny v případě, že se změní jeho obsah. Díky tomuto mechanismu se automaticky obnoví všechny prvky na formuláři, které mají nastavený jako zdroj dat právě tento BindingList. Asi si dokážete představit, že obnovovat ručně desítky prvků na formuláři v případě změny může být velice nepřehledné. Jakmile v naší aplikaci přidáme novou osobu, bude ihned vidět v seznamu osob aniž bychom ho obnovovali, obnoví se sám. BindingList inicializujeme v konstruktoru.

Pokud bychom chtěli implementovat i editaci osob, musela by třída Osoba implementovat rozhraní INotifyPropertyChanged. Jakákoli změna (např. jména) by se poté automaticky projevila ve všech prvcích všech formulářů, kde osoba figuruje. Tímto se však pro zjednodušení zabývat nebudeme.

Třída zatím vypadá takto:

public class SpravceOsob
{
    public BindingList<Osoba> Osoby { get; set; }

    public SpravceOsob()
    {
        Osoby = new BindingList<Osoba>();
    }

}

Metody

Kromě přidávání a odebírání bude třída umět i nalézt osobu s nejbližšími narozeninami. Ukládání a načítání osob do/ze souboru necháme na později.

Pridej()

Metoda přidá novou osobu do BindingListu. Jelikož osobu přidáváme formulářem, hodí se nám, aby metoda brala v parametrech vlastnosti osoby a na jejich základě vytvořila novou instanci. Z data narození uložíme pouze část s datem, tedy bez času.

Před přidáním zkontrolujeme, zda jméno není příliš krátké nebo není zadané datum v budoucnosti. Pokud nějaká z těchto situací nastane, vyhodíme výjimku. Právě výjimky jsou správným způsobem, jak s chybami v objektových aplikacích pracovat.

Výjimky jsou detailněji popsané v sekci Práce se soubory v C# .NET. Pokud jste se s nimi ještě nesetkali, bude vám stačit vědět, že výjimka se vyvolá pomocí klíčového slova throw, za kterým následuje instance výjimky. Výjimek máme několik typů včetně možnosti vytvořit si vlastní. V našem případě se nám hodí ArgumentException (chyba v argumentu). Do konstruktoru výjimky zadáváme text chyby. Jakmile je výjimka vyvolána, metoda již dále nepokračuje. Jak na chybu reagovat si ukážeme až budeme metodu volat z formuláře.

public void Pridej(string jmeno, DateTime datumNarozeni)
{
    if (jmeno.Length < 3)
        throw new ArgumentException("Jméno je příliš krátké");
    if (datumNarozeni.Date > DateTime.Today)
        throw new ArgumentException("Datum narození nesmí být v budoucnosti");
    Osoba osoba = new Osoba(jmeno, datumNarozeni.Date);
    Osoby.Add(osoba);
}

Odeber

Metoda odebere osobu z BindingListu. Protože vždy budeme chtít odebírat již hotovou osobu, bere metoda v parametru právě tu.

public void Odeber(Osoba osoba)
{
    Osoby.Remove(osoba);
}

NajdiNejblizsi

Metoda najde a vrátí osobu, která má nejbližší narozeniny. K vyhledání osoby v listu použijeme LINQ metodu OrderBy(), která osoby uspořádá podle toho, kolik dní zbývá do jejich narozenin. Výsledek uložíme do kolekce, jejíž typ neuvedeme a použijeme místo toho klíčové slovo var, jak je v LINQ zvykem. Následně vrátíme první osobu. Metodu bychom měli volat jen tehdy, když jsou v listu nějaké osoby. Ačkoli by z kódu mělo být jasné, co metoda dělá, můžete se samozřejmě podívat na tutoriály v sekci Kolekce a LINQ v C# .NET, kde je technologie LINQ detailně popsána.

public Osoba NajdiNejblizsi()
{
    var serazeneOsoby = Osoby.OrderBy(o => o.ZbyvaDni());
    return serazeneOsoby.First();
}

Pokračovat budeme v příští lekci, Upomínač narozenin - Propojení prezentační a logické vrstvy, kdy aplikaci zprovozníme. Dosavadní zdrojový kód je ke stažení níže.


 

Stáhnout

Staženo 1040x (342.7 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Upomínač narozenin - Návrh formulářů
Všechny články v sekci
Okenní aplikace v C# .NET ve Windows Forms
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
6 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (5)

 

 

Komentáře

Avatar
Michal Žůrek - misaz:30.10.2013 10:57

nahoře ti nefunguje odkaz na předchozí článek.

 
Odpovědět
30.10.2013 10:57
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek - misaz
David Čápka:30.10.2013 11:00

Díky, na ty jsem zapomněl :)

Odpovědět
30.10.2013 11:00
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Kit:30.10.2013 11:45

Myslím si, že by si třída Osoba měla ohlídat platná vstupní data. Asi takto:

public class Osoba {

    private string jmeno;
    private DateTime narozeniny;

    public string Jmeno {
        get {
            return jmeno;
        }
        set {
            if (value.Length < 3)
                throw new ArgumentException("Jméno je příliš krátké");
            jmeno = value;
        }
    }

    public DateTime Narozeniny {
        get {
            return narozeniny;
        }
        set {
            if (value.Date > DateTime.Today)
                throw new ArgumentException("Datum narození nesmí být v budoucnosti");
            narozeniny = value;
        }
    }

    public Osoba(string jmeno, DateTime narozeniny) {
        Jmeno = jmeno;
        Narozeniny = narozeniny;
    }
}
Odpovědět
30.10.2013 11:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:30.10.2013 11:53

Přijde mi logičtější, když to dělá ten správce. Potom by v něm byla i metoda pro editaci. Ale to je věc názoru.

Odpovědět
30.10.2013 11:53
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:30.10.2013 12:00

Budeš to nějak dál rozvíjet ? Přijde mi zbytečně používat binding list, když nevyužíváš jeho hlavní vlastnost => zahrnuje v sobě události, když něco přidáš, odebereš atd.

 
Odpovědět
30.10.2013 12:00
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
David Čápka:30.10.2013 12:03

Samozřejmě, že ho používám, je to dále vysvětlené.

Editováno 30.10.2013 12:03
Odpovědět
30.10.2013 12:03
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:30.10.2013 12:03

Když si to třída ohlídá sama, správce je zbytečný. Proč psát 5 správců pro 5 uživatelů třídy, když si vstupní data mohu ošetřit v jednom setteru? Je to ostatně jeho hlavní poslání.

Odpovědět
30.10.2013 12:03
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na David Čápka
Jan Vargovský:30.10.2013 12:04

Tak to sorry, že spamuju. Jen mě to hned zaujalo, když jsem koukal na zdrojáky :)

 
Odpovědět
30.10.2013 12:04
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:30.10.2013 18:02

Není zbytečný, někam kolekci musíš dát a metody pro vyhledávání také. Učit dávat validace do setterů se mi nelíbí, protože potom trpí rychlost aplikace. Když už tak do konstruktoru, ale zde musí být vlastnosti public z obou stran, aby fungoval serializer. Mám to rozmyšlené a vše tu má svůj smysl.

Odpovědět
30.10.2013 18:02
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:30.10.2013 18:14

Validace přece nepatří do kolekce, ale do její položky. Co když máš v té kolekci položky různých typů? Budeš do té kolekce dávat validaci každého typu? To je přece nesmysl a bylo by to děsně nepřehledné.

Validace v setterech nezdržuje víc, než validace ve správci. Toho správce totiž můžeš velmi snadno obejít, ale setter nemáš jak. Nádherné zapouzdření.

V tom případě gettery a settery vůbec nepotřebuješ. Jenom ti v kódu zaclánějí. Stačí, když ty atributy dáš public a máš to úplně to samé, jako když tam dáš get; set;

Odpovědět
30.10.2013 18:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:30.10.2013 19:05

Nevím jak ve WF ale ve WPF pomocí XAML a Binding lze dokonce krásně odchytávat vyjímky a ihned zobrazit uživateli třeba pomocí "červeného borderu" okolo textboxu. Právě například při zadávání dat :)

Odpovědět
30.10.2013 19:05
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:30.10.2013 19:26

Ještě jsem se v tom chvíli vrtal a zjistil jsem, že se mi metoda Pridej scvrkla na

public void Pridej(Osoba osoba) {
    Osoby.Add(osoba);
}

Volá se pak jednoduše

Pridej(new Osoba(jmeno, datumNarozeni.Date));

Říká se tomu Dependency Injection.

Otázkou je, k čemu je vlastně dobrá třída SprávceOsob. Zda by nebylo výhodnější použít samotnou kolekci BindingList<Osoba> a případně ji jen rozšířit dle potřeby.

Odpovědět
30.10.2013 19:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:1.11.2013 16:03

Nevím, proč to tady tak rozmazáváš, už by sis mohl zvyknout na to, že každý neprogramuje tím samým stylem, jako ty a ani nechce. Mně se zdá jako hloupost rozšiřovat složitou kolekci, když ji mohu obalit. Bez vlastností by nefungovala serializace, kdybys dělal v .NETu, tak bys to věděl. Můžeš aplikaci upravit a potom ji sem dát, tak to bude mít alespoň nějakou váhu. Každá změna má totiž za následek nutnost dalších úprav, když to dohromady nesladíš, tak tu nemá smysl střílet nějaké části kódu vytržené z kontextu.

Odpovědět
1.11.2013 16:03
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:1.11.2013 16:44

Kdyby to bylo na tvůj způsob, tak ani nepotřebuje dělat metodu přidej. Jen se odkáže na instanci spravceOsob.O­soby.Add(...)

 
Odpovědět
1.11.2013 16:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:1.11.2013 16:51

Spíš jen Osoby.Add(...), protože spravceOsob by neexistoval.

Odpovědět
1.11.2013 16:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:1.11.2013 16:55

Proč by neexistoval ? Existoval by na logické metody, které by ti třídily ty osoby, jako např. osoba s nejbližšími narozeninami atd.

 
Odpovědět
1.11.2013 16:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:1.11.2013 17:11

Takové metody patří do třídy Osoba. Kolekce jsou již vybaveny pro použití těchto metod.

Odpovědět
1.11.2013 17:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:1.11.2013 17:55

Jak můžeš mít ve třídě Osoba implementovanou metodu, která ti zjistí nejbližší narozeniny ze seznamu osob ?

Chápu, že v dnešní době LINQ a dalších vymožeností je to 1-2 řádky. Ale do Formu máš rvát jen volání metod a né logiku.

Editováno 1.11.2013 17:56
 
Odpovědět
1.11.2013 17:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:1.11.2013 18:05

Jakého Formu? Bavíme se o třídě Osoba. Kam chceš dávat logiku, když ne do objektu?

Odpovědět
1.11.2013 18:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:1.11.2013 18:14

Osoba je jen jedna a pokud vím, řešíme problém kde implementovat validaci + případnou logiku, abys mohl obsluhovat kolekci Osob. Nato většinou vytváříš nějaký controller/ma­nager/..., který spravuje všechny osoby. Jednoduše máš 20 instancí třídy Osoba a vyber mi jednu osobu, která má nejblíže narozeniny.

EDIT: Já jsem jen zvědavý kde bys chtěl narvat ty příslušné metody, které by obsluhovaly ty osoby v nějaké kolekci. Ten názor, že má být validace uvnitř objektu mám také, nemusím pak vymýšlet různé managery a implementovat logiku objektu mimo objekt.

Editováno 1.11.2013 18:18
 
Odpovědět
1.11.2013 18:14
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:1.11.2013 18:30

Stačí, když každá osoba poskytne kolekci informaci (vlastnost) o tom, za jak dlouho bude mít narozeniny. To si spočítá velmi snadno. Kolekce si už dokáže vybrat osobu s nejmenším číslem.

Odpovědět
1.11.2013 18:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:1.11.2013 18:31

Ano, ale nemusí to být jediná vlastnost. Může se to rozšířit, přidat další vlastnosti a pořád budeš rvát logiku někde tam kde nemá...

 
Odpovědět
1.11.2013 18:31
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:1.11.2013 18:45

já osobně bych taky nechal řešit osobu, za jak dlouho bude mít narozeniny spíš než nějaký controler.

Odpovědět
1.11.2013 18:45
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:1.11.2013 18:48

Takže raději budeš psát další a další managery a zpřístupňovat jim vlastnosti osob, které by se vůbec neměly zveřejňovat?

Bavíme se o OOP. Pokud chceš mít anemické objekty, ve kterých budou pouze vlastnosti, jejich gettery a settery, použij raději struct.

Odpovědět
1.11.2013 18:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:1.11.2013 18:52

Takhle ano. Ale my se bavíme o tom, jaká osoba bude mít nejdřív narozeniny ze seznamu osob...

 
Odpovědět
1.11.2013 18:52
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:1.11.2013 18:53

Proč bych nemohl zveřejňovat vlastnosti osoby ? Teď podle té Funebrakovy odpovědi se možná celou dobu bavíme každý o nečem jiném

 
Odpovědět
1.11.2013 18:53
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:1.11.2013 19:00

Co jsem pochopil, tak řešíte která osoba bude mít první narozeniny. Opravte mě jestli se pletu :D

Odpovědět
1.11.2013 19:00
Neaktivní uživatelský účet
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:1.11.2013 19:09

Protože gettery a settery porušují zapouzdření objektů.

Odpovědět
1.11.2013 19:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:1.11.2013 19:15

ale zas je blbost aby bylo všechno top secret.

 
Odpovědět
1.11.2013 19:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:1.11.2013 19:49

Jistě, ale také je blbost, aby třída měla 20 atributů, 20 getterů a 20 setterů a žádné metody. V tom případě skutečně struct poslouží mnohem lépe.

Následující kód není návodem, ale je jen ukázkou, jak se dá snadno nahradit anemická třída strukturou.

using System;

class Struct {
    struct Osoba {
        public string Jmeno;
        public DateTime Narozeniny;

        public Osoba(string jmeno, DateTime narozeniny) {
            Jmeno = jmeno;
            Narozeniny = narozeniny;
        }

        public string naroz() {
            return Jmeno + " má narozeniny " + Narozeniny;
        }
    }

    static void Main(string[] args) {
        Osoba os = new Osoba("Adam", new DateTime(2013, 11, 1));
        Console.WriteLine(os.naroz());
    }
}

Vlastnosti mohou být v tomto případě i private a mít i gettery/settery.

Odpovědět
1.11.2013 19:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
kamo20101
Člen
Avatar
kamo20101:18.5.2014 18:16

mam dotaz...ked mam v listboxe nacitane data z bindinglistu tak sa asi nebude dat nastavit listbox.sorted ?

 
Odpovědět
18.5.2014 18:16
Avatar
wolf661
Člen
Avatar
wolf661:2.7.2014 0:50

Nazdar. Na BindingList potrebujem pridat nejaky using ... Existuje nato nejaky jednoduchy sposob(okrem googlenia) ako ho pridat vo Visual Studiu 2010 express? V jave pri pouziti NetBeans mi import-y navrhne automaticky vo VS using-y nie, je to dost flustrujuce.

Odpovědět
2.7.2014 0:50
Situácia normálna, všetko v hajzli.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na wolf661
Jan Vargovský:2.7.2014 1:30

Napsat to přesně jak se jmenuje a pak ti to samo VS nabídne. Najedeš na to myší a tam ti to nabídne. Nebo verze pomocí klávesnice ctrl + tečka a pak enter.

 
Odpovědět
2.7.2014 1:30
Avatar
Michal Štěpánek:18.3.2015 11:34

Jak by se řešil ten BindingList, resp. přidávání záznamů v případě použití databáze, kde by byly osoby identifikovány IDčkem (autoincrement), které překvapivě v době ukládání neznám?

Odpovědět
18.3.2015 11:34
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Daniel Borner:11.12.2015 22:28

Ahoj, chci se zeptat, proč v metodě ZbyvaDni vytváříme tuto proměnou.

DateTime dnes = DateTime.Today;

Nikde dále tuto proměnou nevyužíváme, není tam zbytečná?

 
Odpovědět
11.12.2015 22:28
Avatar
Daniel Borner:16.12.2015 21:03

Můj komentář byl asi trochu zapomenut, dokázal by mi někdo odpovědět? :) děkuji

 
Odpovědět
16.12.2015 21:03
Avatar
Odpovídá na Daniel Borner
Michal Štěpánek:16.12.2015 21:50

V podstatě by to šlo i bez této proměnné, ale hned v dalším řádku je použita pro výpočet věku...

public int SpoctiVek()
{
        DateTime dnes = DateTime.Today;
        int vek = dnes.Year - Narozeniny.Year;
        if (dnes < Narozeniny.AddYears(vek))
                vek--;
        return vek;
}
Odpovědět
16.12.2015 21:50
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Daniel Borner:17.12.2015 20:17

Tam ano, tam to chápu, ale já se ptal na metodu ZbyvaDni(), kde je taky vytvořená, ale není nijak využitá. (podle mě)

public int ZbyvaDni()
{
        DateTime dnes = DateTime.Today;
        DateTime dalsiNarozeniny = Narozeniny.AddYears(SpoctiVek() + 1);

        TimeSpan rozdil = dalsiNarozeniny - DateTime.Today;

        return Convert.ToInt32(rozdil.TotalDays);
 
Odpovědět
17.12.2015 20:17
Avatar
Odpovídá na Daniel Borner
Michal Štěpánek:18.12.2015 9:05

Ano, tam se vytváří zbytečné. Myslím si, že to chtěl David udělat přehledné a pak zapomněl tu proměnnou použít.

Odpovědět
18.12.2015 9:05
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Peter Kováčik:20.11.2016 11:06

Môže niekto poslať celý kód programu?

 
Odpovědět
20.11.2016 11:06
Avatar
Odpovídá na Peter Kováčik
Michal Haňáček:20.11.2016 11:27

Vždyť jsou zdrojáky ke stažení ...

Odpovědět
20.11.2016 11:27
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Martin Samiec:6.7.2017 15:21

Ahojky všem. Mám Microsoft Visual 2015. a jeden kód který je tady uveden už nejde v 2015ce implikovat. A to konkrétně metoda NajdiNejblizsi(). Předkládám upravenou verzi:

public Osoba NajdiNejblizsi()
{
var serazeneOsoby = (from o in Osoby
orderby o.ZbyvaDni()
select o).First();
return serazeneOsoby;
}

Ať se daří... :-)

 
Odpovědět
6.7.2017 15:21
Avatar
Odpovídá na Martin Samiec
Michal Štěpánek:6.7.2017 16:26

A proč by neměl jít ve VS2015? Jestli ti nešel, tak sis tam něco špatně napsal. Mě šel normálně...

Odpovědět
6.7.2017 16:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
František Hejský:27.8.2017 22:02

Jak mám vytvořit tu třídu? Nemůžu to nikde najít :(

 
Odpovědět
27.8.2017 22:02
Avatar
Robert Landa
Člen
Avatar
Robert Landa:25.1.2018 17:04

Ještě bych dodal, že je potřeba použít knihovnu "using System.Componen­tModel" pro BindingList, ale kdo hledá a není pouhý opisovač vždy najde :)

 
Odpovědět
25.1.2018 17:04
Avatar
Alvaro Luis
Člen
Avatar
Alvaro Luis:29.11.2018 21:09

Tohle je kód formuláře OsobaForm, že?

 
Odpovědět
29.11.2018 21:09
Avatar
Odpovídá na Alvaro Luis
Reaktivní uživatel:29.11.2018 21:57

Nevidím tam ani jeden kousek kódu, který by se měl dávat do formuláře.

V naší aplikaci budou zcela jistě figurovat osoby, vytvořme jim tedy třídu.

Přidejte si k projektu tedy třídu SpravceOsob a učiňte ji veřejnou.

Odpovědět
29.11.2018 21:57
Kdo je připraven, toho zaskočí něco jiného
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 48 zpráv z 48.