VII. Programovací jazyky a objektové programování. Programovací jazyky – charakteristika,syntaxe, sémantika. Objektové programování – vlastnosti objektů, principy návrhu. Flashcards

1
Q

Program

A

Program je zápis algoritmu v programovacím jazyku.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Programovací jazyk

A

Programovací jazyk je soubor pravidel pro zápis algoritmu.

  • programovací jazyk á svoji syntaxi (souhrn pravidel) a sémantiku (množina slov a pravidla, která jim přiřazují význam.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Zdrojový text programu

A

Zdrojový text programu - algoritmus zapsaný v programovacím jazyku

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Strojový kód

A

Strojový kód - instrukce pro daný stroj.

Instrukce – příkaz, kterému rozumí CPU (procesor)

Instrukční sada – soubor instrukcí daného procesoru

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Podle míry abstrakce dělíme programovací jazyky do dvou skupin:

A

Podle míry abstrakce dělíme programovací jazyky do dvou skupin:

  • Nižší – závislé na HW (na procesoru) - např. assembler
  • Vyšší – nezávislé na HW
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Členění programovacích jazyků dle způsobu překladu:

A

Členění dle způsobu překladu:

  • Kompilované
  • Interpretované
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Kompilace

A

Při kompilaci dochází k převodu programu zapsaného v programovacím jazyce do strojového kódu. Program je kompilátorem příslušného programovacího jazyka zkompilován pouze tehdy, pokud neobsahuje žádné syntaktické chyby. Kompilací vzniklý soubor ještě není přímo spustitelný, ale musí být sestaven do spustitelného tvaru pomocí spojovače (linkeru). Linker spojí dohromady moduly a knihovní soubory podle závislostí, řeší globální proměnné a relativní adresaci. Výsledkem linkování je spustitelný program (v případě OS Windows soubor s příponou EXE)

Používané techniky optimalizace – odstranění mrtvého kódu, vkládání těl metod, rozbalení smyček, odstranění shodných podvýrazů.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Interpretace

A

U interpretace je zdrojový je zdrojový kód čten řádek po řádku a ihned vykováván. Výhodou je pružnost a možnost přepínání mezi vývojovým prostředím a běžícím programem. Vykonávání programu je ale pomalejší, protože na rozdíl od kompilace zde není možnost optimalizace kódu.

Formy interpretace:

  • Čistá interpretace
  • Překlad do pseudokódu a jeho interpretace (např. Java)
  • JIT (Just in time) interpretace – před interpretací je program kompilován a optimalizován
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Chyby v programech

A

Chyby v programech

  • Syntaktické
  • Chyby při zpracování
  • Sémantické (logické) chyby

Proces odstraňování chyb v programu se nazývá ladění (debugging). Prostředek pro procházení programu po jednotlivých příkazech a možností výpisu hodnoty proměnných se nazývá debuger.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Assembler

A

Assembler

  • Nízkoúrovňový – binární zápis instrukcí
  • Adresy se označily symbolickými jmény
  • Vznik v 50. letech – druhá generace
  • „assembler“ (z anglického Assembly Language)
  • Assembler je technicky překladač jazyka symbolických adres
  • Symbolická reprezentace strojových instrukcí
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Vyšší programovací jazyky

A

Vyšší programovací jazyky

  • Procedurální – strukturované – Fortran, Algol, Cobol, Basic, PL/1, dbase, clipper, FoxPro…
  • Neprocedurální (deklarativní) – SQL
  • Funkcionální – LISP, APL, Haskell, Erlang
  • Objektově orientované – SmallTalk, C++, Java
  • Logické – Prolog, Absys, Planner
  • Značkové – HTML, XML (1996)
  • Skriptovací – JavaScript, PHP, Lua, Perl, Python…

Poznámka

Deklarativní programovací jazyky jsou založeny na popisu cíle – přesný algoritmus je záležitostí překladače. Příkladem je databázový dotazovací jazyk SQL – příkazem SQL říkáme databázovému stroji, co chceme dělat (např. načíst data za určitých podmínek), ale neříkáme mu, jak má tento příkaz provést.

Funkcionální jazyky zacházejí s výpočtem jako s vyhodnocením funkcí, aplikace je složena z funkcí, masivní využití rekurzí. Funkcionální jazyky jsou nejčistší implementací lambda kalkulu. Využití v umělé inteligenci, AUTOCAD (AutoLisp), unixový editor Emacs atd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

CASE sensitivita

A

CASE sensitivita – je-li programovací jazyk case sensitivní, znamená to, že rozlišuje velká a malá písmena v názvech proměnných, příkazů, funkcí…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Základní prvky programu

A

Základní prvky programu

  • Proměnná
  • Přiřazení
  • Cyklus
  • Podmínky pro větvení
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Proměnná

A

Proměnná = úložiště informace – má vyhrazené místo v paměti, proměnná má typ a hodnotu.

Příklad deklarace proměnné z jazyka C:

int i; // deklaruji proměnnou i typu integer (celé číslo bez desetin)

i = 5; // do proměnné i ukládám hodnotu 5

Ukázka v jazyce Basic (textová proměnná):

Dimension Txt as string

Txt = „Ahoj“

Ukázka v jazyce C:

Char *Txt;

Malloc(Txt,10);

Strcpy(Txt, „Ahoj“);

Porovnání

if ( Hodnota == 0)

{ // příkazy pokud podmínka platí

Vysledek = TRUE;

}

Else

{

// příkazy pokud podmínka neplatí

Vysledek = FALSE;

}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Cyklus

A

Cyklus

V příkladu výše je uveden tzv. zdánlivě nekonečný cyklus. Cyklus probíhá, dokud platí podmínka (porovnání ve „while“, dokud má proměnná „cyklus“ hodnotu true, pokud se vyhodnotí podmínka v if jako pravda, nastaví se proměnná cyklus na hodnotu „false“ a tím je cyklus ukončen. Zdánlivě nekonečný je z toho důvodu, že pokud by podmínka v konstrukci if nebyla nikdy splněna, cyklus by běžel do nekonečna).

Jiným typem cyklu je for cyklus, skládá se z: inicializátor, podmínka, přírůstek, tělo cyklu.

For ($i=1, $<10; $i++)

{

// proveď příkaz(y) = tělo cyklu

}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Rekurze

A

Rekurze je opakované, vnořené volání stejné funkce.

Typy:

a) Přímá – podprogram volá sám sebe
b) Nepřímá – vzájemné volání podprogramů vytvoří kruh

