Objektově orientované programování

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: sukovanej
Datum: 31.3.2013
Hodnocení/Hlasovalo: 2.46/28

Známe několik způsobů programového návrhu. Mezi ty nejčastěji používané se nejspíše řadí procedurální programování a objektové programování. Procedurální pro popis řešení využívá soustavu logicky deklarovaných funkcí a procedur. Objektové programování má své kořeny někdy v 80. letech a využívá prvky imperativního programování s tím, že k němu ještě přidává objekty. V tomto článku se „letem světem“ podíváme na základní aspekty objektově orientovaného programování.

Co to je?

Objektový přístup k programování je v dnešní době již zaběhlý způsob návrhu aplikací. Základním paradigmatem objektově orientovaného programování (zkrácené OOP z anglického Object-Oriented Programming) jsou tzv. objekty. Existuje nespočet programovacích jazyků, které jsou objektově orientované. Je to například jazyk C#, jehož syntaxe má kořeny v jazyku Java a C++, které jsou rovněž založené na objektovém přístupu.

OOP se snaží jak jen to jde simulovat realitu, kterou normálně známe. Proto je zde koncepce objektů, které totiž známe z běžného života.

Objekty

V pojmu „objekt“ (v souvislosti s programováním) nesmíme vidět nic nenormálního, ale prostě jen objekt – počítač, tiskárna nebo třeba klavír. Objekt má svoje vlastnosti (úhlopříčka displeje, velikost RAM, hmotnost) a metody, neboli úkony, které může provádět (počítat, vykreslovat na monitor, přijímat pakety). Základní vlastností objektu potom je, že si tyto informace (stav, vlastnosti) musí pamatovat.

Nikdy nesmí nastat, že by Váš osobní počítač najednou přestal tušit kolik váží. Stejně tak je to i v programování. Jakmile objekt existuje, svůj stav si uchovává do té doby, než je nějakým způsobem ukončen.

Třída

Třída je předpis vytvořený programátorem, podle kterého se vytváří objekt. Objekt vzniklý na základě třídy se potom nazývá instance třídy. Ve třídě se definují všechny vlastnosti a metody, které bude objekt potřebovat.

Při vytváření instance třídy se vždy nejdříve zavolá tzv. konstruktor. To je speciální metoda, která se definuje podobně jako ostatní metody ve třídě, ale na rozdíl od normálních metod nesmí mít žádný návratový typ. Konstruktor, protože je ve třídě definován jako normální metoda, může přijímat i argumenty. Těmito argumenty jsou většinou nějaká vstupní data potřebná pro samotnou existenci a správnou funkčnost objektu. To se hodí, pokud máme třídu, která bude představovat databázi. Vstupním údajem zde bude jméno, heslo a adresa serveru. Tyto informace si vyžádáme právě v konstruktoru třídy.

Někdy se používá i tzv. destruktor. Destruktor je opět metoda, která se volá automaticky. Destruktory se analogicky ke konstruktorům volají při skončení platnosti objektu. Metoda definující destruktor nesmí mít žádný návratový typ a žádné argumenty. Konstruktor i destruktor se ve třídě, pokud to nepotřebujeme, definovat vůbec nemusí a při vytváření instance to bude vypadat stejně, jako kdybychom vytvořili konstruktor bez argumentů a bez vlastního kódu.

Zapouzdření

Jeden je základních pilířů OOP - Zapouzdření je vlastnost objektů, která zaručuje, že pokud pracujeme v aplikaci s více objekty, tyto objekty jsou vůči sobě uzavřené celky. Navzájem se samozřejmě můžou ovlivňovat instance tříd tím způsobem, že například hodnotu vypočtenou v metodě jednoho objektu dosadíme do vlastnosti (nebo argumentu metody apod.) druhého objektu. Na úrovni třídy se ale navzájem ovlivňovat nemohou.

Modifikátory přístupu

Ve třídě nejsou všechny atributy a metody rovnocenné. Můžeme je dělit podle toho, na jaké úrovni má aplikace k prvkům třídy přístup. Vlastnosti a metody, ke kterým má přístup pouze třída, se nazývají soukromé (private) a při vytvoření instance se budou tvářit, jako by neexistovali. Metody a vlastnosti, ke kterým má přístup i vrstva aplikace, na které byla vytvořena instance třídy, se nazývají veřejné (public).

Vraťme se zpátky k příkladu s databází a zvažme, které metody by měla třída obsahovat. Jednak metodu pro připojení k databázi, dále k vykonání SQL příkazu a možná nějakou metodu, která nás bude informovat o stavu připojení k serveru. Na úrovni aplikace budeme určitě potřebovat pracovat s metodou pro vykonání SQL dotazu a podle potřeb i s informacemi o stavu servu, abychom mohli uživatele informovat o případném stavu serveru. Zcela jistě bychom ale neměli poskytovat metodu pro připojení k databázi. Tato metoda by měla být pouze pro třídu a zavolali bychom ji při vytvoření instance a při ukončení bychom spojení s databázovým server ukončili (nejspíš ještě s pomocí jiné metody - také private).

Dědičnost

Dědičnost (anglicky inheritance) je dalším ze základních pilířů OOP. Je to vlastnost, díky které může třída „zdědit“ vlastnosti a metody třídy jiné. Pokud třída dědí po jiné třídě, dědí úplně všechny prvky (konstruktor, metody, vlastnosti). Obecně lze dědit z více různých tříd a naopak jednu třídu použít jako bázovou pro více různých konečných tříd. Také lze dědit ze třídy, která už jednou (či vícekrát) dědila.

Abychom výše uvedené poznatky trochu strukturalizovali, rozdělíme si způsoby dědění do tří různých druhů.

V odvozené třídě lze také zděděné metody (popř. konstruktor) redefinovat podle potřeby.

Rozhraní

Rozhraní je předpis toho, jaké metody a vlastnosti by měla třída implementovat.

Jako názorný příklad si uveďme dva objekty - kalkulačku a tiskárnu. Oba tyto přístroje na počátku dostanou vstupní data a na jejich základě uživateli „vyplivnou“ výstup. Dědičností bychom to řešili tak, že bychom vytvořili společného předka - stroj. V tomto předkovi bychom definovali třeba metodu do_some_input_output(). Po zdědění by si jak kalkulačka, tak i tiskárna musela tuto metodu interpretovat jinak podle toho, co má dělat. Proto problém vyřešíme jako rozhraní, které bude definovat metodu do_some_input_output(). Každý ze strojů implementuje toto rozhraní a uvedenou metodu deklaruje podle své funkčnosti.

V jazyce C# je výhodné používat rozhraní, protože jedna třída může implementovat více rozhraní najednou. Lze tedy jakýmsi způsobem kompenzovat neschopnost dědit z více tříd.

Závěr

Objektově orientované programování je úspěšné pravděpodobně hlavně díky tomu, že programátora přirozeně nutí psát úhledný zdrojový kód. V budoucnu se určitě dostanu k sepsání článku o konkrétní implementaci a použití OOP v jazyce C#, kde bych rád zároveň ukázal, jak lze v praxi použít.