IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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
Jurajs
Člen
Avatar
Jurajs:5.10.2013 22:21

Ahoj hazím sem kód, který bych chtěl okomentovat co je špatně a tak.. prosím!
Jsem začátečník, takže mi to moc nejde. (Učený z nebe nespadl že?) :)
Zkouším se pochopit OOP v C#

 public class Hra
    {
        public int postava;
        public int nepritel;
        public bool zije = false;
        public string jmeno;
        public int zivot;


        public Hra(bool zije, string jmeno, int postava, int nepritel)
        {
            this.zije = zije;
            this.jmeno = jmeno;
            this.postava = postava;
            this.nepritel = nepritel;

        }
        public bool Nazivu()
        {
            if (zivot > 0)
                return true;
            else
                return false;
        }

        public void GrafickyZivot()
        {
            zije = true;
            zivot = 100;

            Console.WriteLine(zije + "Máš 100 životů");


        }


    }
}
Editováno 5.10.2013 22:23
 
Odpovědět
5.10.2013 22:21
Avatar
luky
Neregistrovaný
Avatar
Odpovídá na Jurajs
luky:5.10.2013 23:16

No, mas se jeste co ucit. Ale ano, uceny z nebe nespadl.

  1. V metode nikdy nepouzivej c.wr() , v metode se pro vypis pouziva klicove slovo return.
  2. Promene co mas nad konstruktorem - atributy, hodnota se prirazuje v konstr. Nebo metode, nikdy tak jak mas ty.
  3. Ty atributy by meli byt privatni nebo vytvorene jako vlastnosti
public bool Zije{get;set;}

dale je nepsane pravidlo, ale je to tzv. best practice - nazvy metod a vlast. zacinam velkym pismenen.
4. Metoda ktera nic nevraci a nema zadny vstup je na h***o
to je ode mne vse,

 
Nahoru Odpovědět
5.10.2013 23:16
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:6.10.2013 8:48

Měl jsem problém pochopit, co jsi těmi radami myslel. Jurajs podle mne moc šancí na pochopení nemá.

  1. Někdy musíš udělat finální výstup. Kde? V metodě.
  2. Atributům, které nejsou závislé na parametrech konstruktoru se přiřazují hodnoty při deklaraci
  3. Univerzální get; set; také není v pořádku. Vytváří se tím anemické objekty.
  4. Viz 1. Uznávám, že je hodně divně napsána.

Vlastnost Zije bych udělal zcela závislou na hodnotě atributu zivot.

Nahoru Odpovědět
6.10.2013 8:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jurajs
Člen
Avatar
Jurajs:6.10.2013 11:05

Ještě dotaz:
1.Jaký je rozdíl mezi public a private. Proč dávat public nebo private, k čemu je to dobre?

 
Nahoru Odpovědět
6.10.2013 11:05
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jurajs
David Hartinger:6.10.2013 11:12

Pomocí private se skrývají prvky, které nemají být veřejně přístupné. Objekt se tak může používat jen tím správným způsobem a nelze narušovat jeho vnitřní funkci, která je skrytá.

Nahoru Odpovědět
6.10.2013 11:12
New kid back on the block with a R.I.P
Avatar
Jurajs
Člen
Avatar
Odpovídá na David Hartinger
Jurajs:6.10.2013 11:15

A při jakém příkladu se dává public??

Editováno 6.10.2013 11:15
 
Nahoru Odpovědět
6.10.2013 11:15
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Jurajs
Petr Nymsa:6.10.2013 11:15

K hodně věcem, nejlépe to pochopíš z následujícího příkladu. Public položky jsou přístupné zvenčí objektu a tedy můžeš je libovolně měnit. Vem si následujcí příklad (podobný je i v tutoriálech)

class Clovek
{
   public int vek;
   public bool plnolety;

   public Clovek(int vek)
   {
      this.vek=vek;
      if(vek >=18) plnolety = true;
   }

}

Když založíš instanci Clovek nastavíš mu pouze věk a bool plnolety se dopočítá sám.

Jenže, máme tu vlastně chybku. Oba atributy jsou public. Když později změním věk, třeba na 5, atribut plnolety se nezmění.

Proto se využívají Vlastnosti (gettery , settery) a proto také public a private