Příklad

Výpočet faktoriálu N! = N * (N – 1)!

Př. 5! = 5*4*3*2*1 = 120

Sub Faktorial(N)

(

if N = 0 then

Vysledek = 1

else

Vysledek = N * Faktorial(N – 1)

endif

)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Frameworky

A

Frameworky

SW poskytující prostředí a základní funkcionalitu. Příklad: NET, COCOA (framework pro počítače Apple), Oracle Application Development Framework, Eclipse, PHP Zend, Nette,…

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

CASE nástroje

A

CASE = Computer Aided Software Engineering

  • Nástroj k vývoji, modernizaci a údržbě SW
  • Kombinace SW nástrojů a strukturovaných metodologií

Účel: modelování, generování zdrojových kódů, reverse engineering (zpětné inženýrství – získání zdrojového kódu z aplikace)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Komponenty CASE nástrojů:

A

Komponenty CASE nástrojů:

  • Grafické ovládací prostředí
  • Repository – centrální databáze objektů, proměnných…
  • Podpora normalizace dat
  • Verifikace konzistentní dat
  • Nástroj pro návrh
  • Textový editor pro popis objektů
  • Generátor zdrojových kódů
  • Import/export dat
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Typy CASE nástrojů:

A

Typy CASE nástrojů:

  • Upper CASE – globální analýza, plánování
  • Middle CASE – detailní analýza, návrh IS
  • Lower CASE – fyzická (programová) realizace

I-CASE (integrovaný CASE) – podporuje všechny životní cykly projektu – včetně generování SW, tvorbu a údržbu dokumentace atd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Přínosy použití CASE:

A

Přínosy použití CASE

  • Eliminace neproduktivního času projektantů
  • Zvýšení kvality SW
  • Urychlení procesu vývoje
  • Jednodušší provádění změn
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Syntaxe

A

Syntaxe

V informatice je syntaxe programovacího jazyka soubor pravidel, která definují kombinaci symbolů, které jsou považovány za správně strukturovaný dokument nebo fragment v tomto jazyce. To platí jak pro programovací jazyky, kde dokument představuje zdrojový kód, tak pro značkovací jazyky, kde dokument představuje data. Syntaxe jazyka definuje jeho povrchovou formu. Textové programovací jazyky jsou založeny na posloupnosti znaků, zatímco vizuální programovací jazyky jsou založeny na prostorovém uspořádání a spojení mezi symboly (které mohou být textové nebo grafické). Dokumenty, které jsou syntaktický neplatné, obsahují syntaktickou chybu.

Syntaxe – forma – je protikladem k sémantice – významu. Při zpracování programovacích jazyků, sémantické zpracování obvykle přichází po syntaktickém zpracování, ale v některých případech je sémantické zpracování nezbytné pro dokončení syntaktické analýzy, a ty jsou prováděny společně nebo současně. V překladači, front-end (přední část) provádí syntaktickou analýzu, zatímco sémantickou analýzu provádí back-end (zadní část; a middle-end, pokud je tato fáze rozlišována)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Úrovně syntaxe

A

Úrovně syntaxe

Syntaxe programovacího jazyka je obvykle rozdělena do tří úrovní.

  • Slova – lexikální úroveň; určuje, jak znaky vytváří tokeny
  • Fráze – gramatická úroveň, stručně řečeno, určuje jak tokeny utváří fráze
  • Kontext – určuje na které objekty nebo proměnné názvy odkazují, jestli jsou typy validní atd.

Rozdělení tímto způsobem přináší modularitu umožňující každé úrovni být popsána a zpracována samostatně a často nezávisle. Nejprve lexer převede lineární posloupnost znaků na lineární posloupnost tokenů, což je známo jako „lexikální analýza“ nebo „lexing“. Poté parser převede lineární posloupnost tokenů na hierarchický syntaktický strom, což je známo jako „syntaktická analýza“. Nakonec kontextová analýza překládá názvy a provádí typovou kontrolu.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Sémantika

A

Sémantika programovacích jazyků je v teorii programovacích jazyků obor zabývající se důsledným matematickým popisem významu programovacího jazyka. Zhodnocuje význam syntakticky platných řetězců v daném programovacím jazyce, včetně jejich výpočtu. V případě ohodnocování syntakticky neplatných řetězců, není výpočet proveden.

Sémantika popisuje procesy, které řídí počítač při vykonávání programu v daném programovacím jazyce. Například tím, že popisuje vztah mezi vstupem a výstupem programu, nebo popisem, jak program poběží na určité platformě, tedy vytvořením modelu výpočtu.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Statická sémantika

A

Statická sémantika

Statická sémantika je řešena při překladu programu, zde jsou definovány a deklarovány jednotlivá pravidla a prvky programovacího jazyka. V těchto prvcích je zahrnuta jazyková konstrukce, její typy parametrů, význam příkazů a další prvky. Statická sémantika dále kontroluje statické typy a práci s tabulkou definovaných programových symbolů.

  • Staticky typované jazyky požadují uvedení do datového typu u každé deklarace. Zde nelze deklarovat proměnnou, funkci nebo objekt bez zadání datového typu.
  • Všechny typové kontroly jsou prováděny staticky při překladu. Už při překladu má být každé proměnné přiřazen datový typ.
  • Je možné daný datový typ přímo přetypovat. Přetypování především slouží k obcházení typových kontrol.
  • Výhodou statického typování je lepší možnost odhalení datových chyb.
  • Hlavní nevýhodou této metody je větší složitost programových konstrukcí, délka zdrojového kódu a tím i menší pružnost programovacího jazyka.
  • K nejčastěji vyskytovaným běhovým chybám patří přetečení datového typu.
  • Mezi nejznámější zástupce staticky typovaných jazyků patří Java, Ada a jazyk C.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Dynamická sémantika

A

Dynamická sémantika

Dynamická sémantika je řešena přímo za běhu programu. Dynamicky typované jazyky jsou významné v jednotlivých jazykových konstrukcích. Jaký úkon se má provést, když je v programu napsán daný příkaz nebo priorita operátorů. Dynamická sémantika je obzvlášť náročná u programovacích jazyků s rekurzivním voláním podprogramů, proto je nutné vést evidenci o volání téhož podprogramu. Z kterého se vytváří aktivační záznamy pro jednotlivá volání podprogramů a jejich následné ukládání do zásobníku.

  • U dynamicky typovaných jazyků není vyžadováno uvádění datových typů v deklaracích, některé nevyžadují ani deklarace.
  • Datový typ proměnné je vázáno na formu první hodnoty. Hodnota a datový typ nově vytvořené proměnné je dána výsledkem předchozího vyhodnoceného výrazu.
  • Prakticky všechny typové kontroly (až na pár výjimek) probíhají dynamicky za běhu programu a zároveň probíhá automatické přetypování proměnných. Ze strany uživatele není problém kdykoliv měnit datový typ proměnné za běhu programu.
  • Výhodou dynamického typování je kratší a jednodušší zdrojový kód, a tím i jeho lepší čitelnost.
  • Naopak k nevýhodám patří možnost výskytu typových chyb za běhu programu.
  • Mezi nejznámější zástupce dynamicky typovaných jazyků patří Python, SmallTalk, Prolog.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Silné a slabé typové kontroly

