Uživatelské nástroje

Nástroje pro tento web


informatika:maturita:19a

Rozdíly

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

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
informatika:maturita:19a [25. 02. 2018, 22.53] – [Dědičnost] xjasekinformatika:maturita:19a [22. 02. 2026, 14.12] (aktuální) xwolf4
Řádek 1: Řádek 1:
 +<WRAP center round tip 60%>
 +Patří sem rozhraní???
 +</WRAP>
 ====== Principy objektově orientovaného programování ====== ====== Principy objektově orientovaného programování ======
  
 ===== Vztah k ostatním paradigmatům ===== ===== Vztah k ostatním paradigmatům =====
- +Každé programovací paradigma se snaží vyřešit problém sdíleného stavu programu. 
-Na rozdíl od imperativního a strukturovaného programování je výkonný kód objektově orientovaného programování obsažen v rámci objektů. To znamená, že konkrétní hodnoty jsou uloženy jako atributy těchto objektů. Zpracování atributů spolu s celkovou komunikací s objekty probíhá pomocí kódu, který je obsažený v metodách objektů. Navenek pak program působí jako několik navzájem spolupracujících objektů, což umožňuje snadnější přenos kódu mezi různými projekty a jednodušší úpravu již existujícího kódu pomocí dědičnosti. Další výhodou je také větší zabezpečení dat díky viditelnosti atributů.+  * imperativní programování - výchozí způsob - stav je libovolně měnitelný a je sdílen v globálních a lokálních proměnných 
 +  * funkcionální programování - "žádný sdílený stav neexistuje" - stav je neměnný, mezi tzv. "pure" funkcemi bez vedlejších účinků se posílají kopie stavu 
 +  * objektové programování - stav je rozdělen na malé části a zapouzdřen logikou programu objektech 
 +To znamená, že konkrétní hodnoty jsou uloženy jako atributy těchto objektů. Zpracování atributů spolu s celkovou komunikací s objekty probíhá pomocí kódu, který je obsažený v metodách objektů. Navenek pak program působí jako několik navzájem spolupracujících objektů, což umožňuje snadnější přenos kódu mezi různými projekty a jednodušší úpravu již existujícího kódu pomocí dědičnosti. Další výhodou je také větší zabezpečení dat díky viditelnosti atributů.
  
 Nevýhodou objektově orientovaného programování je jeho větší náročnost na paměť a výpočetní rychlost, proto se používá hlavně u moderních počítačů, kde jsou tyto nevýhody téměř neznatelné. U mikropočítačů a jednoduchých jednoúčelových strojů je však výhodnější použití strukturovaného programování. Nevýhodou objektově orientovaného programování je jeho větší náročnost na paměť a výpočetní rychlost, proto se používá hlavně u moderních počítačů, kde jsou tyto nevýhody téměř neznatelné. U mikropočítačů a jednoduchých jednoúčelových strojů je však výhodnější použití strukturovaného programování.
  
 ===== Zapouzdření ===== ===== Zapouzdření =====
 +Zapouzdření není výhradně koncept OOP. Obecně v programování znamená, že nějaké data nebo logiku schováme za restriktivním rozhraním.
  
-Zapouzdření může být chápáno jako zabalení dat a metod do jednoho objektuTento proces váže data s metodami, které s těmito daty pracují, čímž umožňuje základní funkce OOP. Další funkcí zapouzdření je znepřístupnění dat a metod na základě jejich viditelnosti.+V OOP je tento koncept implementován třídami, kde data jsou schována v podobě privátních atributů, které můžeme manipulovat pomocí public metod. Příkladem zapouzdření je například kolekce HashMap v jazyce Java (skrývá implementaci hašovací tabulky za metodami .put() nebo .getOrDefault()).
  
 ===== Dědičnost ===== ===== Dědičnost =====
  
