řvss
, java
, oop
, pa165
Podnikové aplikace. Základní koncepty softwarových architektur. Vrstvená architektura moderních informačních systémů, model-view-controller. Architektura orientovaná na služby (SOA). Nasazení. Základní koncepty cloud computingu. Objektově-relační mapování (ORM) v podnikových aplikacích. Návrhové vzory v rozsáhlých podnikových systémech (Data Transfer Object (DTO), Data Access Object (DAO), Facade, Dependency Injection (DI)). (PA165)
Príklad
Vysvetlenie
Problém
Riešenie
:bulb: Voľná "definícia"
:book: Zdroj, ďalšie čítanie
:bulb: Podniková aplikácia je rozsiahla softvérová platforma, ktorá bola navrhnutá pre použitie vo firemnom prostredí (súkromná firma, štátny podnik a pod.). Podnikové aplikácie sú komplexné, škálovateľné, distribuované a založené na komponentoch.
Podnikové aplikácie
Podnikový softvér je súhrnný výraz pre všetky aplikácie, ktoré slúžia pre podporu fungovania organizácie/podniku.
Príklady typov podnikových aplikácií:
- systémy pre spracovanie platieb
- mzdové účtovníctvo
- systémy pre správu obsahu (CMS)
- riadenie ľudských zdrojov (HRM)
- riadenie vzťahov so zákazníkmi (CRM)
- dochádzkový softvér
- systémy pre messaging a spoluprácu (e-mail, VOiP, videomeetingy)
- softvér pre riadenie rizík (Risk Management Software)
- softvér pre riadenie projektov (Project Management Software)
:book: Viac príkladov napr. »tu«
:bulb: Softvérová architektúra je základná štruktúra softvérového systému, ktorá sa po implementácii len veľmi ťažko mení. (jedna z možných "definícií")
"… the decisions you wish you could get right early in a project."
Ralph Johnson
Príklady softvérových architektúr
- vrstvená (viď »ďalšia sekcia«)
- model-view-controller (viď »sekcia o MVC«)
- architektúra orientovaná na služby (viď »sekcia o SOA«)
- monolitická architektúra
- klient-server (2-vrstvá, 3-vrstvá, …)
- peer-to-peer (P2P)
- udalosťmi riadená architektúra
- architektúra mikrokernelu
- architektúra mikroslužieb
:ok_hand: Výhody
Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure.
Conway's law
:no_entry_sign: Nevýhody
:ok_hand: Výhoda – separation of concerns: oddelenie backendu a frontendu jednoduchšie úpravy v aplikácii.
:bulb: SOA (servisne-orientovaná architektúra) je návrhová filozofia; kolekcia služieb, ktoré medzi sebou komunikujú a pre komunikáciu využívajú štandardizované protokoly a dohodnuté rozhrania. Vďaka týmto rozhraniam sa môže meniť implementácia služieb bez toho, aby bola ovplyvnená schopnosť systému služby využívať.
SOA is an architectural style, realized as a collection of collaborating agents, each called a service, whose goal is to manage complexity and achieve architectural resilience and robustness through ideas such as loose coupling, location transparency, and protocol independence.
IBM
Služba je entita, ktorá má popis a ktorá je dostupná cez rozhranie, ktoré umožňuje klientovi službu využívať. Služba v kontexte SOA je sprístupnená časť funkcionality s nasledujúcimi vlastnosťami:
- Kontrakt rozhrania ku službe je nezávislý na platforme.
- Služba môže byť dynamicky vyhľadaná a použitá.
- Služba je sebestačná; udržiava si svoj vlastný stav.
PA165
Každý IT prostriedok, systém, aplikácia môže vystupovať ako služba.
Príklad SOA: niektoré služby v e-shope[1]
- katalóg produktov
- platobná brána
- spracovanie objednávky
- doprava
Rozdiel medzi SOA a Web Services
SOA je spôsob navrhovania systémov, zatiaľ čo Web services je implementačná technológia, ktorá používa špecifické štandardy a protokoly k dosiahnutiu riešenia založeného na princípoch SOA.
:book: FI Wiki: SOA
:bulb: Pod pojmom nasadenie sa myslia všetky kroky, procesy a aktivity, ktoré sprístupnia systém alebo jeho novú verziu zamýšľaným používateľom. V súčasnosti vývojári nasadzujú aplikácie a ich aktualizácie pomocou kombinácie manuálnych a automatizovaných procesov.
Odlišujeme dve hlavné prostredia:
:bulb: Softvérové vydanie (software release) je konkrétna verzia kódu a jeho závislostí, ktorá je sprístupnená na nasadenie.
:bulb: DevOps je metodológia a sada best practices, ktorá kombinuje vývoj softvéru (Dev) a jeho prevádzkovanie (IT operations – Ops). Jej hlavným cieľom je skrátiť vývojový cyklus pri zachovaní vysokej kvality softvéru.
:bulb: Súčasťou DevOps býva Continuous Integration (CI) framework, podľa ktorého sú zmeny pravidelne integrované do zdieľaného repozitára, pokojne aj niekoľkokrát denne. Tento kód je automaticky testovaný za účelom skorého nájdenia (a odstránenia) chýb.
:bulb: Continuous Deployment (CD) popisuje stratégiu nasadzovania softvéru, podľa ktorej nový kód musí prejsť sadou automatizovaných testov než bude (automaticky) uvoľnený do produkčného prostredia. Nutnou podmienkou sú kvalitné testy.
:book: Wikipedia: DevOps
Cloud computing je v podstate distribuovaná výpočetná platforma, ktorá poskytuje svoje prostriedky širokému spektru používateľov na škálovanie, virtualizáciu hardvérovej a/alebo softvérovej infraštruktúry cez internet.
Techpedia
Cloud computing je model navrhnutý pre umožnenie pohodlného prístupu ku zdieľaným konfigurovateľným výpočetným zdrojom (sieťam, serverom, úložiskám, aplikáciám, službám), ktoré môžu byť okamžite poskytuné s minimálnou správou alebo potrebou zásahu poskytovateľa tejto služby.
NIST
:ok_hand: Výhody
:no_entry_sign: Nevýhody
5
3
Zákazník používa poskytovateľove hotové aplikácie (bežiace na cloude), ktoré sú dostupné z rôznych klientských zariadení pomocou tenkého klienta (napr. prehliadač) alebo tučného klienta (špecifická aplikácia).
Zákazník nespravuje a ani neriadi cloudovú infraštruktúru bežiacu na pozadí.
Príklady: GMail, Google Docs, Dropbox, MS Office 365
Zákazník môže využiť poskytovateľovu platformu pre nasadenie (poskytovateľom podporovaných) vlastných alebo získaných aplikácií.
Zákazník nespravuje a ani neriadi cloudovú infraštruktúru bežiacu na pozadí (sieťové pripojenia, servery, operačné systémy, úložisko), ale má kontrolu nad nasadenými aplikáciami a (možno) aj nad konfiguráciou prostredia, ktoré hostuje tieto aplikácie.
Príklady: Google App Engine, Heroku
Poskytovateľ poskytuje zákazníkovi výpočetný výkon, úložisko, sieťové pripojenia a ďalšie základné výpočetné zdroje.
Zákazník nespravuje a ani neriadi cloudovú infraštruktúru bežiacu na pozadí, zato však má kontrolu nad operačnými systémami, úložiskom a nasadenými aplikáciami a (možno) obmedzenú kontrolu nad niektorými sieťovými komponentami (napr. firewall).
Prakticky sa jedná o podobnú situáciu ako v prípade vlastného hardvéru, avšak nie je potrebné daný hardvér vlastniť, udržiavať a dokupovať/predávať zdroje pri škálovaní.
Príklad: Google Computing Engine, DigitalOcean, Amazon Web Services (AWS), Microsoft Azure
4
:dart: Chceme používať relačnú databázu v OOP aplikácii.
:warning: Problém: problematická kompatibilita medzi OOP prístupom a relačným prístupom.
Základné nezhody intuitívne (viac v ďalšej sekcii):
- Dátové typy v OOP: objekty, zoznamy, množiny, mapy, … (často nie len skalárne hodnoty)
- Dátové typy v DB: skalárne hodnoty (
number
,varchar
, …); vzťahy medzi záznamami pomocou foreign keys a ďalších tabuliekKlasický RDBMS takéto štruktúrované dáta nevie jednoducho spravovať, programátor by musel naimplementovať delenie údajov do tabuliek, obojsmernú konverziu typov všetkých použitých tried a tiež opätovné vytvorenie objektu pomocou skladania údajov z viacerých tabuliek.
Riešenie: ORM knižnica
Príklad:
JBoss Hibernate
(Java)
Nezhody medzi objektami a reláciami (tzv. object-relational impedance mismatch)[2]
- Rozdielna granularita
- Môže sa stať, že objektový model má napr. viac tried ako je počet odpovedajúcich tabuliek v databázi (napr. reprezentácia adresy).
- Dedičnosť
- V (štandardných) relačných databázach tento koncept neexistuje.
- Identita
- V relačných databázach sa rovnosť záznamov určuje podľa primárneho kľúča, zatiaľ čo napr. v Jave existuje identita objektov (
a == b
) a rovnosť objektov (a.equals(b)
).- Vzťahy medzi entitami
- V OOP sú vzťahy reprezentované jednosmernými odkazmi na objekty (rovnako v zoznamoch, mapách a pod.), zatiaľ čo v RDBMS sa používajú cudzie kľúče (foreign keys). Ak sú potrebné obojsmerné asociácie, napr. v Jave treba vytvoriť ďalšiu asociáciu pre druhý smer.
- Prístup k objektom
- V OOP sa k objektom pristupuje cez odkazy z iných objektov (prechádzanie grafu). V relačnej databáze je tento prístup neefektívny; typicky chceme minimalizovať počet SQL dotazov, tj. použiť joiny a obmedziť výber na požadované entity než s nimi začneme pracovať.
:bulb: ORM je programovacia technika, ktorá zaisťuje automatickú konverziu dát medzi nekompatibilnými typovými systémami, konkrétne medzi relačnou databázou a objektovo orientovaným programovacím jazykom.
Ide o preklad reprezentácie objektov do a z formátu, ktorý sa dá uchovávať v databázi tak, aby zostali zachované vlastnosti a vzťahy objektov. Ak je táto funkcionalita (uloženie a získanie) implementovaná, hovoríme o objektoch, že sú perzistentné.
Jednoduchý príklad: adresár :notebook_with_decorative_cover: – každá osoba je jeden objekt.
Objekt v Jave:
Model relačnej databázy (zjednodušený model, ktorý neumožňuje mať jedno tel. číslo/adresu pre viacero osôb, neukladá efektívne adresu a pod.):
Alternatívne riešenia:
Návrhový vzor (v softvérovom inžinierstve) je všeobecné znovupoužiteľné riešenie často sa vyskytujúceho návrhového problému. Nejedná sa o hotový návrh, ktorý sa dá preklopiť do zdrojového kódu; ide o popis alebo predlohu riešenia. Návrhové vzory predstavujú formalizované best practices, ktoré programátor môže použiť pri riešení bežných problémov pri návrhu softvéru.
Wikipédia
Príklady návrhových vzorov: factory, adapter, iterator, builder, decorator, singleton, visitor, …
Povedzme, že máme triedu Client
, ktorá pre svoju činnosť potrebuje funkcionalitu triedy ServiceImpl
.
Takto previazané triedy sú tightly coupled. Ak by trebalo upraviť triedu ServiceImpl
, bolo by nutné upraviť aj triedu Client
, čo nie je ideálne.
:dart: Chceme dosiahnuť loose coupling[3] medzi triedami/komponentami, tj. ich čo najväčšiu nezávislosť či nepreviazanosť.
:bulb: Dependency inversion principle (DIP) odporúča používať abstraktné závislosti (rozhrania) namiesto konkrétnych (špecifických implementácií)[4].
:bulb: Inversion of control principle (IoC) presúva zodpovednosť za vytvorenie a previazanie objektov z aplikácie na framework.
- IoC sa používa na zvýšenie modularity a rozšíriteľnosti programu.
- Príklad IoC frameworku:
Spring
(Java),Spring.NET
(C#)
:bulb: Dependency injection (DI) je spôsob, ako IoC naimplementovať.
Podľa DIP, IoC a rôznych druhov DI[5] by trieda Client
vyzerala nasledovne (@Inject
je v Jave direktíva pre IoC framework):
:bulb: Návrhový vzor, ktorý oddeľuje low-level špecifiká prístupu k dátam (napr. využitia relačnej databázy) od high-level metód (logiky aplikácie).
:ok_hand: Výhoda – princíp oddelenia zodpovednosti (separation of concerns principle): program je rozdelený na časti, ktorých funkcionalita (zodpovenosti) sa neprekrývajú.
:no_entry_sign: Nevýhoda – opakujúci sa kód (boilerplate code) pre každú entitu, možno vyriešiť dedením všeobecnej implementácie.
:no_entry_sign: Nevýhoda – aplikácia môže vďaka využívaniu metód poskytovaných cez DAO pristupovať k dátam neefektívne (viď napr. problém n+1).
Problém "n+1"
Majme entitu
článok
a k nej entitukomentár
vo vzťahu many-to-one (článok môže mať viacero komentárov; komentár patrí k práve jednému článku).
Povedzme, že v aplikácii najprv získame zoznam všetkých komentárov (jeden dotaz). Potom pre každý komentár cezfor
cyklus dohľadáme napr. názov odpovedajúceho článku. ( dotazov). Takto použijeme (veľmi neefektívne) dotazov na operáciu, pre ktorú by stačil jeden dotaz obsahujúci join medzi entitami.
:bulb: Fasáda je štruktúrový návrhový vzor, ktorý poskytuje zjednodušené rozhranie pre knižnicu, framework, alebo inú komplikovanú sadu tried.
The facade lets the clients interact with the madness!
YouTube comment section
Klienti (resp. iné systémy/podsystémy) by mali s daným podsystémom komunikovať výhradne cez jeho fasádu (ak im zjednodušené rozhranie postačuje). Prípadné zmeny v implementácii systému sa takto klientov nemusia vôbec dotknúť.
Príklad zo života: pri telefonických objednávkach predstavuje operátor fasádu a sprístupňuje tak možnosti obchodu.
Príklad[7] DTO v Jave (equals()
a hashCode()
sú pre krátkosť vynechané):
Zjednodušený príklad použitia DTO v klient-server aplikácii: server získa údaje z databázy, naplní nimi vhodný DTO a pošle ho klientovi.
Serializácia je konverzia objektu do formátu, ktorý sa dá uložiť (do súboru, bufferu, …) alebo preniesť (napr. cez sieť), tak, aby ho bolo možné neskôr znovu vytvoriť so zachovaním pôvodného stavu objektu. Opačná operácia sa nazýva deserializácia. Serializovať sa dá napr. do JSONu, prípadne do XML alebo ľubovoľného vlastného formátu (najčastejšie string, prípadne iný byte stream).
Podobnú operáciu popisuje pojem marshalling. Rozdiel medzi serializáciou a marshallingom podľa Javy:
To "marshal" an object means to record its state and codebase(s)[8] in such a way that when the marshalled object is "unmarshalled", a copy of the original object is obtained, possibly by automatically loading the class definitions of the object. You can marshal any object that is serializable or remote. Marshalling is like serialization, except marshalling also records codebases. Marshalling is different from serialization in that marshalling treats remote objects specially. A […] serializable object stored as a (marshalled object) represents the object itself, while […] a remote object stored as a (marshalled object) represents a "pointer" to the object.
RFC 2713
"Coupling refers to the degree of direct knowledge that one component has of another."
↩︎"In computing and systems design a loosely coupled system is one in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components."
"Depend upon abstractions, [not] concretions." ↩︎
Okrem uvedených existuje ešte tzv. interface injection. ↩︎
Create Read Update Delete ↩︎
Prevzaté a upravené zo vzorového projektu PA165 ↩︎
Pod pojmom codebase sa v kontexte RFC 2713 myslí miesto (URL), na ktorom je uložená definícia danej triedy. ↩︎