NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Diskuze: Pochopení OOP

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
nosekt
Člen
Avatar
nosekt:9.3.2016 1:10

Ahoj,

zkoušim si jen tak blbnout s javou, konkrétně teď zkouším udělat jakousi jednoduchou simulaci bankomatu. Mám 3 třídy (Uzivatel, Bankomat, Ucet). Momentálně se snažím vymyslet metodu vyberPenize() do třídy Uzivatel.
Třída Ucet má jako atribut int penize. Pro tento atribut jsem si udělal getter a setter:

public int getPenize()
{
        return penize;
}

public void setPenize(int penize)
{
        this.penize = penize;
}

Nyní však nevím jak vymyslet metodu pro samotný výběr peněz. Co potřebuji je popsáno v komentářích, snad je to srozumitelně.

private void vyberPenize(Ucet ucet)
{
        // Tuto proměnnou potřebuji načítat z klávesnice
        int castka;

        System.out.println();

        if(castka > ucet.getPenize())
        {
                System.out.println("Nedostatek prostředků...");
        }
        else
        {
                System.out.println("Výběr peněz proběhl v pořádku...");
                // Zde potřebuji nastavit setter setPeníze na současnou hodnotu proměnné - castka
                ucet.setPenize();
        }
}

Je vůbec smysluplné načítat z klávesnice v jiné třídě než je třída s main? Jinak mě ale nenapadá jak to udělat...

Předem děkuji za pomoc

 
Odpovědět
9.3.2016 1:10
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na nosekt
Atrament:9.3.2016 1:48

Ta metoda vyberPenize patří do třídy Ucet a měla by by brát jako parametr kolik peněz se má vybrat a vracet true/false pokud se výber povedl či nepovedl. Přece jenom peníze vybíráš z účtu a ne z uživatele ;) O to načtení od uživatele kolik se má vybrat by se měl postarat Bankomat, stejně tak Bankomat uživateli vypíše pokud se pokusí vybrat více než kolik má na účtě (protože ho o této skutečnosti informuje Ucet).

Stejně jako ve skutečnosti - Bankomat vyzve uživatele aby se identifikoval (strčil kartu do slotu a zadal pin, v tvém případě proběhne nějaká zjednodušená verze) a Bankomat mu nabídne výběr hotovosti. Uživatel zadá kolik a Bankomat pošle příkaz do Uctu aby se vybralo tolik peněz. Ucet buď má dostatek peněz, pak si je odečte a vrátí true a bankomat vydá bankovky nebo nemá a vrátí false a Bankomat vypíše uživatelovi oznámení.

Mluvím-li o uživateli mám na mysli fyzickou osobu která stojí u toho bankomatu (nebo u klávesnice počítače ovládající tuto simulaci bankomatu). Třída Uzivatel je v tomto případě zbytečná.

 
Nahoru Odpovědět
9.3.2016 1:48
Avatar
coells
Tvůrce
Avatar
Odpovídá na nosekt
coells:9.3.2016 2:05

V Javě je dost složité se učit OOP, protože Java jde jiným směrem a většinou OOP koncepty porušuje ve prospěch svých vlastních principů. Netvrdím, že se tam nedá psát slušný objektový kód, ale pak to zase moc není Java.

Tvůj problém je v tom, že začínáš návrh od objektů, ale korektní postup musí začínat od zpráv a definice vzájemné interakce mezi objekty. Tak, jak to zkoušíš ty, je to špatně a dostaneš se do stavu, kterému říkám "programování s objekty", ale nemá nic společného s "objektovým programováním".

Jestliže máš reprezentaci účtu, pak jsou požadované operace pravděpodobně:

  • vklad
  • výběr
  • stav účtu

Tomu musí odpovídat metody účtu. Metody getPenize() a setPenize() odhalují interní stav objektu a porušují zapouzdření.

Bankomat je rozhraní pro fyzickou komunikaci s uživatelem. Požadované operace pravděpodobně budou:

  • vklad
  • výběr
  • stav účtu

A není vůbec náhoda, že se operace shodují se samotným účtem, protože bankomat je fyzickou reprezentací účtu.
Z hlediska objektových principů získáš různé objekty splňující stejné rozhraní, tomu se říká polymorfismus.
Nicméně, pokud je bankomat fyzickou reprezentací účtu, pak není problém, aby pracoval s konzolí.

Uživatel jako objekt nemá smysl, protože nepřináší nic nového, pokud nechceš svazovat uživatele s účtem. Jenže k tomu budeš potřebovat další typ objektu - banku - která jako důvěryhodný prostředník bude zajišťovat svázání účtu s jeho majitelem. Ale to už se nám zbytečně komplikuje.

 
Nahoru Odpovědět
9.3.2016 2:05
Avatar
nosekt
Člen
Avatar
Odpovídá na Atrament
nosekt:9.3.2016 2:05

Díky za odpověď. Můžeš mi ještě poradit jak zrealizovat načtení od uživatele v třídě bankomat? Dejme tomu, že se to bude dít v metodě nastavCastku(), jak bude vypadat tělo metody?

 
Nahoru Odpovědět
9.3.2016 2:05
Avatar
nosekt
Člen
Avatar
Odpovídá na coells
nosekt:9.3.2016 2:09

Ok, díky za odpověď. Zkusím to během zítřka překopat a dát sem výsledek, tak když budeš mít čas, tak to kdyžtak zkoukni :-) Díky

 
Nahoru Odpovědět
9.3.2016 2:09
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na nosekt
Atrament:9.3.2016 19:17

Nejsem si jistý jestli chápu na co se ptáš - prostě vypíšeš něco jako "Kolik chceš vybrat" a načteš co uživatel zadá, a je to, ne?

 
Nahoru Odpovědět
9.3.2016 19:17
Avatar
nosekt
Člen
Avatar
Odpovídá na Atrament
nosekt:9.3.2016 20:49

šlo mi o to, že jsem nevěděl o třídě Scanner, teď už vim jak to napsat :-)

 
Nahoru Odpovědět
9.3.2016 20:49
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 7 zpráv z 7.