Uživatelské nástroje

Nástroje pro tento web


pitel:isz:oop

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.


pitel:isz:oop [30. 12. 2022, 13.43:01] (aktuální) – vytvořeno - upraveno mimo DokuWiki 127.0.0.1
Řádek 1: Řádek 1:
 +====== Objektová orientace ======
 +[[wp>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 [[wp>Class-based programming|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 [[wp>Prototype-based programming|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 ====
 +[[wp>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 ===
 +[[wp>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 ===
 +[[wp>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 ===
 +[[wp>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 ===
 +[[wp>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