5. díl - Upomínač narozenin v JavaFX - Logická vrstva

Java JavaFX Upomínač narozenin v JavaFX - Logická vrstva

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Upomínač narozenin v JavaFX - Formuláře podruhé, jsme navrhli formulář pro naši aplikaci. V tomto tutoriálu se budeme zabývat návrhem logické vrstvy, tedy tříd, které obsahují logiku aplikace.

Datum

Jelikož práce s datem a časem je v Javě poměrně nepohodlná, přidejme si k projektu kratičkou statickou třídu, která nám ulehčí práci.

public class Datum {

    private static DateFormat formatData = new SimpleDateFormat("d.M.yyyy");

    public static void nastavPulnoc(Calendar datum)
    {
        datum.set(Calendar.HOUR_OF_DAY, 0);
        datum.set(Calendar.MINUTE, 0);
        datum.set(Calendar.SECOND, 0);
        datum.set(Calendar.MILLISECOND, 0);
    }

    public static String zformatuj(Calendar datum)
    {
        String datumText = formatData.format(datum.getTime());
        return datumText;
    }

    public static Calendar naparsuj(String datumText) throws ParseException
    {
        Calendar datum = Calendar.getInstance();
        datum.setTime(formatData.parse(datumText));
        return datum;
    }

}

Třída obsahuje definici formátu data. Dále umí určité datum nastavit na půlnoc (tedy vynulovat čas a datum ponechat). To se nám velmi hodí při výpočtech, jelikož často budeme chtít počítat s celými dny a čas by nám mohl výpočty rohodit).

Další dvě metody převádí mezi datem a jeho textovou podobou. Datum můžeme načíst z textu (jak ho uživatel zadal) a nebo ho jako text např. vypsat.

Osoba

V naší aplikaci budou zcela jistě figurovat osoby, třídu jsme jim již vytvořili. Pojďme jí dodat implementaci.

Vlastnosti

Osoba bude mít 2 vlastnosti: jméno a narozeniny. Jméno bude String, narozeniny budou typu Calendar. Obě vlastnosti implementujeme jako privátní atributy a vygenerujeme k nim gettery:

public class Osoba
{
        private String jmeno;
        private Calendar narozeniny;

        public String getJmeno() {
        return jmeno;
    }

        public Calendar getNarozeniny() {
        return narozeniny;
    }

}

Metody

Osoba bude mít několik metod, nyní se však omezme pouze na její konstruktor, abychom naši aplikaci co nejdříve dostali do spustitelné podoby. Později ji doplníme. Do třídy tedy přidáme parametrický konstruktor.

Konstruktor

Kromě nastavení vlastností instance bude mít konstruktor také za úkol tyto vlastnosti zvalidovat. Ukažme si jeho kód:

public Osoba(String jmeno, Calendar narozeniny) throws IllegalArgumentException
{
        Datum.nastavPulnoc(narozeniny);
        if (jmeno.length() < 3)
                throw new IllegalArgumentException("Jméno je příliš krátké");
        if (narozeniny.after(Calendar.getInstance()))
                throw new IllegalArgumentException("Datum narození nesmí být v budoucnosti");

        this.jmeno = jmeno;
        this.narozeniny = narozeniny;
}

Nejprve vynulujeme čas narozenin, aby nám nedělal při výpočtech problémy, pracovat budeme pouze s celými dny. Následně ověříme, zda není jméno příliš krátké nebo zda nejsou zadané narozeniny v budoucnosti. Pokud některá ze situací nastane, vyhodíme výjimku IllegalArgumen­tException a do jejího konstruktoru vložíme zprávu pro uživatele.

Pokud jste s výjimkami ještě nepracovali, vůbec to nevadí. Stačí vám vědět, že je to způsob, jakým se v objektových aplikacích pracuje s chybami, zejména těmi, které jsou způsobené zadáním špatné hodnoty od uživatele nebo které vznikly při práci se soubory. Vyvolání výjimky metodu okamžitě ukončí. Jak na výjimku reagovat si ukážeme dále v seriálu. Výjimky budeme vždy vyhazovat v logických třídách.

toString

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

@Override
public String toString()
{
        return jmeno;
}

Právě tato metoda je později použita ListView k výpisu jeho položek.

Správce osob

Poslední 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.

Atributy

Jedinou vlastností třídy je seznam osob. Seznam je typu ObservableList. S touto kolekcí jsme se v seriálu již setkali. Díky tomu, že budeme mít osoby právě v této kolekci, docílíme automatického obnovení všech komponent na formuláří, které s touto kolekcí pracují. Jakmile tedy např. přidáme novou osobu do ObservableListu, objeví se i v ListView. Této technice se říká binding a již víme, že nám ušetří spoustu práce s ručním obnovováním formuláře. K ObservableListu vygenerujeme getter:

Třída zatím vypadá takto:

public class SpravceOsob {

    private ObservableList<Osoba> osoby = FXCollections.observableArrayList();

    public ObservableList<Osoba> getOsoby() {
        return osoby;
    }
}

Metody

Opět do třídy vložme zatím jen ty nejdůležitější metody.

pridej a odeber

Metody pro přidání a odebrání osoby jsou naprosto triviální:

public void pridej(Osoba osoba)
{
        osoby.add(osoba);
}

public void odeber(Osoba osoba)
{
        osoby.remove(osoba);
}

Základ logické vrstvy máme hotový. V příští lekci, Upomínač narozenin v JavaFX - Propojení vrstev, si ukážeme, jak propojit logiku s formulářem a celou aplikaci zprovozníme.


 

Stáhnout

Staženo 292x (179.33 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
10 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 se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (2)

 

 

Komentáře

Avatar
David J.
Člen
Avatar
David J.:16.9.2017 15:11

Chtěl bych se zeptat, bude tutoriál aktualizovaný na používání třídy LocalDateTime, která byla doporučena v OOP tutoriálu?

 
Odpovědět 16.9.2017 15:11
Avatar
Abe
Člen
Avatar
Odpovídá na David J.
Abe:19.9.2017 19:05

To zvládneš sám :). Já, když si teď tento tutoriál procházím, místo Calendar používám LocalDate (doufám, že se tam někde nebude pracovat i s časem, to bych to musel celé předělávat na LocalDateTime :D).

 
Odpovědět 19.9.2017 19:05
Avatar
Mirka Baranová:5. března 21:06

Třída Datum s využitím LocalDate může vypadat takto:

private static DateTimeFormatter zformatovany = DateTimeFormatter.ofPattern("d.M.yyyy");

public static String zformatuj(LocalDate datum) {
    String datumText = datum.format(zformatovany);
    return datumText;
}

public static LocalDate naparsuj(String datumText) {
    LocalDate datum = LocalDate.parse(datumText, zformatovany);
    return datum;
}

A konstruktor ve třídě Osoba takto:

public Osoba(String jmeno, LocalDate narozeniny) throws IllegalArgumentException {

        if (jmeno.length() < 3){
            throw new IllegalArgumentException("Jméno je příliš krátké.");
        }
        if (narozeniny.isAfter(LocalDate.now())){
            throw new IllegalArgumentException("Narozeniny nesmí být v budoucnosti.");
        }

        this.jmeno = jmeno;
        this.narozeniny = narozeniny;
    }

Úprava dalších částí z Calendar na LocalDate je určitě jasná.

Odpovědět 5. března 21:06
Pro člověka, který je plný touhy, není nic nemožné.
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 3 zpráv z 3.