Návrhové vzory architektur
- většinu problémů již někdo před námi řešil
- opravodvé problémy až při běhu aplikace
- ustálilo se několik osvědčených návrhových vzorů
- usnadní a urychlí návrh (ověřené, všichni to znají)
- aplikace možná na celý systém či jen částečně
Vrstvená architektura
- horizontální na sobě ležící vrstvy
- na vrstvách pod je závislá
- na vrstvách nad je nezásvislá
- uzavřené vrstvy - implementace pouze pomocí nejbližší vrstvy, jako TCP/IP, kratší závislost
- otevřené vrstvy - implementace pomocí kterékoliv nižší, horší údržba, nižšší režie ⇒ vyšší výkon
- specifikace problému obvykle definuje jen nejvyšší vrstvu
- nejnižší je logicky nejblíže HW/OS/knihovnám
- výhody
- striktní rozdělení odpovědnosti
- snadná testovatelnost
- znovupoužitelnost
- bezpečnost (přidání mezivrstev)
- nevýhody
- nutné hlídat a dodržovat nezávislost
- složitost komunikace
- nižší výkon
Client-server
- vysokoúrovňová 2 vsrtvá architektura
- jsou úzce spjaté, komunikace je oboustranná
- klient - UI a UX, server - celá logika
- server musí vždy validovat získaná data od klienta
Event driven system
- události … info o změně stavu
- může zajímat jiné části systému
- distribuovaný a asynchronní
- řídí dispečer a spouští callback
- publish-subsribe (vysílá se broadcast)
- např. GUI, sledování změn v DB, …
- hodně možností jak události zpracovat
MVC - model view controller
- rozšířené pro GUI a webové appky
- striktní rozdělení odpovědností do 3 částí
MVP - model view presenter
- rozšíření MVC, zakazuje komunikace model-view
- každý view má vlastní presenter
MVVM - model view viewmodel
- viewmodel stojí mezi view a model
- view dostává notifikace od viewmodelu a na ty reaguje
SOA - service oriented architecture
- rozdělení na mírně nezávislé spolupracující služby
- služba zapouzdží funcionalitu a poskytne rozhraní
- bývají fyzicky odděleny
- např. webové služby, síťové služby
- bezstavovost
- klasicky výhody i nevýhody
Monolitická architektura
- SW je ucelený a pevně svázaný
- nízká režie ⇒ vyšší výkon
- vhodné pro malé projekty
- nedá se moc škálovat
- težká udržitelnost (technologie atd.)
Architektura mikroslužeb
- microservices
- velmi malé autonomní služby
- nezávislé (verze, technologie, umístění)
- fungují jako black boxy
- pro velké projekty (dobrá škálovatelnost)
- často komunikují pomocí HTTP
- trend dnešní doby
Vytvářecí vzory
-
většinově OOP
-
vychází z reálného pohledu na svět
-
dessign patter (návrhový vzor) … způsob řešení opakujícího se problému v OOP
- nejde o konkrétní kód, ale popis struktury
- jejich znalost urychlí návrh OOP programů
-
různá “velikost vzorů” (celé problémy i malé komponenty)
-
definován pomocí
- název - zapamatovatelné ,krátké, usnadní přemýšlení, ustáleno praxí, vice ekvivalentních
- popis problému - vysvětlí problém a kontext
- popis řešení - vzor řešení (detailní a ucelené)
- možné důsledky - kompromisy při použití
-
jsou mezi třídami a vzroy architektur
-
dělení podle abstrakce - třídní a objektové
-
podle účelu - vytvářecí, strukturální a vzory chování
-
konkurentní vzory (paralelizační problémy)
-
řeší vytváření nových instancí
-
skrývají konkrétnost třídy, jak jsou třídy vytvářeny
-
v compiletime nemusíme vědět jaké třídy konkrétně dostaneme
Abstract factory
- využívá se hodně
- vytváří instance vzájemně souvisejících tříd, ale nemusíme specifikovat konkrétní třídy těchto objektů
- jsme pak schopni s více těmito třídami komunikovat skrz jedno rozhraní
Builder
- tolik se nepoužívá
- odděluje konstrukci objektů od jejich prezentace
Factory method
- vysoké použití
- rozhraní pro tvorbu objektů, jehož potomci rozhodnou jaká přesná instance se vytvoří
- použití při tom, když třída neví jaké třídy objektů má vytvářet
- má několik součástí
- product
- concrete product
- creator
- concrete factory
- příklad intel procesory
Prototype
- střední
- specifická instance třídy
- nový objekt se vytvoří klonováním prototypu (když je vytvoření nového objektu nákladné)
Singleton
- hodně se používá
- třída pouze s jedinou instancí (globálně dostupná)
- chceme, aby danou funkcionalitu měla pod kontrolou jen 1 instance
- např. logger, přístup do DB, plánovač v OS
- konkrétní implementaci je nejlepší nechat přímo na třídě (globální proměnná není moc dobrá)
- specifikum je
private konstruktor
Strukturální vzory
- jak jsou třídy a objekty složeny do sebe
- využívají dědičnost
Adapter (Wrapper)
- vyšší použití
- konvertuje rozhraní navzájem nekompatabilních tříd
- příklad celkem triviální
- součásti
- target - definice rozhraní v dané doméně
- client - volá nekompatabilní rozhraní
- adaptee - nekompatabilní rozhraní
- adapter - překladač
- důsledky - kolik práce dělá? volá jen metody nebo i další práce?
Bridge
- střední použití
- odděluje rozhraní a implemetaci objektu, aby mohly být vyvíjeny nezávisle
Composite
- vyšší použití
- uspořádá objekty do stromové struktury, s kterou se pak dá pracovat jako s jediným objektem
- např. grafické scény, souborové systémy
Decorator
- střední použití
- dynamicky rozšiřuje funkcionalitu objektu
- známe především z Pythonu
Facade
- vysoké použití
- třída vytvářející rozhraní pro celý subsystém (rozhraní vyšší úrovně)
- taková rozhraní pro rozhraní
- proč?: potřebujeme komunikovat se všemi třídami v subsystému
- důsledky - odstínění komponent subsystému ⇒ menší závislost
Flyweight
- nízké použití
- efektivní správa více objektů s podobnou strukturou
- sdílení dat ⇒ nižší spotřeba paměti
Proxy
- vyšší použití
- objekt zajišťující přístup k jinému objektu (deleguje/zastupuje to)
- např. lazy loading, ochrana přístupu
Vzory chování
- rozdělují zodpovědnost
- řeší komunikaci mezi objekty
- tzv. control flow (těžké sledovat za běhu)
- třídní a objektové vzory
Chain of responsibility
- nízké použití
- předání požadavku do řetězce objektů dokud ho některý nezpracuje
Interpreter
- nízké použití
- interpretace vět jednoduchého jazyka
Mediator
- nižší použití
- komunikace mezi 2 objekty pomocí prostředníka
Observer (pozorovatel)
- objektový
- 1:N - při změně stavu 1 objektu informuje ostatní objekty
- proč? systém se musí udržovat v konzistentním stavu
- tabulka s daty → změna dat → nutné změnit zobrazení, o kterém data ale neví
- subject - zná pozorovatele, rozhraní pro přihlášení a odhlášení odběru změn
- observer - definuje rozhraní pro informování o změně
- concreteSubject - uložení sledovaného stavu, inforamuje o změně
- concreteObserver - zná pozorovaný objekt (a udržuje si jeho stav), reaguje na změny
- funguje jako broadcast
- nevýhoda: pozorovatelé se neznají → kaskáda změn
Iterator (cursor, enumerator)
- objektový
- poskytuje sekvenční procházení datové struktury
- vše pak můžeme procházet stejným způsobem a nemusíme řešit zda jde o strom, list nebo tečkové páry
- concreteIterator - implementace rozhraní, udržuje aktuální pozici
- aggregate - rozhraní pro vytvoření objektu Iterator
- concreteAggregate - konkrétní datová struktura, umožňuje sekvenční průchod
Strategy
- zapouzdří algoritmy a umožní uživateli libovolně rozhodovat, který vybere (jsou vzájemně zaměnitelné)
Command
- zapouzdří operaci, aby šla později zavolat a zároveň si pamatoval režijní informace
- odděluje zadání požadavku a jeho vykonání
Visitor
- definování nové operace třídě bez její úpravy
Memento
- řeší uchování vnitřního stavu objektu, tak abychom se do něj mohli později například vrátit
- neporušuje zapouzdření
- např. pro operaci
undo