Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/www/novacisko.cz/subdomains/bredy/init.php on line 11

Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50562 Library:100020 in /home/www/novacisko.cz/subdomains/bredy/init.php on line 11

Warning: Cannot modify header information - headers already sent by (output started at /home/www/novacisko.cz/subdomains/bredy/init.php:11) in /home/www/novacisko.cz/subdomains/bredy/index.php on line 38
Úvod do obecného OOP 2. díl - Bredyho blog - Ondřej Novák
Bredyho blog - Ondřej Novák

Úvod do obecného OOP 2. díl

V tomto díle prozkoumáme život objektů


Instance

V předchozím díle jsem slíbil, že se podíváme na slovíčko instance. Tento termín nacházíme zejména u programovacích jazyků C++, Java, atd. a představují konkrétní objekt určitého typu (omluvte slovíčko typ, je to nepřesné). Uvedu příklad.

Pes "Alík". Je objektem. Mohu ho nazývat instancí. Jedná se o konkrétního psa, který běhá, štěká, kouše, vrčí. A má svůj vymezený čas od narození po smrt. V minulém díle jsme však měli objekty jako "Dobrman", "Buldok", "Dalmantýn". Jsou to taky objekty?

Odpověď zní ano. Říkejme jim třeba šablony objektů. Každá tato šablona definuje vlastnosti jedinečné pro ten který druh psa, nicméně nejsou to konkrétní jedinci. Zatímco objekt "Alík" je už konkrétním objektem, který je vytvořen podle některé šablony. Konkrétní objekty vzniklé podle šablon nazývámé instancí.

Programátory C++ nebo Javy jistě zarazilo, že jsem i šablony zahrnul do objektů. Oni totiž vědi, že tyto šablony (class) se přece v programu nevyskytují, je to přeci jen definice, která nemá podobu objektu. Ano to je pravda, ale jedná se jen o implementační zkratku. V plnohodnotném OOP může totiž i šablona vystupovat jako objekt.

Hranice mezi šablonou a instancí však není v OOP nijak definována. Záleží vždy na kontextu. Pokud například budu psát program generující šablony, pak šablona pro mne bude instancí, ale jiná část programu ji skutečně vezme jako šablonu, podle které bude vytvářet další instance.... které opět budou moci býti šablonami.

V některém dalším díle si vztah šablona-instance vysvětlíme dědičností, zjistíme, že instance je objekt, který pouze dědí svou šablonu.

Život objektů

Každý objekt se narodí, žije (pracuje, vykonává všechny potřebné úkoly), a v nějaký okamžik zanikne. Smyslem objektu je uchovávat, a spravovat data, která jsou jeho součástí a za která nese plnou zodpovědnost. Tyto data vznikají se vznikem objektu a zanikají se zánikem objektu.

Objekty vznikají vždy, když jsou potřeba. Pokud máme například grafický editor, pak takovým objektem může být například otevřený obrázek, který v editoru modifikujeme. Tento objekt vzniká tak, že uživatel vydá příkaz načtení obrázku z vnější paměti počítače. Objekt pak zaniká v okamžiku, kdy si uživatel přeje práci s objektem ukončit. Obecně si lze představit, že objekty vznikají na příkaz jiných objektů (které je potřebují k prací) a stejně tak zanikají. Opět to musí být na příkaz jiného objektu. V praxi se můžeme setkat se vztahem "master-slave", kdy existuje nějaký velitelský objekt, který řídí vznik a zánik podřízených objektů a které pak úkoluje. I tyto podřízené objekty mohou býti velitelskými objekty dalších podřízených objektů atd., podobně, jako je hierarchie ve velké fungující firmě.

Kromě toho mohou do hry vstupovat objekty, jenž hierarchii prochází napříč, vznikají v okamžiku potřeby a zanikají v okamžiku, kdy všechny své úkoly splní (provedou sebedestrukci). Nebo v okamžiku, kdy žádný jiný objekt s nimi nemá vytvořený vztah (zánik zanecháním - oblíbené zejména v Javě).

Automatický zánik objektů známe z Javy (Garbage Collector) je samozřejmě příjemným zjednodušením celého složitého systému vzniku a zániku objektů. Java "ničí" každý objekt vždy, když v celém systému neexistuje jediný objekt, který by s ním chtěl spolupracovat (nikdo nedrží referenci na tento objekt). Je to pěkné a pohodlné, ale jak si pak ukážeme, není to všelék. OOP způsob zániku objektů nijak nedefinuje, a některé jiné způsoby zániku objektů mají v určitých situacích převažující výhody.

Identita objektů

V OOP platí, že každý objekt musí být jasně identifikován. OOP však již nedefinuje jak. Takže si pod identifikací můžeme představit třeba libovolné jméno (například "Alík" je identifikovatelný objekt). Ale jméno se hodí spíš pro lidskou představivost, v programovacích jazycích tato identifikace bývá jiná.

  • V C++ je to adresa objektu.
  • V databázovém systému bude identifikací objektů např. primární klíč.
  • Souborovém systémů může být identifikací objektu celá cesta a jméno souboru.
  • možností je více.

Jsou samozřejmě možné i aliasy, tj aby jeden objekt měl více identifikací. Není však dovoleno, aby dva objekty sdílely jednu identifikaci

ByVOJ ve zkratce

Nyní si povíme něco o virtuálním objektovém jazyku.

Tento jazyk je plně objektový. Nepracuje s ničím jiným, než s objekty. Abysme ale měli nějaké stavební kameny (protože objekty můžeme stavět zase jen z objektů), nejprve si nadefinuje základní stavební kámen. Objekt Simple.

