Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
nosekt
Člen
Avatar
nosekt:10.5.2014 1:54

Ahoj, prošel jsem prvních pár lekcí k C# a rozhodl jsem se si předtím, než se dám na dědičnost a pod. zopakovat. Vytvořil jsem proto následující program, simulující "bankomat". Chtěl bych se zeptat, jestli se v tomto případě dá vůbec mluvit o OOP programování, popřípadě co bych měl zlepšít apod...Díky

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bankomat
{
    class Program
    {
        static void Main(string[] args)
        {
            SpravaUctu ucet = new SpravaUctu("Tomas Nosek", 1233, 7457547, 25000);


            Console.WriteLine("Welcome to the GE AMT Mr. {0}.", ucet.GetAccountOwner());
            Console.WriteLine("----------------------------------------------------------------");
            Console.Write("Your account number is: {0}. Please insert your password: ",  ucet.GetAccountNumber());

            int password = int.Parse(Console.ReadLine());

                if (ucet.Verificate(password))
                {
                    //metoda vrátila pravdu, sdělíme to uživateli
                    Console.Clear();
                    Console.WriteLine("The password verification was successful. You can manage your account now.");
                }
                else
                {
                    do
                    {
                        //metoda vrátila lež, sdělíme to tedy uživateli
                        Console.Write("The password you inserted is incorrect. Try it again: ");
                        password = int.Parse(Console.ReadLine());

                    }
                    while (ucet.Verificate(password) == false);


                }

                Console.Clear();
                Console.WriteLine("The password verification was successful. You can manage your account now.");
                Console.Write("Option: 1 - Account status, 2 - Withdraw money: ");

                int option;
                switch(option = int.Parse(Console.ReadLine()))
                {
                    case 1:
                        {
                            Console.WriteLine();
                            Console.WriteLine(ucet.CheckAccount(ucet.balance));
                            Console.WriteLine();
                            break;
                        }

                    case 2:
                        {
                            Console.WriteLine();
                            Console.Write("Write the amount of money you want to withdraw: ");
                            ucet.amount = int.Parse(Console.ReadLine());
                            Console.WriteLine(ucet.Withdraw());
                            break;
                        }

                }


            Console.ReadKey();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bankomat
{
    class SpravaUctu
    {
        private string account_owner;
        public int password;
        private int account_number;
        public bool verified;
        public int balance;
        public int amount;

        public SpravaUctu(string account_owner, int password, int account_number, int balance)
        {
            this.account_number = account_number;
            this.password = password;
            this.account_owner = account_owner;
            this.balance = balance;
        }


        public bool Verificate(int pass)
        {

            if (pass == password)
            {
                verified = true;
                return true;
            }
            else
            {
                verified = false;
                return false;
            }
        }

        public string CheckAccount(int balance)
        {
            return string.Format("Money balance: {0}", balance);
        }

        public string Withdraw()
        {
            balance -= amount;

            if (amount < balance)
            return string.Format("You have successfully withdrawed: {0}", amount);

            else
            return string.Format("You don't have enough money on your account.", amount);


        }

        public int GetAccountNumber()
        {
            return account_number;
        }

        public string GetAccountOwner()
        {
            return account_owner;
        }

    }
}
 
Odpovědět
10.5.2014 1:54
Avatar
Michal Žůrek - misaz:10.5.2014 10:18

To že máš jeden objekt neznamená že je to objektové. Main by mělo být skoro prázdné. Navíc v něm děláš páté přes deváté. V první polovině tam zjišťuješ heslo, pokud zadá heslo dobře hned na poprvé, vypisuješ mu hlášku 2×. V druhé polovině už používáš switch. Ten by měl být v objektové aplikaci minimálně. Dá se ho jednoduše zbavit, pomocí rozhraní a reflexe.

Uč se dál.

 
Nahoru Odpovědět
10.5.2014 10:18
Avatar
alfonz
Člen
Avatar
alfonz:10.5.2014 10:45

V objektu by neměli nikdy být veřejné proměné, vždy by měli být dostupné přes metody nebo vlastnosti.

Nahoru Odpovědět
10.5.2014 10:45
lmao
Avatar
mnauik
Člen
Avatar
mnauik:10.5.2014 11:07

nosekt: doporucuji, aby sis zopakoval zapouzdreni (zbav se public promennych): http://www.itnetwork.cz/…programovani

Hodne stesti :)

Nahoru Odpovědět
10.5.2014 11:07
minusuj mě, ale zdůvodni to ;)
Avatar
nosekt
Člen
Avatar
nosekt:10.5.2014 14:45

Samozřejmě, že nečekám, že by to bylo úplně správně. Prošel jsem si prvních 6 lekcí OOP tady na devbooku, takže např. vlastnosti, reflexe atd. pochopitelně používat ještě neumím. Hlášku 2x nevypisuju, to nevím, kde jsi na to přišel. Každopádně jsem čekal spíše odpověď typu: nahraď switch "něčím", než: "switch tam nemá co dělat, uč se dál." Radši bych od vás viděl nějaké rady, které mi v něčem opravdu pomůžou :-D

 
Nahoru Odpovědět
10.5.2014 14:45
Avatar
nosekt
Člen
Avatar
nosekt:10.5.2014 14:46

Každopádně, na zapouzdření se ještě podívám, díky :)

 
Nahoru Odpovědět
10.5.2014 14:46
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na nosekt
Jan Vargovský:10.5.2014 15:16

Chyb tam je plno, ale je zbytečné je opravovat, prostě probírej dál a za týden se koukni na tenhle zdroják a uvidíš, jestli je najdeš :)

 
Nahoru Odpovědět
10.5.2014 15:16
Avatar
Odpovídá na nosekt
Michal Žůrek - misaz:10.5.2014 18:13

v podmínce

if (ucet.Verificate(password))
                {
                    //metoda vrátila pravdu, sdělíme to uživateli
                    Console.Clear();
                    Console.WriteLine("The password verification was successful. You can manage your account now.");
                }

vypisuješ poprvé, pak hned za podmínkou vypisuješ totéž.

Switche se zbavíš tak, že si vytvoříš rozhraní (třeba IBankovniOperace) a třídy, které budou toto rozhraní implementovat (např. Vyber, Vloz). Pak uživatele necháš zadat co chce udělat, on zadá název te třídy a pomocí reflexe vytvoříš instanci te třídy a zavoláš na ni nějakou metodu, kterou má to rozhraní. Na začátek to možná zní složitě.

 
Nahoru Odpovědět
10.5.2014 18:13
Avatar
Odpovídá na Michal Žůrek - misaz
Neaktivní uživatel:10.5.2014 18:30

Myslím si, že je lepší v menších projektech používat jednodušší řešení. Kromě toho se nosekt zřejmě učí základy OOP a reflexe k nim zrovna nepatří.

Nahoru Odpovědět
10.5.2014 18:30
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Žůrek - misaz:10.5.2014 18:41

jasně souhlasím, ale

1.) Jeho malý bankovní systém může brzy a rychle nabobtnat.
2.) přijde mi lepší naučit se to praxi (hned si to vyzkouší) než si načíst miliony dokumentů, ale stejně protože jsi to zatím nikdy nepoužil tak ti to bude k ničemu. Toto jsem si říkal o samotném OOP, databázích, LINQ, WPF a mnoho dalších. O každém z nich jsem něco věděl měl přečtené, ale dokud jsem to v praxi nepoužil tak mi to jako bylo celkem k ničemu. proto si myslím, že by se to mohl naučit už teď když s tím pracuje.

 
Nahoru Odpovědět
10.5.2014 18:41
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Petr Nymsa:10.5.2014 18:53

Blbost. Nemůžeš nutit začátečníka učit se vše hned správně. Když se "naučí" něco maličko špatně resp. sám si t ošpatně napíše a časem se naučí lepší způsob - jemu samotnému dojde co dělal špatně a díky tomu se naučí víc přemýšlet a navrhovat. Jeho řešení až tak špatné není. V dobách začátků bych to dělal podobně :)

Nahoru Odpovědět
10.5.2014 18:53
Pokrok nezastavíš, neusni a jdi s ním vpřed
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 11 zpráv z 11.