Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názor k článku
Štěpán Škrob: Horkým kandidátem byl WebKit, ale vybrali jsme Gecko

ondra.novacisko.cz
ondra.novacisko.cz (neregistrovaný) ---.seznam.cz
27. 2. 2009 12:17

Re: C++ versus C

celé vlákno
To neni "nekdo spatne udelal analyzu". Proste se jen mohl zmenit vnejsi svet

Jednak, vnější svět se nemění tak často, jednak změna vnějšího světa se nemusí nikdy projevit tak hluboko do programu. Objekty používáme zejména na modelování vnějšího světa a přizpůsobení interním pochodů v programu. Pokud modeluji televizi, určitě ji umím zapnout, vypnout, změnit program. Bez ohledu jaká je to televize, jaký má rozhraní, můj způsob ovládání se nezmění, pořád ji budu chtít zapnout, vypnout, změnit program. Až se začnou televize ovládat jinak, mohu můj objekt na ovládání televizí přepsat tak, že sám se bude vydávat za starou televizi. Za ním bude sedet emulátor, který bude emulovat činnost staré televize a požadavky transformovat. Musím si rozhodnout, zda mi za to stojí psát emulátor, nebo přepisovat půlku kodu. Spočítat, náklady. Nemohu svalovat vinu změny světa na objekty. Ty za to nemůžou. Taky si nedokážu představit, jak agilními metodami vyřešíte změnu světa. Třeba v okamžiku, kdy místo klasické televize vám předhodím internetovou televizi. Pořád ji umíme zapnout vypnout, ale program už třeba není číslo, ale URL adresa. Stále mohu ale napsat objekt, který bude umět naladit program podle čísla. Jak byste to řešil bez objektů čistě s ohledem na zbytek kódu.

Tím odpovídám i na dědičnost. Právě případ té televize. Naše internetová televize může dědit klasickou televizi. Obě se umí zapnout, vypnout, ale každá ladí programy jinak. Jedna používá číslo programu, druhá url. I tak je internetová televize také televizí, takže může ji dědit a funkcionalitu přepnutí programu emulovat (třeba tabulkou programů ve formě tabulky URLs) I nadále jste schopen televizi používat jak tam, kde se už očekává internetová televize, tak tam, kde se předpokládá klasická televize. A v dědění mohu pokračovat. Třeba přijde na svět interaktivní televize. Pořád je to ale televizí, pravděpodobně bude i internetovou televízí. Podědíme tedy internetovou televizi a rozšíříme ji o interaktivní funkce. A vida, stále jsme schopni novou televizi používat v programu, tam kde se předpokládá klasická TV. Můžeme přepínání programů považovat za určitou interaktivní akci, takže přepnutí programu opět emulujeme. Můžeme používat tuto televizi i jako klasickou internetovou televizi s tím, že neumí interaktivitu. To nevadí, programy, které interaktivitu neumí, ji prostě použijí klasicky. A ještě jednu věci. V programu mohu naráz pracovat se všemi typy televizemi. Zejména ty části programu, které umí pracovat jen s klasickou televízí si budou rozumět i s interaktivní televizí. I kdyby na světě zmizeli klasické televize a svět se změnil, nové televize budou mít naprosto jiné rozhraní, můj podprogram předpokládající klasickou TV, co se umí zapnout, vypnout a přepnout program, stále bude bez problému fungovat.

class GenTV {
public:
  virtual void turnOn();
  virtual void turnOff();
};
class ClassicTV: public GenTV {

public:
  virtual void switchProgram(int number);
};

class InternetTV: public ClassicTV {
public:
  virtual void switchProgram(const char *url);
};

class InteraciveInternetTV: public InternetTV {
public:
  virtual void useInteractiveAction(Action a);
};


A to jsem použil jen objekty. Šablony nabízí daleko víc možností.