A

Silné a slabé typové kontroly

  • Většina dynamicky typovaných jazyků vykonává silné typové kontroly za běhu programu.
  • Staticky silně typované Java, Ada, Rust
  • Ke staticky slabě typovaným jazykům patří například jazyk C a JavaScript (s výjimkou rozšíření asm.js)
28
Q

Přístupy sémantiky

A

Přístupy

Ve formální sémantice existuje mnoho různých přístupů. Níže jsou tři nejpoužívanější:

Rozdíly mezi těmito třemi přístupy mohou být vágní. Ale všechny známé přístupy k formální sémantice používají tyto výše zmíněné tři techniky, nebo jejich kombinace.

Mimo volby mezi denotačním, operačním a axiomatickým přístupem, většina rozdílů ve formální sémantice vyplývá z volby podpory matematického formalismu.

29
Q

Denotační sémantika

A
  • Denotační sémantika, kde je každá fráze jazyka interpretována jako denotace. Tyto denotace často bývají matematickými objekty, ovšem není to podmínkou. V praxi je nezbytné, aby byly denotace popsány nějakou formou matematického zápisu, která může být formalizována jako denotační metajazyk. Například denotační sémantika funkčního jazyka často překládá jazyk do teorie domén. Popis denotační sémantikou může také sloužit pro překlady z programovacího jazyka do denotačního metajazyka a být použit jako základ pro návrh překladače.
30
Q

Operační sémantika

A
  • Operační sémantika, kde je provádění jazyka popsáno přímo (nikoliv při překladu). Operační sémantika volně odpovídá interpretaci, kdy je použitý jazyk interpretu obecně matematicky formální. Operační sémantika může definována pomocí abstraktního stroje, který dává frázím význam pomocí přechodu stavů stroje. Alternativně může být operační sémantika definována pomocí syntaktických transformací na fráze samotného jazyka.
31
Q

Objektové programování

A

Objektové programování

Objektově orientované programování (OOP; Object-oriented programming) je v informatice specifické programovací paradigma, které ho odlišilo od původního imperativního. Výkonný kód je v objektovém programování přidružen k datům (metody jsou zapouzdřeny v objektech), což umožňuje snadnější přenos kódu mezi různými projekty (abstrakce a zapouzdření). Propojení umožnilo zavést dědičnost, ale kvůli zjednodušení si vyžádalo zavedení polymorfismu.

32
Q

Koncepce objektového programování

A

Koncepce

  • Objekty
  • Abstrakce
  • Zapouzdření
  • Kompozice
  • Delegování
  • Dědičnost
  • Polymorfismus

Některé z těchto vlastností jsou pro OOP unikátní, jiné (např. abstrakce) jsou běžnou vlastností i jiných metodik. OOP je někdy označováno jako programátorské paradigma, neboť popisuje nejen způsob vývoje a zápisu programu, ale i způsob, jakým návrhář programu o problému přemýšlí.

33
Q

Objekty

A
  • Objekty – jednotlivé prvky modelované reality (jak data, tak související funkčnost) jsou v programu seskupeny do entit, nazývaných objekty. Objekty si pamatují svůj stav a navenek poskytují operace (přístupné jako metody pro volání).
34
Q

Abstrakce

A
  • Abstrakce – programátor, potažmo program, který vytváří, může abstrahovat od některých detailů práce jednotlivých objektů. Každý objekt pracuje jako černá skříňka, která dokáže provádět určené činnosti a komunikovat s okolím, aniž by vyžadovala znalost způsobu, kterým vnitřně pracuje
35
Q

Zapouzdření

A
  • Zapouzdření – zaručuje, že objekt nemůže přímo přistupovat k „vnitřnostem“ jiných objektů, což by mohlo vést k nekonzistenci. Každý objekt navenek zpřístupňuje rozhraní, pomocí kterého (a nijak jinak) se s objektem pracuje, a k tomu se používají: modifikátory přístupu, jmenný prostor…
36
Q

Kompozice

A
  • Kompozice – objekt může obsahovat jiné objekty
37
Q

Delegování

A
  • Delegování – objekt může využívat služeb jiných objektů tak, že je požádá o provedení operace, ty tedy pro okolí vystavují své služby.
38
Q

Dědičnost