Objekt Simple je objekt, který obsahuje jednu datovou komůrku, do které lze uložit číslo, znak, nebo text (abych se vyhnul definicím objektu "řetězec", předpokládejme že text je jednoduchý datový typ).

a=5; // vznik objektu "a" obsahující kopii objektu "5".
poznámka k syntaxi
Syntaxticky bude jazyk ByVOJ připomínat C++ nebo Javu. Pro matematické výpočty budeme používat běžné výrazy (později si ukážeme, že i to jsou objekty), stejně tak matematické operátory se budou chovat tak jak se chovat mají.

aby jsme mohli demonstrovat zánik objektu, je nutné definovat "scope" - blok platnosti objektu

{
a=5; //objekt "a" kopie objektu 5
b=10; //objekt "b" kopie objektu 10
c=a+b; //objekt "c" vznikne jako kopie objektu, jenž vznikl provedením operace "+" na objektu "a" s parametrem "b"
} //v tomto místě všechny tři objekty zanikají.

Vznik objektu

zaveďme nyní zápis, kterým budeme vyjadřovat vznik zbrusu nového objektu

novyobjekt= [šablona] [(parametry)] [{... deklarace ...}];  // hranaté závorky [ ] znamenají volitelný parametr.

Dejme tomu, že budeme vytvářet program pracující s komplexní matematikou. Zaveďme tedy objekt komplexního čísla

Complex= {
-r=0;
-i=0;

+getR() {return r;}
+getI() {return i;}
+set(re,im) {r=re;i=im;}
};

Tímto zápisem vznikl objekt Complex. Mimochodem, je to instance nebo šablona? V tomto případě se nejspíš jedná o šablonu. Mohu však normálně s tímto objektem pracovat a tím šablonu v průběhu života této šablony měnit (jako by to byla instance).

Poznámka k syntaxi
znak "-" mínus zde vyjadřuje fakt, že atributy i a r, které objekt tvoří jsou přístupné pouze uvnitř objektu a nelze je vně měnit. Naopak znak "+" vyjadřuje, že funkce takto označené jsou vně přístupné, a lze jimi objekt ovládat.

instanci komplexního čísla vytvořím takto:

c1=Complex;
c2=Complex;
...
Poznámka k syntaxi
operátor = zde vystupuje jako vznik kopie daného objektu.

Pracovat s objektem lze následovně.

c1.set(1,2); //nastav hodnotu

Konstruktor

O konstruktoru se zmíníme letmo, bude opět v některém dalším díle. Aby náš první objekt byl "hezký", bylo by pěkné při vytváření instance rovnou definovat hodnotu objektu. Upravme tedy objekt následovně

Complex= {
-r=0;
-i=0;

+create(re,im) {set(re,im);} //konstruktor
+getR() {return r;}
+getI() {return i;}
+set(re,im) {r=re;i=im;}
};
c1=Complex(1,2);
c2=Complex(0,3);
c3=Complex(c1.getR(),c2.getI());

Poznámka k ByVOJovi

Když budu mít čas a chuť, napíšu k němu jednoduchý interpreter. Aby bylo možné příklady zkoušet v praxi :-)

vytvořeno: 12.6.2006 13:18:34, změněno: 12.6.2006 14:40:29
Jsou informace v článku pro Vás užitečné?
  • (1)
  • (3)
  • (3)
  • (2)
  • (4)
Nick nebo OpenID
Vzkaz
 
2.7.2014 11:39:26

FqsShc6e

Wenn man den Begriff zu sehr erweitert kf6nnte man auch jeden Stein dazuze4hlen und im Endeffekt die ganze Welt. Dann ist aber der Begriff fcberflfcssig.Ich denke es he4ngt von der Komplexite4t der Mechanismen ab die geeseutrt werden sollen. Das Interface hat grundse4tzlich eine Daseinsberechtigung wenn mehrere (komplexe) Aufgaben gebfcndelt werden und so ffcr Menschen bedienbar. Nach der Definition kf6nnte man ein Feuerzeug dazuze4hlen, einen einfachen Stuhl aber nicht.Einen elektrischen Rollstuhl sicherlich, beim Bfcrostuhl mit mehreren Verstellmf6glichkeiten kann man sich nach wie vor streiten.Wenn man das Wort anguckt, steckt face drin, also der Fakt dass es dem Gesicht gegenfcbersteht.Das wfcrde streng genommen nur konsolenartige Dinge erlauben und den Bfcrostuhl ausschliedfen.Das ist aber ffcr Erbsenze4hler. Die Wahrheit liegt meiner Meinung nach irgendwo dazwischen.

Podobné články

Úvod do obecného OOP 3. díl

Dědičnost

Úvod do obecného OOP 1. díl

V tomto seriálu bych se chtěl věnovat obecnému OOP. První díl budiž predmluvou a vymezením pojmů.

Serializace dat a objektů

Následující článek je úvodem do další série o generickém programování (šablony), nyní se zaměříme na problém perzistentního ukládání dat nebo jejich transport, obecně o serializaci a deserializaci dat

GarbageCollector v C++, prototyp

Neustále slýchám, jak v C++ chybí Garbage Collector. Ač si o tomto nástroji myslím své, a v zásadě jsem proti zavedení GC v C++, přijal jsem tyto nářky jako výzvu.

Distributor - vaše objekty budou o svém okolí vědět vše

Největším problémem většiny UI /ale i ne-IU/ aplikací, které potkávám, je špatná nebo vůbec nevyřešená komunikace mezi důležitými objekty. Přitom stačí málo, obstarat si distributora.
Reklama: