Architektura aplikace má 2 významy:
- logická
- zahrnuje organizaci softwarových tříd do balíčků a jmenných prostorů (aby si stejné názvy nepřekážely + přehlednost)
- uspořádání balíčků do vrstev (prezentační, business, datová…) a podsystémů
- Rozdělení architektur aplikací podle vrstev
- MVC a MVP architektura
- fyzická
Samotné programování a vývoj aplikace je menší část nákladů → návrh architektury je velmi zásadní, pokud je dobrý, pak už se to programuje samo ;)
Chci zajistit hlavně:
- srozumitelnost - rychlá lokalizace chyb, moji práci může rychle převzít někdo jiný, rychlejší spolupráce v týmu
- rozšiřitelnost - změny nesmí ovlivnit nesouvisející část systému
- udržitelnost aplikace
Hlavní pozornost věnuju místům, kde bude systém v budoucnu rozšiřován - tato místa je potřeba od zbytku aplikace oddělit nějakým zapouzdřením/rozhraním, aby byla snadno rozšiřitelná a zároveň rozšíření neovlivnilo zbytek aplikace.
Diagram balíčků
- definuji jím jak na sobě různé balíčky tříd souvisejí a závisí
- zde ta horní relace je: A je závislý na B
- dolní relace je: C je uvnitř B (vnoření)
- obecně se chci snažit nemít cykly v diagramu balíčků
- pokud se tak stane, tak můžu 1) přesunou problémovou třídu, 2) vyčlenit třídy do nového balíčku a 3) vytvořit rozhraní (dependency inversion)
Návrhový model tříd
-
dokumentuje provedená architektonická rozhodnutí
-
zachycuje různé zodpovědnosti různých tříd
-
dokumentuje použité vzory a principy
-
pokud je napsaný dobře, tak je možné z něho rovnou generovat zdrojový kód
-
může vycházet z doménového modelu, jen se zpřesní atributy a metody (přidají se např. datové typy, výstupní typy metod, viditelnosti) a upřesní se relace (jejich směr, názvy konců asociací) a vytvoří se nové softwarové třídy (tedy ty, které nezastupují žádnou reálnou věc, ale jsou potřeba pro správný objektový návrh)
-
doporučení (hlavně pro přehlednost a přínos)
- nezobrazovat gettery/settery
- není potřeba zachycovat všechny softwarové třídy
- důležité je popsat principy a pravidla, která mají být během implementace dodržována
-
vysvětlení značení:
Rozdělení architektur aplikací
- monolitická aplikace
- dvouvrstvá
- třívrstvá
- vícevrstvá
Monolitická aplikace
- pro aplikace, které nemají ambici být dlouho v provozu (např. mají jeden účel a po splnění končí)
- pro prototypy, mají rychlý počáteční vývoj, ale velmi špatně se udržují a rozšiřují
- velmi dobře se testují
- problém se škálování → je nutné je mít jako celek
Dvouvrstvá aplikace
- naprostý základ, dělení na prezentační a datovou (= zbytek aplikace) vrstvu
- CRUD aplikace
- thin-client / smart-server
- tradiční aplikace
- logika je na serveru
- thick-client / dumb-server
- moderní přístup
- server = API
- aplikace běží na straně klienta
- záleží, jestli je většina logiky na straně klienta nebo serveru
- je to v cyklech - co se používá teďko (teďko se to vrací z logiky na FE zpátky na BE)
Třívrstvá aplikace
- větší (enterprise) aplikace
- vrstvy:
- prezentační - HTML stránky, zpracování požadavků od uživatele, routování, formátování, GUI, API
- business (aplikační) - logika, procesy a validace, měla by být nezávislá na prezentační a datové vrstvě
- datová - persistence dat
- striktní - závislost mezi vrstvami jde vždy směrem dolů a pouze o 1 úroveň
- relaxovaná - závislost je také směrem dolů, ale přes lib. počet úrovní
- nejvíce používaná
- nenutí mě všechno rvát přes business (když chci zobrazit raw data z databáze, tak si pro ně mohu sáhnout hned)
- ve striktní bych musel používat wrappery v business třídě (což je někdy zbytečnost navíc)
- ve striktní bych musel používat wrappery v business třídě (což je někdy zbytečnost navíc)
- výhody třívrstvé architektury:
- oddělení business logiky od prezentační (narozdíl od dvouvrstvé)
- snadná výměna vrstev
- jednoduché testování
- možnost mít více prezentačních vrstev
- znovupoužitelnost (logování, emaily, persistence apod.)
Point-to-point architektura
- špagetové propojení
- mash-up aplikace, jsou těžko udržitelné
Enterprise service bus
- centrální moderátor, který zajišťuje
- vyhledávání služeb
- zasílání zpráv mezi službami
- kontroly stavů
- mediace Mediator
- zabezpečení
Microservices (https://microservices.io/)
- malé služby, které mají jen jeden účel - umí fungovat samostatně a izolovaně
- může každá běžet na vlastním serveru
- spojuji je do sebe a můžu pro to vytvořit FE
- dekompozice služeb
- výborná škálovatelnost
- jedna funkcionalita = 1 služba
- dobrý na to je např. Python
Hexagonální architektura
- na levé straně je komunikace s vnějším světem (REST, SOAP, GraphQL atd.)
- z pravé straně jsou interní systémy (databáze, repozitáře atd.)
- funguje na principu několika malých hexagonů, které jsou do sebe propojené
- je to způsob používání Microservices
- dá se říct, že je to propojení několika menších monolitů
- v principu je hexagonální architektura monolit
- pak je tam ta škálovatelnost náročnější, ale můžu mít více takových monolitů vedle sebe a nějaký může být fakt jako microservice, kterou mohu rozšiřovat
- a tyhle monolity pak můžu kombinovat k sobě
- v principu je hexagonální architektura monolit
- v hexagonu můžu mít více malých hexagonů