OOP Flashcards
OOP paradigma - koncepty
Abstrakce - objekty Zapouzdření Polymorfismus Dědičnost Jsou to generická řešení
Objekt v OOP
Autonomní a výpočetně úplná entina
Každý objekt má identitu, která je nezávisla na atributech
Je to základní jednotka modularity a struktury objektově orientovaného programu
Abstrakce
Schopnost programu zjednošuit některé aspekty informací či vlastností objektů
Vytváření abstrakce - skrývání detailů do černé skříňky (blackbox), pro okolí je definována jen svým rozhraním, přes které komunikuje s okolím
Míra abstrakce - Jak moc je vzdálená funkčnost černé skříňky od reality
Zapouzdření
Zajišťuje (na úrovni sémantiky jazyka), že uživatel nemůže měnit interní stav objektů libovolným způsobem, ale musí k tomu využít poskytované rozhraní
Polymorfismus
Využívá mechanismus zasílání zpráv.
Stejnou zprávu lze zaslat různým objektům.
protokol umožňuje individuální reakci (invokaci různýh metod) v právě v zavislosti na tom, jakému objektu se zpráva zasílá.
Určení reakce na zprávu:
-statická - urči se při překladu (brzká vazba)
-dynamická - určí se za běhu programu (pozdní vazba)
může zaslání stejné zprávy objektu ve stejné proměnnépři provádění stejné části kódu vyvolat během různých kontextů(časových bodů, obsahů proměnných či instančních proměnných,hodnot parametrů) rozdílné reakce (invokovat různé metody).
Dědičnost
Způsob jak implementovat ssdílené chování.
Nové objekty mohou sdílet a rozšiřovat chování těch, které už existují bez nutnosti vše implementovat.
V praxi použitá ke dvěma účelům:
- k indikace, že nové chování specializuje jiné chování
- sdílení kódu
Identita
Porovnává zda jsou objekty totože. Tedy zda se jedná o stejný objekt. (Podle self parametru)
Shoda
Porovnání na základě obsahu (rovnost atributů)
Minimální model výpočtu
Obsahuje dvě základní sémantické konstrukce
přířazení
Zasílání zpráv
Minimální model výpočtu - přiřazení
Přířazení objektu do proměnné. Místo objektu se může pracovat s referencí nebo ukazatelem na daný objekt
Minimální model výpočtu - zasílání zprávy objektu
Samotná zpráva obsahuje kromě svého identifikátoru (jména) také argumenty a parametr self,this (implicitní, nebo explicitní).
Reakce na zprávy jsou nejčastěji implemntovány pomocí stejně pojmenovaných metod.
Funguje jak klasická funkce. Po vykonání metody to prostě skočí ven a něco to vrátí (možná)
Situace které mohou nastat po obdržení zprávy příjemcem
- Objekt nalezne metodu ve své implementaci a zavolá ji
- Objekt sice hledanou metodu neobsahuje, ale obsahuje ji jeden z jeho rodičovských objektů. (Směrování zpráv) Zavolá se
- Implementaci metody neobsahuje ani objekt ani žádný z jeho rodičovských oebjektů. Pak nastává výjimka, že daná metoda nebyla nalezena (Ve staticky typovaných už při překladu, jinak u intepretovaných to je až v průběhu)
Výhody OOP
Abstrakce Přirozenější práce s moduly Jednodušší dekompozice problémů Udržovatelnost a rozšiřitelnost Znovupoužitelnost
Nevýhody OOP
Složitá sémantika
nemožnost porušovat koncepci zapouzdření
Pomalejší kód
paměťová režie na objekty
Třída
Šablona pro tvorbu instancí . Stará se o správu protokolu objektu, směrování zpráv a obsahuje implementace některých metod
V některých jazycích (čistých oop) mají i třídy svoje třídy (Metatřídy) Třídou k metatříde je už samotná metatřída
Instance třídy
Objekt, který obsahuje naplněné instanční proměnné a odkaz na třídu ze které vznikl (typová informace)
Bezprostředně po vytvoření objektu je ještě prázdný. (Nemá inicializované data). K tomu slouží konstruktor (Hodně jazyků dodržuje to, že jméno konstruktoru odpovídá jménu třídy, nebo má předem definované jméno (python __init__()).
Pro tuto operaci existuje klíčové slovo new, které bere jako parametr jméno třídy a případný seznam parametrů předaných konstruktoru
Kopírování objektů
Deep copy - Překopírují se i obsahy objektů na které se referencuje
Shallow copy - zkopíruje objekt, i s referencemi (tzn. reference jsou stejné jako u kopírovaného objektu)
Rušení objektů v paměti
Automaticky - Garbage collector (nemožnost využití v realtime systémech, žere paměť) Pokud ztratím reference na objekt, dealokuje ho. Nedealokuje sockety ani file descriptory! Může se definovat tzv. finalizace, která zajistí úklid objektu před dealokací (To jestli se zavolá je na jazyku) Java, Python
Manuálně - destruktor. Programátor si nadefinuje úklid funkce. Po zavolání destruktoru se provede úklid a objekt se vymaže v paměti
Dědičnost tříd
Znovupoužití definované třídy pro specifictější verzi třídy (typu)
Zajištění zpětné kompatibility
Dědí se atributy, ale i metody, včetně jejich implementace. (Tady vznikají problémy metod stejných jmen s jinou implementací při vícenasobce)
Klasifikace dědičnosti tříd
Jednoduchá dědičnost
Vícenasobná dědičnost
Jednoduchá dědičnost
Každý potomek má nejvýše jednoho přímého předka (rodiče) Java, SmallTalk, C#
Vícenásobná dědičnost
Třída může dědit od více přímých předků (více jak jednoho)
Problémy vícenasobné dědičnosti
Konfilkty a Duplikace jmen členů různých předků (Které jméno vybrat?) C++ virtual to řeší. (Nejčastěji se zakazuje jejich výskyt)
Vytvoření optimálního a nejpoužitelnějšího algoritmu pro vyhledávání metod, které mají reagovat na zaslanou zprávu (Nutnost průchodu orientovaným grafem místo stromu)
Dědičnost rozhraní
Interface - Definuje seznam nějakých metod nutných v potomkovi implementovat. (můžeme dědit interfacy, pak musíme implementovat metody všech interfacu)