A
  • Dědičnost – objekty jsou organizovány stromovým způsobem, kdy objekty nějakého druhu mohou dědit z jiného druhu objektů, čímž přebírají jejich schopnosti, ke kterým pouze přidávají svoje vlastní rozšíření. Tato myšlenka se obvykle implementuje pomocí rozdělení objektů do tříd, přičemž každý objekt je instancí nějaké třídy. Každá třída pak může dědit od jiné třídy (v některých programovacích jazycích i z několika jiných tříd)
39
Q

Polymorfismus

A
  • Polymorfismus – odkazovaný objekt se chová podle toho, jaké třídy je instancí. Pozná se tak, že několik objektů poskytuje stejné rozhraní, pracuje s nimi navenek stejným způsobem, ale jejich konkrétní chování se liší podle implementace. U polymorfismu podmíněného dědičností to znamená, že na místo, kde je očekávána instance nějaké třídy, můžeme dosadit i instanci libovolné její podtřídy, neboť rozhraní třídy je podmnožinou rozhraní podtřídy. U polymorfismu nepodmíněného dědičností je dostačující, jestliže se rozhraní (nebo jejich požadované části) u různých tříd shodují, pak jsou vzájemně polymorfní.
40
Q

Vztah k principům a fungování reálného světa

A

Vztah k principům a fungování reálného světa

Základním paradigmatem OOP je snaha modelovat při řešení úloh principy reálného světa v počítači, pokud možno jedna ku jedné. V praktickém životě otevíráme dveře pořád stejně, bez ohledu na to, zda jsou dřevěné nebo laminované, zda mají kukátko, bezpečnostní vložku nebo řetízek navíc. Stejně tak se můžeme dívat na televizi, přepínat programy a docela dobře ji ovládat, přestože nevíme vůbec nic o principech jejího fungování. Analogicky při vývoji složitých informačních systémů mohou vývojáři používat již vytvořené komponenty, podle potřeby si je trochu upravit nebo je používat jako stavebnici pro sestavování důmyslnějších a složitějších objektů.

41
Q

Programovací jazyky

A

Programovací jazyky

Existuje velké množství programovacích jazyků umožňujících objektově orientované programování, např. Perl, Smalltalk, Java, C++, Object Pascal, C#, Visual Basic .NET, Lisp, PHP, Python, Ruby, Go, D…

Tyto jazyky můžeme rozčlenit do mnoha skupin, jako např.

  • Tzv. čistě objektové jazyky, někdy nazývané objektové, ve kterých výpočet probíhá výhradně interakcí objektů, a to vzájemným zasíláním zpráv. Sem patří např. Smalltalk a Ruby.
  • Tzv. hybridní jazyky, nebo také objektově orientované, které jsou vytvořeny na imperativním programování a obvykle pouze částečně implementují vlastnosti objektového programování. Mezi takové jazyky patří například C++, Go, Rust a D.
  • Objektová rozšíření původně neobjektových jazyků např. Object Pascal, který vznikl jako rozšíření neobjektového jazyka Pascal.
42
Q

Objekty a jejich vlastnosti

A

Objekty

Objekt:

  • Abstrakce z reality​
  • Spojení dat (údajů, proměnných, datových atributů) a činností, které je možné s těmito daty provádět (metod)​

Obecné objektové vlastnosti:

  • používání abstrakce
  • definování tříd objektů
  • existence objektů (instancí)
  • komunikace objektů (posílání zpráv, volání metod)
  • zapouzdření a ukrývání implementace
  • dědičnost
  • polymorfismus
43
Q

Abstrakce

A

Abstrakce

Abstrakce je základní objektovou vlastností. Skutečnost, kterou chceme do programu promítnout, musíme vždy zjednodušit, pracovat jen s těmi daty, která jsou pro nás důležitá.

První příklad: Když chceme udělat počítačovou evidenci knih, které jsou k dispozici v obchodě, bude základem abstrakce knihy. V knihkupectví nás bude pravděpodobně u každé knihy zajímat: autor, název, ISBN, vydavatel, žánr, cena, počet kusů na skladě. S knihou budeme provádět např. tyto činnosti: založení nové knihy, změna množství na skladě, změna ceny.

Druhý příklad: Chceme napsat aplikaci pro kreslení. Tvary (čtverce, obdélníky, kruhy, trojúhelníky atd.), které budou nakresleny, jsou objekty. U každého nakresleného tvaru musíme sledovat např. tato data: souřadnice umístění, rozměry tvaru, barvu čáry, barvu výplně. Metody neboli činnosti, které bude možno v takové aplikaci provádět s jednotlivými tvary, budou například tyto: nakreslení, zvětšení, zmenšení, změna barvy, posun, vymazání.

44
Q

Třída a instance

A

Třída a instance

Třída je obecný popis, ve kterém se deklarují (určí) data (datové atributy), která budou popisovat stav objektu, a metody, které definují činnosti, jaké je možné s objekty provádět. (př. třída: čtverec, atributy: velikost a barva, metody: kresli)

  • Objekty s podobnými vlastnostmi sdružujeme do tříd. Příslušnost objektu do třídy vyjadřujeme tvrzením, že objekt je instancí dané třídy ​(termíny objekt a instance jsou synonyma)​.
  • Třída je zvláštní druh objektu, který umí na požádání vytvořit svoji instanci (třída je „forma“ na vytváření svých instancí)​. Třída definuje vlastnosti a schopnosti svých instancí​.

V programu se poté vytvoří několik instancí této třídy. Instance je tedy vytvořena v paměti počítače a vytváří jakýsi obraz reálného objektu (např. účet Josefa Nováka). Instance se vytvářejí pomocí specifické metody, která se nazývá konstruktor. Data, která budeme o každé instanci sledovat, označujeme jako datové atributy instance. Činnosti, které je možné s danými instancemi provádět, označujeme jako metody (metody instance).

45
Q

Komunikace - volání metod, posílání zpráv

A

Komunikace - volání metod, posílání zpráv

Každá aplikace je tvořena několika třídami, v rámci běhu aplikace jsou vytvářeny instance těchto tříd a volány jejich metody. Analogie s mobilním telefonem​:

  • Mohu poslat SMS jen tomu, na koho mám číslo ​
  • Mohu posílat různé zprávy​
  • Reakce různých lidí na stejnou zprávu mohou být různé (př. volání metody kresli pro objekt třídy čtverec = nakreslí se čtverec, volání metody kresli pro objekt třídy kruh = nakreslí se kruh)

Ucet mujUcet; - identifikátor použitý na uložení odkazu musí být typu Ucet

mujUcet = new Ucet (1,”Pepa”); - vytvoření nové instance třídy

Volání metod ze třídy Ucet. (V případě volání metod stejné instance používáme klíčové slovo this.)

mujUcet.vloz(100);

double stavMehoUctu = mujUcet.getStav();

46
Q

Zapouzdření

A

Zapouzdření :

  • V objektu jsou spojeny vlastnosti a schopnosti, které spolu souvisejí.​
  • Kód je pohromadě se zpracovávanými daty
  • Skrývání implementace​ (nikdo nemá mít šanci zjistit, jak je program implementován)​
    • Zvýšení bezpečnosti a robustnosti (nemožnost nekorektního použití)​
    • Usnadnění budoucích modifikací​
  • Objekt (instance) rozhoduje o svém stavu => datové atributy jsou z venku nepřístupné

“Zapouzdření (encapsulation) popisuje princip umisťování dat a souvisejících metod k sobě – do jednoho objektu, do jedné metody, atd. Zapouzdření musí být podporováno vhodnou jazykovou konstrukcí, v Javě i ostatních objektových jazycích se realizuje pomocí tříd a vytváření instancí. “

47
Q

Při zapouzdřování objektů je vhodné dodržovat tato pravidla:

A
48
Q

Problém špatného zapouzdření a jeho následky:

A

Problém špatného zapouzdření a jeho následky:

  • Zanedbání zapouzdření vede ke ztrátě úplnosti informace objektu a ke ztrátě jeho celkové konzistence,
    tj. existují procesy mimo něj, které mění jeho stavy, aniž by o tom „objekt věděl“. Mohou nastat
    situace, kdy je projekt malý (např. prototyp) a tedy pod kontrolou a tento nedostatek nevede k fatálním
    chybám.
  • Zapouzdření (a také ukrývání implementace) je narušeno jinou základní objektovou vlastností, a to
    dědičností. S datovými atributy třídy mohou pracovat i metody z jiné třídy (narušení zapouzdření) a
    programátor, který dědí z nějaké třídy, musí vědět nejen co zděděné metody dělají, ale také jak to
    dělají (narušení skrytí implementace).
  • špatné zapouzdření - jsou vidět vlastnosti, co být vidět nemají. Může vést k nenápadným chybám v kódu.
49
Q

Ukrývání implementace

A

