Objektová orientace

Object-oriented programming

Základní koncepty

Třída

Abstraktni popis věci. Obsahuje její vlastnosti, a funkce (metody) které věc umí. V podstatě datový typ objektu.

Například třída Pes bude mít vlastnosti jako rasa a srst a metody sedni() a štěkej().

Objekt

Intance třídy. S ním můžeme pak pracovat.

Například objekt Lassie.

Instance

Objekt vytvořený z třídy.

Metoda

Schopnost objektu. Prostě je to funkce, v OOP se tomu říká metoda.

Předávání zpráv

Hrdý název pro volání metod objektů.

Příklad: Lassie.sedni()

Dědičnost

Podtřídy jsou specializovanější verzemi tříd. Důležité je, že podtřídy dědí vlastnosti a metody třídy ze které pochází, ale mohou je měnit a rozšiřovat.

Mějme například třídy Kólie, Čivava a Ovčák. Všechny jsou potomky třídy Pes, a tak po něm dědí jeho vlastnosti a metody. Pokud v tomto stavu budeme chtít vytvořit objekt Lassie, nebudeme ho vytvářet jako potomka třídy Pes, ale použijeme rovnou třídu Kólie, protože již bude mít přednastaveny vlastnosti rasa=kolie a srst=hnedobila. U třídy Čivava zase můžeme metody štěkej() odtranit, protože nedává smysl . U třídy Ovčák pak přidáme metodu hlídejStado().

Abstrakce

Tvorba tříd a objektů tak, aby co nejlépe odpovídaly realitě.

Zapouzdření

Skrytí toho, co není potřeba.

Například metoda štěkej() bude nejspíš implementována metodami nádech() a výdech(). Běžného člověka ale nezajímá, jak přesně pes štěká, a tak mu programátor tyto metody skryje. K tomu slouží „typy“ metod public, protected a private a / nebo rozhraní (interfacy, podobné jak .h soubory v C).

Polymorfizmus

Schopnost různých objektů, které mají společné rozhraní, reagovat na volání metod tohoto rohraní ruzně.

Například mějme třídu Zvíře která má metodu mluv(). Třídy Pes a Kočka jsou podtřídou třídy Zvíře. Samozřejmě zdědí i metodu mluv(). Zavolení metody mluv() nad objektem ze třídy Pes pak vyustí v provedení metody štěkej(), zatímco u objektu třídy Kočka se o obsluhu této metody postará metoda mňoukej(). V Javě se k tomuto používají rozhraní (interfaces).

Třídně a prototypově orientované jazyky

U třídně orientovaných jazyků nejdříve nadefinujeme třídy a z nich pak tvoříme objekty. Takto funguje většina dnešních objektových jazyků.

Naproti tomu u prototypově orientovaných jazyků rovnou vytváříme objekty které něco dělají. Objekty je pak samozřejmě možné klonovat a rozšiřovat. Dědičnost se tu řeší delegováním – každý objekt může mít množinu jiných objektů na které deleguje zprávy (metody) kterým sám nerozumí. Jedinými široce používanými prototypově orientovanými jazyky jsou ty odvozené od ECMA scriptu: JavaScript, ActionScript.

OO přístup k tvorbě SW

Při návrhu software se hodně využívá nástrojů UML, které jsou k tomu vpodstatě stvořené.

Návrhové vzory

Design pattern (computer science)

Každý objektově orientovaný jazyk poskytuje trochu jiné možnosti, ale v zásadě existuje poměrně rozsáhlá kolekce tzv. návrhových vzorů, které jsou modelovými konstrukcemi v OOP. Tyto je dobré znát, protože při tvorbě aplikací se na problémy, které řeší, často naráží a je zbytečné znovu vynalézat kolo.

Singleton

Singleton pattern

„Jedináček“ se používá, když je potřeba mít v aplikaci pouze jednu instanci dané třídy. Obvykle jde například o nějaký řídící objekt, nebo se tímto nahrazují globální proměnné. V praxi se řeší tak, že existuje statická třída, která má privátní instanci sebe samy. Tato proměnná se jednou inicalizuje a pak je přístupná přes statickou metodu této třídy (getinstance).

Abstract Factory

Abstract factory pattern

V abstraktní Factory třídě deklarujeme factory method, která má vracet určitý typ objektu (např. Button). Pokud vytvoříme podtřídu Factory, můžeme se libovolně rozhodnout, jestli budeme vracet Button, nebo nějakou rozšiřující třídu (BigButton, InvisibleButton). Tento vzor se používá, pokud potřebujeme někde získat Button a je nám jedno, jaký konkrétní Button to bude.

Iterator

Iterator pattern

Iterator je vzor, který umožňuje procházet nějaký seznam aniž bychom věděli, jak je uvnitř implementovaný. Obvykle to bývá řešené tak, že požádáme seznam o Iterator, který pak poskytuje metody „has next?“ a „next“. První metodou zjišťujeme, jestli existuje v seznamu další prvek, druhou ho získáváme a posouváme Iterator dále.

Decorator

Decorator pattern

Dekorátor je třída, která umožňuje přidat ke třídě další vlastnosti dynamicky. To zařídíme tak, že si dekorující třída uloží do privátní proměnné dekorovanou instanci. Metody, které zůstanou původní, „deleguje“ – volá metody této instance. Metody, které se změní, nebo které jsou přidané, dekorující třída rovnou implementuje.

Shrnutí

OOP: abstrakce, zapouzdření, dědičnost, polymorfismus, tyhle jsou fakt důležité

třídní vs prototypové

třída vs objekt

předávání zpráv

UML

návrhové vzory