-Dědičnost umožňuje tvorbu nových tříd podle již vytvořených tříd. Tyto odvozené třídy pak obsahují všechny atributy a metody rodičovských tříd. Odvozené třídy si mohou tyto data různě upravovat nebo přidávat další. +Dědičnost umožňuje tvorbu nových tříd podle již vytvořených tříd. Tyto odvozené třídy sdědí všechny public a protected atributy a metody rodičovských tříd. Odvozené třídy si mohou tato data různě upravovat nebo přidávat další. 
  
 např: např:
Řádek 19: Řádek 26:
 class Zpevak extends Clovek { class Zpevak extends Clovek {
  
-zpivej{};+zpivej(){};
  
-tancuj{};+tancuj(){};
 } }
 </WRAP> </WRAP>
 V tomto příkladu jsme vytvořili novou třídu //Zpevak//, která je odvozena od třídy //Clovek//. Objekt třídy //Zpevak// tedy může využívat všechny atributy a metody třídy //Clovek// (např. metoda //vstan()// a atribut //barvaOci//) a zároveň nově vytvořené metody //zpivej()// a //tancuj()//. V tomto příkladu jsme vytvořili novou třídu //Zpevak//, která je odvozena od třídy //Clovek//. Objekt třídy //Zpevak// tedy může využívat všechny atributy a metody třídy //Clovek// (např. metoda //vstan()// a atribut //barvaOci//) a zároveň nově vytvořené metody //zpivej()// a //tancuj()//.
 +
 +Podle kritiků by se dědičnost měla používat velmi vzácně, protože vytváří problém přílišné abstrakce a hluboké hiearchie dědičnosti, ve které člověk nepozná, kde je logika skutečně implementována. Z těchto důvodů existuje nepsané pravidlo, že dědičnost by měla být hluboká pouze 1 vrstvu. (dceřiná třída nesmí být rodičovskou třídou pro jiné třídy)
 +
 +Na druhou stranu existují případy, kde je vícevrstvá dědičnost velmi výhodná - například při implementaci datových struktur ve standardní knihovně jazyku Java nebo ve vývoji her (hierarchie typu Entity -> Character -> Player).
  
 ==== Vícenásobná dědičnost ==== ==== Vícenásobná dědičnost ====
Řádek 31: Řádek 42:
  
 ===== Polymorfismus ===== ===== Polymorfismus =====
 +Umožňuje použít jednotné rozhraní pro práci s různými typy objektů.
 +==== Compile-time polymorfismus ====
 +Přetěžování metod - metoda může fungovat více různými způsoby, které se rozliší podle druhu a počtu parametrů. (funguje pouze v jazycích s )
  
-Umožňuje použít jednotné rozhraní pro práci s různými typy objektů +Programovací jazyk se statickými typy ví, jaké datové typy používá, a proto umí vybrat správnou metodu při kompilaci.
-např:+
  
-instance ídy //mladyClovek// bude metodu //presunSe();// vykonávat za pomocí metody //chod//, ale instance třídy //staryClovek// bude tu samou metodu //presunSe();// vykonávat za pomocí //chodOHoli//+Příkladem je ída PrintStream v jazyce Java (implementuje System.out.println())
 +{{:informatika:maturita:java_printstream.png?800|}}
  
-To znamená, že když každý objekt tuto metodu vykonává jinak, z vnějšího hlediska se tváří stejně my nemusíme tedy přemýšlet, jak přesně toho u různých objektů docílit.+==== Runtime polymorfismus ==== 
 +běhu programu se musí zjistit, který datový typ používá tím pádem kterou metodu volat.
  
-Pod pojmem polymorfismus můžeme také rozumět **Přetěžování metod** - to znamená že metoda může fungovat více různými způsoby, které se rozliší podle druhu a počtu parametrů.  +způsoby implementace: 
-Např metoda //rekni(string vyrok);// umožní objektu clovek říct nějaký výrok jen tak do prázdna, zatímco metoda //rekni(string vyrok; clovek prijemce; zpusobHlasitosti hlasitost)// umožní tomu samému objektu říct výrok konkrétnímu příjemci a zvolenou hlasitostí.+  * alespoň 2 třídy mají stejnou rodičovskou třídu 
 +  * alespoň 2 třídy implementují stejné rozhraní
  