Možnost používat metody objektů bez znalosti jejich implementace se nazývá ukrývání implementace. Každý objekt poskytuje svému okolí metody, které je možné zavolat. Seznam těchto metod (a dostupných datových atributů) je označován jako veřejné rozhraní třídy. V tomto rozhraní by neměly být zahrnuty datové atributy, ty by měly být schovány uvnitř instance a měly by být přístupné pouze pomocí metod. Předpokladem pro ukrývání implementace je, že programovací jazyk podporuje zapouzdření. Oba pojmy spolu úzce souvisí, což někdy vede k jejich nepřesnému používání či vzájemnému zaměňování. Následující modifikátory uvádějí možnost přístupu k datovému atributu nebo metodě:

  • private - znamená to, že je přístupná pouze z metod instance
  • (nic neuvedeno) - pokud neuvedeme žádný modifikátor přístupu, použije se přátelský přístup. Datové atributy a metody jsou v tomto případě přístupné v rámci balíčku.
  • protected - atributy a metody jsou přístupné v rámci balíčku a také z potomků v rámci dědičné hierarchie
  • public - datový atribut nebo metoda jsou přístupné z jakékoliv jiné třídy.

Modifikátory přístupu lze uvést u datových atributů​, u metod​ a u tříd. K datovému atributu deklarovanému s modifikátorem private lze přistupovat pouze pomocí metod.

  • Přečtení datového atributu pomocí metody get​
  • Nastavení hodnoty pomocí metody set
50
Q

Dědičnost

A

Dědičnost

Dědičnost je jednou z forem znovupoužitelnosti – vytvářená třída (potomek) do sebe absorbuje datové atributy a dědí metody z jiné třídy (předek) a dále je rozšiřuje a upravuje. Dědičnost není pouze jednoúrovňová – potomek nějaké třídy může mít dále své potomky. Tito potomci dědí metody od všech tříd na vyšší úrovni. Takto vzniká hierarchie tříd, ve které není omezen počet úrovní.

Dědičnost:

  • Omezuje duplicity v kódu​
  • Nebezpečí špatného použití (narušuje zapouzdření)​
51
Q

Hierarchie dědičnosti:

A

Hierarchie dědičnosti​:

  • třídy v Javě mají stromovou strukturu,​v jejímž kořeni je třída Object​
  • každá třída s výjimkou třídy Object má právě jednoho předka​
  • třída Object je společným (pra)rodičem všech tříd​
52
Q

Deklarace dědičnosti:

A

Deklarace dědičnosti​:

  • klíčové slovo extends​ v hlavičce třídy (public class Liska extends Zvire { …. })
53
Q

Co se vlastně dědí?​ (co znamená dědit)

A

Co se vlastně dědí?​ (co znamená dědit)

  • Když vytvořím instanci potomka, tak mohu používat zděděné metody a atributy předka​
  • Potomek obsahuje všechny prvky (metody, atributy) předka​
54
Q

Co z předka lze používat (volat) v potomkovi?​ (ZALEŽÍ NA MODIFIKÁTORECH PŘÍSTUPU!)

A

Co z předka lze používat (volat) v potomkovi?​ (ZALEŽÍ NA MODIFIKÁTORECH PŘÍSTUPU!)

  • Datové atributy​
  • Metody​
  • Konstruktory​
  • Statické atributy
  • Statické metody

V hlavičce třídy může být modifikátor final – nemůže mít potomky​ (public final class String extends Object) (final může být i u metod, atributů a kontruktorů)

55
Q

Překrytá metoda

A

Překrytá metoda​ - v potomkovi je metoda se stejnou hlavičkou (jméno a parametry), jako v předkovi​ tzn. metoda v potomkovi překryla metodu předka​. Překrývající metoda musí mít stejnou hlavičku​ (název, počet parametrů a jejich typy, typ návratové hodnoty)​ jako metoda překrývaná​, nemá-li metoda stejnou hlavičku,​ nejedná se o překrytí, ale o přetížení​.

56
Q

Dědičnost a konstruktory:

A

Dědičnost a konstruktory​:

  • Konstruktor se nedědí​
  • Při spuštění konstruktoru se jako první automaticky volá konstruktor předka, pokud neurčíme který, volá se konstruktor bez parametru.​
  • Pro určení volaného konstruktoru předka slouží klíčové slovo super​​
57
Q

Java podporuje jednonásobnou dědičnost (tzn. nepodporuje násobnou dědičnost)– každá třída může a musí mít právě jednoho předka. Stromová hierarchie tříd začíná třídou Object (tato jediná třída nemá předka), všechny třídy jsou přímým či nepřímým potomkem této třídy. Dědičnost by se měla používat v situacích, kdy potomek je podtypem svého předka, tj. existuje mezi nimi vztah. Pokud má být nějaká třída B potomkem třídy A, měli bychom si kladně odpovědět na tyto otázky: „B je A?“ či „Je každý B také A?“. Nemůžeme-li na takou otázku odpovědět kladně, neměli bychom používat dědičnost. Jsou vztahy, které lze vyjádřit pomocí „je částí“ („part-of“) a „má“ („has-a“). Pokud jsou mezi třídami tyto vztahy, nepoužívá se dědičnost, ale většinou kompozice. Důležité je též si uvědomit, že dědičnost vyjadřuje vztah tříd, ne vztah instancí.

A

Java podporuje jednonásobnou dědičnost (tzn. nepodporuje násobnou dědičnost)– každá třída může a musí mít právě jednoho předka. Stromová hierarchie tříd začíná třídou Object (tato jediná třída nemá předka), všechny třídy jsou přímým či nepřímým potomkem této třídy. Dědičnost by se měla používat v situacích, kdy potomek je podtypem svého předka, tj. existuje mezi nimi vztah. Pokud má být nějaká třída B potomkem třídy A, měli bychom si kladně odpovědět na tyto otázky: „B je A?“ či „Je každý B také A?“. Nemůžeme-li na takou otázku odpovědět kladně, neměli bychom používat dědičnost. Jsou vztahy, které lze vyjádřit pomocí „je částí“ („part-of“) a „má“ („has-a“). Pokud jsou mezi třídami tyto vztahy, nepoužívá se dědičnost, ale většinou kompozice. Důležité je též si uvědomit, že dědičnost vyjadřuje vztah tříd, ne vztah instancí.

58
Q

Důvody použití dědičnosti

A

Důvody použití dědičnosti

Dědičnost se využívá v různých situacích, za různými účely. V praxi lze důvody pro použití dědičnosti obtížně odlišit.

  1. Specializace
  2. Překrývání metod a polymorfismus
  3. Znovupoužití kódu
59
Q

Důvody použití dědičnosti - specializace

A
  1. Specializace

Jedním z nejčastějších důvodů pro použití dědičnosti je specializace existujících tříd a objektů. Při specializaci získává třída nové datové atributy a chování proti původní třídě.

Příklad: specializace s bankovním účtem a žirovým účtem

60
Q

Důvody použití dědičnosti - překrývání a polymorfismus

A
  1. Překrývání metod a polymorfismus

Častým důvodem k dědičnosti je možnost využití překrývání metod a následně polymorfismu – různí potomci mají rozdílně implementována některá chování (některé metody). Při volání takové metody programátor nemusí uvažovat o tom, které konkrétní instanci posílá zprávu, neboť každá instance má k sobě přiřazen svůj specifický kód.

61
Q

Důvody použití dědičnosti - znovupoužití kódu

A
  1. Znovupoužití kódu

Jednou z prvních motivací pro dědičnost bylo umožnit nové třídě znovu použít kód, který již existoval v jiné třídě. Pokud vede k dědičnosti pouze tento motiv, vznikne hierarchie, kdy věcně nelze přetypovat potomka na předka.

62
Q

Problém dědičnosti:

A

Problém dědičnosti:

  • Dědičnost porušuje zapouzdření a skrývání implementace
    • Nutí potomka, aby znal implementaci v předkovi
    • Občas nutí předka, aby znal možné implementace svých potomků
  • Dědičnost zvyšuje vzájemnou provázanost tříd;
    • potřebuji-li modifikovat rodiče (najdu v něm chybu nebo v reakci na změnu zadání), musím zkontrolovat všechny potomky, že tato změna jejich chování nežádoucím způsobem neovlivnila
  • Předchozí problém je způsoben tím, že potomek je závislý nejenom na rozhraní rodiče, ale i na jeho implementaci
63
Q

Kdy dědičnost nepoužít

A

Kdy dědičnost nepoužít

  • Vždy, když umím najít jiný rozumný způsob realizace potřebné funkčnosti
  • Když potenciální potomek není speciálním případem předka nebo je naopak jeho příliš speciálním případem
64
Q

Polymorfismus

A

Polymorfismus

Pojem pochází z řečtiny a znamená mnohotvarost. V OOP vyjadřuje situaci, kdy při stejném volání provádí různý kód. Která konkrétní metoda se provede, závisí na předávaných parametrech a objektu, kterému je zpráva předána.

Při stejném volání metody se provádí různý kód. Který kód se provede závisí:​

  • na parametrech metod,​
  • na instanci (objektu), kterému je zpráva předávána,
65
Q

přetěžování metod, překrývání metod

A

Přetěžování metod (overloading), též ad-hoc polymorphism (metoda má více než jednu definici ve stejném „scope“ (stejné jméno, různé parametry))

Překrývání metod (overriding), též subtype polymorphism (u potomka je stejná deklarace metody, ale jiná implementace)