OOP prakticky: Má být konstanta objekt?

…aneb zásadní otázka každého správného objektáře!
24. 12. 2008

Teď už opravdu začínáme s programováním. A hned otázka na úvod – má být nejjednodušší matematický výraz, konstanta, objekt nebo stačí, pokud budeme pracovat s holým číslem? (Poznámka: v programu budu pro jednoduchost používat datový typ Integer, ale není to nijak podstatné.) Nabízí se odpověď, že konstanta je prostě číslo, tak proč ho deklarovat jako objekt? Odpověď se dovíte v průběhu dalšího čtení, teď se to bude špatně vysvětlovat, když neznáte základní části OOP. Ale zkusme to. Představte si, že všechny ostatní výrazy (proměnnou, součet, …) definujete jako objekty a pouze konstantu definujete jako číslo. Vidíte už trošku, že to asi nebude ono? Jak byste vytvořili například metodu, která danou konstantu zderivuje? Kde byste takovou funkci deklarovali? A teď si představte, že byste při každém volání derivace museli kontrolovat, zda derivujete konstantu nebo něco jiného, protože u ostatních výrazů bude metoda derivace definovaná jinde než u konstanty. Takže pokud by to byla konstanta, zavolali byste speciální funkci pro konstantu, pokud by to byl jiný objekt, zavoláte standardní metodu. Už vidíte, že v objektovém stromu je výhodné mít všechny dílčí části jako objekty a nedávat některé části jako základní typy (tj. Integer nebo třeba String)?

Dobře, ujasnili jsme si, že konstanta bude objekt jako každý jiný matematický výraz. Jak nyní nadefinujeme naši třídu? Třída bude mít jednu vlastnost, a sice Hodnota konstanty. Hodnota konstanty již může být normální Integer, konstanta už nemůže obsahovat další komplikovanější výrazy. A to je všechno, víc nepotřebujeme:

   1: class Konstanta
   2: {
   3:     public int Hodnota;
   4:  
   5:     public Konstanta() { }
   6:  
   7:     public Konstanta(int Hodnota)
   8:     {
   9:         this.Hodnota = Hodnota;
  10:     }
  11:  
  12: }

To by byla první, naivní, verze Konstanty. Tato třída ještě určitě není finální, budeme ji dále vylepšovat. Jako první se zaměříme na poslední bod předchozí kapitoly. Naše aplikace má být mít pro každý výraz definovanou metodu pro čitelný výpis. Přepíšeme tedy metodu ToString tak, aby vracela číslo ze slotu Hodnota:

   1: public override string ToString()
   2: {
   3:     return Hodnota.ToString();
   4: }

Nyní máme metodu, která nám vrací textovou reprezentaci Konstanty. Klíčového slova override si prozatím nevšímejte, to má co dočinění s polymorfismem, které přijde na řadu až později. Nyní považujme naši třídu za dostatečně soběstačnou a můžeme vyzkoušet, jak funguje:

   1: static void Main(string[] args)
   2: {
   3:     Konstanta a = new Konstanta(10);
   4:     Konstanta b = new Konstanta(25);
   5:     Console.WriteLine("a: {0}, b: {1}", a.ToString(), b.ToString());
   6:     // Výpis bude: a: 10, b: 25
   7:  
   8:     Console.Read();
   9: }

Víc toho zatím třída Konstanta neumí. Prozatím nám to bude stačit, ještě se k ní vrátíme. Nyní se podíváme na další třídu, Proměnná. Na této třídě již mohu vysvětlit první z pilířů: