OOP prakticky: Na co jsme zapomněli

…aneb i mistr tesař někdy pukne!
29. 12. 2008

Zde vám ukážu, na co všechno jsem při návrhu programu zapomněl a jak jednoduchá bude náprava. Jedna z výhod objektů totiž mimo jiné je snadná údržba a snadná oprava vzniklých chyb. Zpravidla stačí opravit nějakou metodu v jedné třídě a je to. Horší chyby vzniknou při špatném návrhu programu, ale to je na jiné povídání.

Nezapouzdřené výrazy

Nejprve ukázkový chybný kód:

   1: Soucet soucet = new Soucet();
   2: Console.WriteLine("Tohle vyhodí chybu: {0}", soucet.A.ToString());
   3: Console.Read();
Otázka zní – proč to vyhodí chybu? Objekt je přece zapouzdřený a nemůže se tak dostat do nežádoucího stavu. Odpověď je, že je zapouzdřený špatně, protože jsme zapomněli na výchozí hodnoty parametrů. Pokud vytvoříme Součet a nepřidáme mu ručně nějaké hodnoty, bude ve slotech A a B prázdno a program při pokusu vytáhnout ze slotů nějakou hodnotu spadne. Chybu napravíme tak, že už při vytvoření objektu nastavíme sloty na nějakou výchozí hodnotu, typicky asi na nulu. Třídu Binární Výrazy upravíme takto:
   1: public BinarniVyraz() 
   2: {
   3:     A = new Konstanta();
   4:     B = new Konstanta();
   5: }

To je vše. Při vytváření prázdného součtu se automaticky do slotů A a B uloží nulová konstanta a program pak nespadne. Co ostatní třídy? U Konstanty se automaticky do hodnoty uloží nula, protože se jedná o Integer, a to jeho výchozí hodnota (alespoň v C#). U Proměnné už by to ale nějakou rozumnou výchozí hodnotu chtělo, protože za současného stavu se tam ukládá prázdný řetězec, což je blbé. Program sice nespadne, ale proměnná s žádným názvem je blbá proměnná. Takže jako výchozí hodnotu můžeme zvolit „x“:

   1: public Promenna() 
   2: {
   3:     Nazev = "x";
   4: }

Pro klid duše můžeme udělat podobnou úpravu i u Konstanty, abychom měli jistotu, že tam bude na začátku nula:

   1: public Konstanta() 
   2: { 
   3:     Hodnota = 0; 
   4: }