informatika:maturita:19a
Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revizePředchozí verzeNásledující verze | Předchozí verze | ||
| informatika:maturita:19a [26. 04. 2015, 01.33] – xzemla1 | informatika:maturita:19a [22. 02. 2026, 14.12] (aktuální) – xwolf4 | ||
|---|---|---|---|
| Řádek 1: | Řádek 1: | ||
| - | <WRAP center round alert 60%> | + | <WRAP center round tip 60%> |
| - | Ještě není dokončeno | + | Patří sem rozhraní??? |
| </ | </ | ||
| - | |||
| - | |||
| ====== Principy objektově orientovaného programování ====== | ====== Principy objektově orientovaného programování ====== | ||
| - | ===== základní jednotky OOP: ===== | + | ===== Vztah k ostatním paradigmatům |
| + | Každé programovací paradigma se snaží vyřešit problém sdíleného stavu programu. | ||
| + | * 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í - " | ||
| + | * objektové programování - stav je rozdělen na malé části a zapouzdřen logikou programu v 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ů. | ||
| - | ==== Třída ==== | + | 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čů, |
| - | vzor definován uživatelem, který může obsahovat metody i proměnné (např. třída clovek, obsahující proměnné, např: | + | ===== Zapouzdření ===== |
| - | <WRAP center round box 60%> | + | 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. |
| - | class Clovek{ | + | |
| - | string jmeno; | + | 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()). |
| - | int vek;} | + | ===== Dědičnost ===== |
| - | </ | + | 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, např: | + | |
| - | <WRAP center round box 60%> | + | |
| - | dychej(){...}; | + | |
| - | rekni(string co){...}; | + | např: |
| - | + | ||
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Objekt ==== | + | |
| - | + | ||
| - | instance třídy, vzájemně se liší svými vlastnostmi(atributy) a mají stejné metody jako třída | + | |
| - | + | ||
| - | např . | + | |
| <WRAP center round box 60%> | <WRAP center round box 60%> | ||
| - | clovek kaja{ | + | class Zpevak extends Clovek |
| - | jmeno = "Karel Novak"; | + | zpivej(){}; |
| - | vek = 55; | + | 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 // | ||
| - | a můžeme použít metodu | + | 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, |
| - | <WRAP center round box 60%> | + | |
| - | kaja.rekni("Mam hlad"); | + | |
| - | kaja.dychej(); | + | 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 ==== |
| + | Počet rodičovských tříd je určen použitým programovacím jazykem (např. Java umožňuje pouze jednu rodičovskou třídu, C++ umožňuje více). | ||
| - | můžeme si vytvořit více instancí: | ||
| - | <WRAP center round box 60%> | ||
| - | clovek honza{ | ||
| - | jmeno = "Jan Cerny"; | + | ===== 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 ) | ||
| - | vek = 10;} | + | Programovací jazyk se statickými typy ví, jaké datové typy používá, a proto umí vybrat správnou metodu při kompilaci. |
| - | </ | + | |
| - | a opět můžeme použít stejné metody... | + | Příkladem je třída PrintStream v jazyce Java (implementuje System.out.println()): |
| + | {{: | ||
| - | ===== Základní pilíře OOP ===== | + | ==== Runtime polymorfismus |
| - | OOP stojí na třech základních pilířích: | + | Při běhu programu se musí zjistit, který datový typ používá a tím pádem kterou metodu volat. |
| - | ==== Zapouzdření ==== | + | 2 způsoby implementace: |
| + | * alespoň 2 třídy mají stejnou rodičovskou třídu | ||
| + | * alespoň 2 třídy implementují stejné rozhraní | ||
| - | umožňuje nám skrýt ty metody a atributy, ke kterým nechceme, aby bylo možné přistupovat z vnějšku. Např. u třídy clovek můžeme proměnnou datumNarozeni nechat na skrytou | + | < |
| - | ==== Dědičnost ==== | + | public class OsobaGML { |
| + | public abstract void prezujSe(); | ||
| + | } | ||
| - | Usnadňuje vytváření podobných tříd. Z rodičovské třídy si vezme podtřída všechny metody a proměnné(resp. ty, které mají nastavenou viditelnost na public nebo protected) a může si navíc | + | public class StudentGML extends OsobaGML { |
| + | @Override | ||
| + | public void prezujSe() { | ||
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| - | např: | + | public |
| - | <WRAP center round box 60%> | + | @Override |
| - | class Zpevak | + | public void prezujSe() { |
| + | System.out.println(" | ||
| + | } | ||
| + | } | ||
| - | zpivej{}; | + | public static void main(String[] args){ |
| - | + | OsobaGML[] osoby = new {new KantorGML(), | |
| - | tancuj{}; | + | // Mám pole všech osob a chci, aby se všichni přezuli. |
| + | | ||
| + | osoba.prezujSe(); // Zde musí program rozlišit, jestli je konkrétní osoba kantorem nebo studentem. | ||
| + | } | ||
| } | } | ||
| - | </WRAP> | + | </code> |
| + | ===== 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. | ||
| + | * private - data jsou viditelná pouze pro konkrétní objekt | ||
| + | * public - data jsou viditelná komukoli | ||
| + | * protected - data jsou viditelná pouze pro konkrétní třídu a odvozené třídy | ||
| + | ===== Rozhraní ===== | ||
| + | Zjistíme, že programátor umí psát na počítači a účetní také. Intuitivně cítíme, že nebudou mít mnoho dalších společných schopností a navíc tuto dovednost může mít napříč povoláními leckdo, proto nemá smysl tvořit třídu na způsob ČlovekPracujícíSPočítačem a od ní dědit Programátora a Účetní, ale je výhodnější například vytvořit rozhraní SchopenPsátNaPočítači s požadavkem na metodu napišNaPočítači() a upravit třídy Programátor a Účetní tak, aby toto rozhraní implementovaly, | ||
| - | ==== Polymorfismus ==== | + | 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. |
| - | Umožňuje použít jednotné rozhraní pro práci s různými typy objektů | + | ===== Design patterns (návrhové vzory) ===== |
| - | např: | + | Navrhují konkrétní způsoby |
| - | instance třídy // | + | Výhody: |
| + | * rychlost implementace | ||
| + | * 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" | ||
| + | Nevýhody: | ||
| + | * Často vedou ke příliš komplikovanému kódu, protože byly použity, aniž by byly potřeba. | ||
| - | To znamená, | + | Tady je seznam nejdůležitějších z každé kategorie: |
| - | + | ==== Creational ==== | |
| - | Pod pojmem polymorfismus můžeme také rozumět | + | Nabízí alternativní způsoby vytvoření |
| - | Např metoda | + | * [[https:// |
| - | + | * [[https:// | |
| - | + | ==== Structural ==== | |
| - | ==== Vícenásobná dědičnost | + | Vysvětlují, jak uspořádat objekty do větších struktur. |
| - | Možnost potomka dědit z více tříd zároveň. Její použití se příliš neosvědčilo, | + | * [[https://en.wikipedia.org/wiki/Adapter_pattern|Adapter]] |
| + | * [[https://en.wikipedia.org/wiki/Decorator_pattern|Decorator]] | ||
| + | ==== Behavioral | ||
| + | Vysvětlují komunikaci mezi objekty. | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
informatika/maturita/19a.1430004797.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)