Nahoru Odpovědět
6.10.2013 11:15
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jurajs
Člen
Avatar
Odpovídá na Petr Nymsa
Jurajs:6.10.2013 11:20

Takže vlastně plnoletý bude stále true?

 
Nahoru Odpovědět
6.10.2013 11:20
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Jurajs
Petr Nymsa:6.10.2013 11:35

Ano bude a to je chyba v návrhu. Public atributy, lépe Vlastnosti ti umožní hlídat závislosti uvnitř objektu, uhlídat špatné nastavení apod. Tento problém by šle řešit několika způsoby

1. Metodou a atributy by byly privátní

private int vek;
private bool vek;

...

public void NastavVek(int vek)
{
  ...
}

Zde by se odehrávalo to samé co v kontruktoru.

2. Lepší řešení -> vlastnosti
Zde je spousta možností. Můžeš nastavit věk přes Setter nebo metodu. Následující příklad deklaruje vlastnosti pouze ke čtení a nastavení dojde přes metodu.

public int Vek{get;private set;}
public bool Plnolety {get;private set;}

public void NastavVek(int vek)
...

Dále tě okdážu už na tutoriály. Je zde vše krásně vysvětlené :)

BTW

David Hartinger jak píšeš {} ? Protože mě ve FF kombinací CTRL+B to vytovří vždy tučný text resp. toto

**{**
Nahoru Odpovědět
6.10.2013 11:35
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jurajs
Člen
Avatar
Odpovídá na Petr Nymsa
Jurajs:6.10.2013 11:42

Dík moc za rady...A ještě kdyz napisu public void nebo private void a slovo return? Jak je tady v tutorialech, ze return vraceni hodnoty..porad nechapu jak jako vraceni neceho?

 
Nahoru Odpovědět
6.10.2013 11:42
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Jurajs
Petr Nymsa:6.10.2013 11:56

Metody ti mohou a nemusí vracet hodnoty.

public int SectiCisla(int a,int b)
{
  return a+b;
}

public void VypisPozdrav(string jmeno)
{
   Console.WriteLine("Ahoj "+jmeno);
}

Tj void značí že metoda nic nevrací, jinak označíš typem co vrací (int,double,string, NejakouInstan­ciTridy,...)

Mrkni na ty tutoriály, vše tu je napsané

Nahoru Odpovědět
6.10.2013 11:56
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Jurajs
Kit:6.10.2013 11:56

Zkus si tohle:

using System;

class Clovek {
    static void Main(string[] args) {
        Clovek adam = new Clovek(17);
        Console.WriteLine("Adamovi bylo " + adam.Vek + " let. Plnoletý: " + adam.Plnolety);
        adam.Vek = 18;
        Console.WriteLine("Adamovi je   " + adam.Vek + " let. Plnoletý: " + adam.Plnolety);
    }

    public int Vek {get; private set;}

    public bool Plnolety {
        get {
            return (Vek >=18);
        }
    }

    public Clovek(int vek) {
        this.Vek=vek;
    }

}
Nahoru Odpovědět
6.10.2013 11:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Gabriel
Tvůrce
Avatar
Odpovídá na Jurajs
Martin Gabriel:6.10.2013 16:39

void použiješ tehdy, kdy chceš metodou změnit např. obsah nějaké proměnné.
return použiješ tehdy, kdy chceš např. do nějaké proměnné uložit výsledek nějaké metody (funkce)..

Když vytváříš metodu a zvolíš cokoli jiného, než void, tak musí mít vždy návratovou hodnotu, čili musíš použít return.

Příklad pro void:

private int cislo = 0;

private void ulozCislo()
{
cislo = 2;
}

Příklad pro return:

private int cislo = 0;

private void ulozCislo()
{
cislo = zmenCislo();
}

private int zmenCislo()
{
cislo = 5;
return cislo;
}

Není to úplně přesně, ale pro začátečníka to snad bude dobře pochopitelné. :)
Zkoušej si to na nějakých příkladech třeba s kalkulačkou - ukládej si čísla a tak.. na tom nejlíp uvidíš, jak to funguje.

Editováno 6.10.2013 16:40
Nahoru Odpovědět
6.10.2013 16:39
"Be the change you want to see in the world" - Michael Scofield
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 13 zpráv z 13.