-V některých programovacích jazycích umožňuje polymorfismus metodám také různé zpracování parametrů různého typu.+<code> 
 +public class OsobaGML { 
 +    public abstract void prezujSe(); 
 +}
  
 +public class StudentGML extends OsobaGML {
 +    @Override
 +    public void prezujSe() {
 +        System.out.println("Jdu ke skříňkám, otevřu svou skříňku, přezuji se.")
 +    }
 +}
 +
 +public class KantorGML extends OsobaGML {
 +    @Override
 +    public void prezujSe() {
 +        System.out.println("Jdu do svého kabinetu, přezuji se.")
 +    }
 +}
 +
 +public static void main(String[] args){
 +    OsobaGML[] osoby = new {new KantorGML(), new StudentGML()};
 +    // Mám pole všech osob a chci, aby se všichni přezuli.
 +    for(osoba : osoby){
 +        osoba.prezujSe(); // Zde musí program rozlišit, jestli je konkrétní osoba kantorem nebo studentem.
 +    }
 +}
 +</code>
 ===== Viditelnost atributů a metod ===== ===== Viditelnost atributů a metod =====
 Nastavením viditelnosti dat můžeme určit, které části programu budou mít k těmto datům přístup. Nastavit můžeme tři základní možnosti. Nastavením viditelnosti dat můžeme určit, které části programu budou mít k těmto datům přístup. Nastavit můžeme tři základní možnosti.
Řádek 54: Řádek 95:
  
 Obdobně může abstraktní třída předepisovat doimplementování metod, pro které ona sama nemá vlastní kód, ale jen předpis abstraktní metody. Obdobně může abstraktní třída předepisovat doimplementování metod, pro které ona sama nemá vlastní kód, ale jen předpis abstraktní metody.
 +
 +===== Design patterns (návrhové vzory) =====
 +Navrhují konkrétní způsoby řešení častých problémů v OOP. Tyto způsoby byly poprvé popsány v knize [[https://en.wikipedia.org/wiki/Design_Patterns#Patterns_by_type|Design Patterns]] v roce 1994.
 +
 +Výhody:
 +  * rychlost implementace (Nemusím vymyslet způsob řešení problému.)
 +  * komunikace v týmu (Kolega rychle pochopí, protože taky dobře zná tyto návrhové vzory-)
 +  * údržba kódu (Tyto vzory vytváří tzv. "loose coupling". To znamená, že můžu nahradit jednu část systému, aniž bych rozbil všechno ostatní.)
 +Nevýhody:
 +  * Často vedou ke příliš komplikovanému kódu, protože byly použity, aniž by byly potřeba.
 +
 +Tady je seznam nejdůležitějších z každé kategorie:
 +==== Creational ====
 +Nabízí alternativní způsoby vytvoření objektů.
 +  * [[https://en.wikipedia.org/wiki/Builder_pattern|Builder]]
 +  * [[https://en.wikipedia.org/wiki/Singleton_pattern|Singleton]]
 +==== Structural ====
 +Vysvětlují, jak uspořádat objekty do větších struktur.
 +  * [[https://en.wikipedia.org/wiki/Adapter_pattern|Adapter]]
 +  * [[https://en.wikipedia.org/wiki/Decorator_pattern|Decorator]]
 +==== Behavioral ====
 +Vysvětlují komunikaci mezi objekty.
 +  * [[https://en.wikipedia.org/wiki/Iterator|Iterator]]
 +  * [[https://en.wikipedia.org/wiki/Observer_pattern|Observer]]
 +
informatika/maturita/19a.1519595603.txt.gz · Poslední úprava: autor: xjasek

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki