Theory Flashcards
Objektovy pristup
Problém se snažíme řešit tak, že ho kompletně strukturujeme do objektů, které mezi sebou komunikují. Objekty intuitivně volíme tak, aby co nejvíce odpovídaly objektům z reálného světa
rozdil abstraktnej triedy a interfaceu
Interface - všechny proměnné jsou automaticky public static final a metody public.
Interface použijeme, jestliže:
1. Vytvářím vnější rozhraní k objektům - vytvářím veřejné API ke své komponentě
2. Chci, aby i objekty z jiné class hierarchie implementovaly stejné rozhraní
3. Předepisuju pouze metody a nikoliv jejich implementaci - mým cílem není, aby třídy sdílely implementaci
4. Chci předepsat třídě, aby implementovala metody z více rozhran
Abstraktní třída - lze definovat také proměnné, které nejsou static a final a metody mohou být public, protected, private
Abstraktní třídu použijeme, jestliže:
1. Chci sdílet kód mezi více třídami a neexistuje “neabstraktní” předek těchto tříd
2. Třídy jsou mezi sebou úzce spjaté - sdílí mezi sebou mnoho proměnných a metod
3. Potřebujeme předepsat i metody, které neslouží k vnější komunikaci s objektem, tedy private a protected.
4. Chci předefinovat proměnné, které nejsou static a final.
asociace
Asociace - objekty mají zcela nezávislý životní cyklus,
realizována jako proměnná držící referenci na instanci
nebo proměnná na vstupu metody, jakákoliv
multiplicita.
Agregace
Agregace objekty mají zcela nezávislý životní cyklus,
vlastněný objekt nemůže mít dalšího vlastníka,
realizována jako proměnná držící referenci na instanci.
Nemůže vytvářet cykly, multiplicita 1:1 nebo 0:N.
Kompozice
Kompozice - objekty mají svázaný životní cyklus, jeden
objekt vlastní druhý a s jeho zánikem i ten druhý
zaniká, realizována jako proměnná držící referenci na
instanci nebo zanořená (inner) třída. Nemůže vytvářet
cykly, multiplicita 1:1 nebo 0:N.
message pasing
zv. message passing je předávání zpráv mezi dvěma objekty. Příkladem je komunikace mezi
objekty v Smalltalk.
Synchronní komunikace mezi objekty se děje jednoduše přes provolání metody druhého objektu, thread je blokován
● Asynchronní posílání zpráv si musíte doprogramovat nebo využít nějakou existující
Class diagram
Class diagram je UML diagram pro
grafické zobrazení tříd, jejich vlastností
a vztahů mezi nimi
Je lepsi kompozice nebo dedicnost?
Dědičnost má výhodu v tom, že zavádí pravidla a minimalizuje duplicity v kódu
Dědičnost je extrémně silná vazba.
Strukturální zásahy do hierarchie tříd ve chvíli jsou extrémně pracné
Tam, kde vím, že budu v budoucnosti potřebovat flexibilitu, tak radši volím kompozici
Kompozice má nevýhodu, že někdy končí duplicitami v kódu a je mnohem více
benevolentnější
mutabilita
typy exituji mutable a imutable: Mutable typy lze změnit, to znamená, že poskytují operace, které při spuštění
způsobují, že výsledky dalších operací na stejném objektu dávají různé výsledky a naopak
Mutable (měnitelné) objekty jsou takové, které obsahují metody, které modifikují hodnotu objektu.
tring je immutable, tedy např. při přidání znaků na konec se vždy vytváří nový String.
immutable typy jsou méně náchylné pro vznik bugů
kód s immutable typy je jednodušší na pochopení
kód s immutable typy i vlastní immutable typ je jednodušší na upravování
Mutable objekty zesložiťují kontrakt (rozhraní) a zhoršují reuse
co je pure function?
No side effects (bez vedlejších efektů): Funkce či operace nesmí měnit vnější stav (jiné než
vlastní lokální proměnné) - funkce pouze vrací hodnotu funkci, která ji volá
idempotence
Idempotence
funkce vrací hodnoty, které jsou závislé pouze na argumentech předaných při
volání => nezávisí tedy na ničem jiném. Pokud funkci zavoláte vícekrát s těmi samými
parametry, tak bude vždy vracet to samé
zásady FUP
Immutable
■ No implicit state (bez implicitního stavu): nesmí mít skrytý či implicitní stav. Stav musí být explicitní
a transparentní (viditelný):
■ Pure functions:
lambda expression
Lambda expression je forma ve tvaru: (seznam argumentů funkce) -> tělo funkce
Používají především k definování implementace funkčního rozhraní s jedinou metodou tzv. inline
formou což vede k výrazné redukci kódu
Objekt první třídy
Objektem první třídy je entita, která podporuje následující operace: být
předána jako parametr, přiřazená proměnné a být vrácená z funkce.
Funkce vyššího řádu
Funkce vyššího řádu je funkce, které splňuje přinejmenším jednu z vlastností:
● Jedním či více parametry je funkce
● Vrací funkci jako parametr
Closure
Closure je funkce, která si při
deklaraci vytvoří lokální
proměnnou, kterou si vezme
z kontextu ve kterém je
vytvořena
currying
Currying spočívá ve vyhodnocování argumentů funkce per partes, kdy po každém kroku získáme funkci, která
má o jeden argument méně.
Referential transparency
Vychází z idempotentnosti pure funkcí. Hezkým důsledkem toho je, že můžeme volání funkce nahradit
hodnotou, kterou funkce vrátila naposledy. Tzv. memoizace nebo caching funkčního volání, abychom
nemuseli provádět vícekrát tu samou funkci
Lazy evaluace
Process kdy zpozdím vyhodnocení výrazu až do doby než potřebuju výsledek.
Srovnání objektového a funkcionálního programování
https://pasteboard.co/kxkQ2FwR8CYq.png