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
Abstraktný dátový typ (ADT)
ADT je matematický model pro datový typ
definovaný množinou hodnot a operací nad těmito hodnotami, které splňují definované axiomy. Ekvivalentní k
algebraické struktuře v abstraktní algebře.
ADT - typy a operace
Creators - vytvářejí nové objekty daného typu. Creator může vzít objekt jako argument, nikoli však objekt
stejného typu jako ten, kterého vytváří.
Producers - vytvářejí nové objekty ze starých objektů daného typu. Operace concat v třídě String je
příklad produceru: vezme dva stringy a vytvoří z nich nový reprezentující jejich spojení
Observers - berou objekty abstraktního typu a vracejí objekty jiného typu. Operace size v třídě List je
příkladem observeru, jelikož vrací int .
Mutators - mění objekty. Metoda add třídy List , je příkladem mutátoru, protože mění list tím, že na jeho
konec přidává element.
ADT - typy a operace / príklady
int je primitivní datový typ. int je immutable, nemá tedy žádné mutators.
creators: čísla 0 , 1 , 2 , …
producers: arithmetické operátory + , - , * , /
observers: porovnávací operátory == , != , < , >
mutators: nemá
List je typ pro reprezentaci listu. List je mutable. List je také interface, což znamená, že ho implementují ostatní
třídy, např. ArrayList a LinkedList .
creators: ArrayList a LinkedList konstruktory, Collections.singletonList
producers: Collections.unmodifiableList
observers: size , get
mutators: add , remove , addAll , Collections.sort
String je typ pro reprezentaci řetězce. String je immutable.
creators: String konstruktory
producers: concat , substring , toUpperCase
observers: length , charAt
mutators: nemá
návrh ADT
minimální množinu jednoduchých operací, které lze dobře kombinovat,
přesně vymezený účel fungující bez výjimek ve 100 % případů
testem pro ověřením, že typ poskytuje dostatečné metody, je zkusit postupně získat všechnyvlastnosti typu
testem pro ověření, že typ neposkytuje nadbytek operací, je zkusit postupně metody odebírat
Neměl by kombinovat generické a doménově specifické vlastnosti