# 4 Objektové metody návrhu systémů ###### tags: `řvss`, `informační-systémy`, `oop` ## Návrhové vzory Návrhový vzor je obecné a znovupoužiteľné riešenie pri návrhu softvéru. - popis alebo šablóna riešenia problému, ktorý môže byť riešený v rôznych situáciach - uľahčuje znovupoužiteľnosť architektúr a návrhov SW - zachytávajú, statickú a dynamickú štruktúru a spoluprácu medzi účastníkmi SW - nie sú finálny návrh slúžia len ako model, ktorý je treba prispôsobiť pre danú situáciu - priekopníci Gang of Four(GoF) #### Problémy návrhových vzorov - neplatí, že čím viac vzorov tým lepšie - máme tendenciu stále používať posledný naučený vzor - môžme použiť nesprávny vzor pre riešenie daného problému - vysoké náklady pri redizajne SW pre použitie návrhové vzoru - vzory majú častokrát podobnú vizuálnu štruktúru, preto je potrebné im rozumieť #### Základná štruktúra vzorov - názov - problém(na čo je vzor vhodný) - riešenie(popis vzoru) - dôsledky(výhody nevýhody) #### Klasifikácia vzorov podľa GoF 1. Creational Pattern - problematika vytvárania objektov - inicializácia a konfigurácia - príklad - class: - Factory method - object: - Singleton - Prototype - Abstract Factory - Builder 2. Structural Pattern - oddeľujú rozhrania od implementácie - kompozícia tried do hierarchií - dedičnosť - príklad - class: - Adapter(class) - object: - Adapter(object) - Bridge - Composite - Decorater - Facade - Proxy - Flyweight 3. Behavioral Pattern - dynamická interakcia medzi triedami - distribuovanie zodpovednosti - príklad - class: - Interpreter - object: - Iterator - Memento - Observer - State - Strategy - Visitor ### Creational Patterns #### Singleton - **Vytvára a sprostredkúva prístup k jednej zdieľanej inštancii dostupnej odkiaľkoľvek** - pokiaľ niekto bude chcieť vytvoriť druhp inštanciu, vráti sa mu odkaz na už vytvorenú - použije se mechanismus volání statických metod(public static) ![](https://i.imgur.com/Gr0taCD.png) Aplikovatelnosť: - ak potrebujeme v celom systéme presne jednu inštanciu danej triedy, dostupnú cez dobre známy definovaný prístupový bod Dôsledky: - kontrolovaný prístup k inštancií - redukcia menného priestoru Kritika: - singleton je niekedy spomínaný v anti-patterns, vytvoriť niečo globálne - porušuje single responsibility principle ### Structural Patterns #### Facade - sprostredkuje prístup k podsystému - namiesto priamej interakcie klientov s komplexnými komponentami subsystému, používa jednotné (často zjednodušené) API ![](https://i.imgur.com/2LXMlfD.png) Aplikovatelnosť: - keď chcete poskytnúť jednoduché rozhranie pre komplexný podsystém - keď chcete vrstviť svoje podsystémy, použite fasádu na definovanie vstupného bodu do každej úrovne podsystému Dôsledky: - Chráni klientov pred komponentmi podsystému, čím znižuje počet objektov, s ktorými klienti pracujú, a uľahčuje používanie podsystému. ### Behavioral Patterns #### Memento - zachytáva a ukladá interný stav objektu - uložený stav objektu môže byť neskôr načítaný Aplikovatelnost: - ak chceme ukladať stav objektu (alebo jeho časti) pre načítanie neskôr - a zároveň ak by priame rozhranie pre získanie stavu objektu zbytočne vystavovalo implementačné detaily Důsledky: - zachováva princípy zapuzdrenia (encapsulation) - zjednodušuje pôvodcu (Originator) - nemusí si v sebe držať všetky verzie uložených stavov - nevýhoda: používanie mementa môže býť náročné (kopírovanie veľkého množstva informácií) ![](https://i.imgur.com/TfOS7ic.png) ## Interfaces - Poskytuje kontakt s vonkajším svetom - zobrazuje vlastne akú funkcionalitu môžme očakávať od danej komponenty a za akých podmienok - obsahuje operácie, vstupné a výstupné parametre - slúži ako kontrakt s okolitým svetom, ktorý hovorí o tom, že za dodržania vopred stanovených podmienok bude poskytovať takúto službu - musí byť veľmi dobre zdokumentovaný - kontrakt sa vlastne skladá z podmienok, dokumentácie jednotlivých operácií a parametrov ### Objektovo orientované kontrakty - udávajú presnú štruktúru špecifikácie daného interfacu - popisuje služby ktoré sú poskytované za konkrétnych podmienok ### Typy kontraktov Invariatny: - je to podmienka ktorá musí vždy platiť pre všetky inštancie danej triedy/komponenty - podmienka ktorá sa počas behu programu nikdy nemení Precondition - je to podmienka ktorá musí byť splnená na začiatku volania určite operácie Postcondition - je to podmienka ktorá platí vždy po volaní operácie ### Object Constraint Language - je to jazyk na formulácie podmienok daného kontraktu - podmienky vlastne pridávajú informáciu o elementoch daného modelu a vzťahoch medzi nimi - OCL obsahuje string, boolean, real a integer - pridávajú sa do UML - používa sa na presnú špecifikáciu daného kontraktu - OCL formulujeme vždy v kontexte danej triedy a následne pridávame podmienky - v prípade dedenia, pre-condition je v sub-class vždy **slabšia** - V prípade dedenia, post-condition je v sub-class vždy **silnejšia** #### OCL collections - OCL obsahuje kolekcie: - Set - neusporiadana množina v ktorej sa každý prvok vyskytuje práve jeden krát - Bag - neusporiadana množina v ktorej sa každý prvok môže vyskytovať viackrát - Sekvencia - usporiadana množina v ktorej sa každý prvok môže vykystovať viackrát #### OCL operations - OCL obsahuje operácie: - collect - vracia Bag prvkov splňujúci danú podmienku - select - vracia subset elementov ktoré splňujú danú podmienku - reject - doplnok ku select - forAll - je true pokiaľ podmienka platí pre všetky prvky danej kolekcie - exists - je true pokial podmienka platí aspoň pre jeden prvok danej kolekcie - iterate - dokážeme danou kolekciou iterovať ## SW architecture - Skladá sa zo základných dizajnových rozhodnutí týkajúcich sa daného systému. - Je to také rozhodnutie, ktoré je v neskorších fázach veľmi ťažké zmeniť Prvky softvérovej architektúry - modules - sú to časti softvéru, ktoré implementujú určitú funkcionalitu - zapúzdrené časti softvéru ktoré obsahujú logicky zoskupenú funkcionalitu - pre komunikáciu s vonkajším svetom sú vystavené interfaces - connector - interface daného modulu - slúži na komunikáciu - deployment - je to vlastne mapovanie modulov a konektorov na harverové zdroje na ktorých budú bežať - môže to ovplyvniť správanie celého systému ### Architektonické návrhy - Generické riešenia dizajnu architektúry - je to súhrn architektonických riešení ktoré sú aplikovateľné na konkrétny prípad použia - je prepoužiteľný - Slúži na vzájomnú komunikáciu medzi zúčastnenými stranami o danom softvere - Využíva sa aj pri projektovom plánovaní, na základe architektúry si vieme lepšie predstaviť čo vlastne ideme implementovať, vďaka tomu vieme lepšie odhadovať pracnosť - udržovateľnosť #### Client-Server architecture pattern - data sú distribuované naprieč servermi ktoré poskytujú službu - klient volá takéto služby **Server** - reactive entity **Client** - active entity #### Peer-to-Peer Architecture - distribuovaná architektúra, kde úlohy a zaťaženie sú rozdelené medzi jednotlivé peery - peer pôsobí ako klient aj ako server #### Layered Architecture - pomáha štruktúrovať aplikáciu na viacero vrstiev, ktoré komunikujú prostredníctvom interfacov - čím vyššia vrstva, tým vyššia miera abstrekcie - Vrstva N poskytuje službu vrstve N+1 a deleguje úlohy na vrstvu N-1 - Vrstvy sú komplexné entity pozostávajúce z komponent Komunikácia zhora nadol: - Klient zadá požiadavku na vrstvu N. Vrstva N volá ďalšiu vrstvu N-1 na podporu čiastkových úloh a tak ďalej, kým sa nedosiahne vrstva 1. Vrstva N často prekladá jednu požiadavku na niekoľko požiadaviek do vrstvy N-1. Komunikácia zdola nahor: - Reťazec akcií začína na nižšej vrstve 1, napr. keď ovládač zariadenia detekuje vstup. Horné vrstvy sú upozornené a poskytnuté údaje sú interpretované hornými vrstvami. Výhody: - jednotlivé vrsty je možné prepoužiť Nevýhody: - nižšia efektivita komunikácie Príklad: iDesign Method #### Repository Architecture Pattern - Interakcia s dátami prostredníctvom centrálneho repoziráta - Repozitár je stredník v komunikácií medzi dátovou vrstvou a biznisovou vrstvou #### Model View Controller(MVC) - pomerne starý pattern Model: - poskytuje funkcionalitu a enkapsuluje dáta - upozorňuje závislé komponenty na zmenu View: - prezentuje dáta použivateľovi - rôzne Views môžu zobražovať model v rôznych podobách Controller: - Prijíma vstup používateľa ako udalosti. Udalosti sa prevedú do žiadostí pre Model alebo súvisiace Views. #### Broker Architecture - pôsobi ako stredník v komunikácií medzi klientom a serverom Client: - Implementujee používateľskú funkcionalitu, posiela požiadavky na servery. Na zavolanie vzdialenej služby klienti preposielajú požiadavky Brokerovi. Klient nemusí poznať lokalitu serverov, ku ktorým pristupuje. Server: - implementuje služby Broker: - je zodpovedný za prenos dát medzi klientom a serverom #### Microkernel Architecture - core systém štruktúry mikcokernel obsahuje iba minimálnu funkcionalitu potrebnú na to, aby bol systém operovateľný. - Plug-in moduly sú samostatné, nezávislé komponenty ktoré obsahujú funkcionalitu a vlastný kód, ktorý má rozšíriť core systém #### Pipes and Filters - poskytuje štruktúru systému cez ktorý prúdia dáta - dáta prúdia prostredníctvom pipes a menie sa v jednotlivých filtroch Pipe: zabezpečuje spojenie medzi jednotlivými filtrami Filter: Procesuje vstupné dáta a vracia upravené výstupné Active filter: získava dáta z pipes a odosiela ich ďalej Active pipes: aktívne posieľajú a žiadajú dáta Data source: input stream Data sink: výsledok na konci pipe #### Blackboard - užitočný na riešenie problémov na ktoré nemáme konkrétny postu - Centrálne úložisko dát. Termín slovná zásoba používame pre množinu všetkých dátových prvkov, ktoré sa môžu objaviť na tabuli. - Knowledge sources - separate independent subsystems that resolve specific aspects of overall problem, komunikujú len prostredníctvom tabule - Control - určuje poradie KS, monitoruje blackboard ## Komponentové systémy - spustitelný kus kódu - typicky sa skladá z množstva tried alebo objektov - nepriamo komunikuje prostredníctom interfacov - nezobrazujú source code, sú enkapsulované, poskytujú len dobre špecifikovaný interface - sú prepoužiteľné a jednoducho - Rozhrania sú užitočné pri deklarovaní celkového správania komponentu, ale nemajú žiadnu individuálnu identitu. - Port má identitu. Komponent môže komunikovať s iným komponenton cez špecifický port. - komponent sa delí na časti #### Komponentový model - definuje špecifikú reprezentáciu, interakciu, kompozíciu a iné štandardy SW komponent - komerčný príklad, Corba ## Quality Assurance - chceme garantovať kvalitu daného softvéru - vzhľadom na SLA, zákazník požaduje určite štandardy týkajúce sa kvality, za ktoré platí funkčné požiadavky - definujú funkcionalitu sw nefunčkné požiadavky - môže definovať obmedzenia a použité technológie Extra-functional requirements - rýchlosť systému, dostupnosť Ako navrhnúť vysoko kvalitný softvér? - snažíme sa použiť vhodné architektonické návrhy - snažíme sa robiť jednotlivé komponenty alebo prvky čo najkvalitnejšie Ako garantovať kvalitu? - musíme ju merať - meriame prostredníctom - monitorovania a testovania - formálnej verifikácie - predikcie na základe modelu - odhad kvality vyvíjaného systému(je na to potrebný model systému, je to použiteľné počas celej doby návrhu architektúry), kvalita odhadu závisí na modele a pozornosti venovanej detailom Kvalita komponenty alebo služby závisí na kvalite jej implementácie, služieb ktoré jú volajú a zdrojoch ktoré komponent používa a spôsobe ako je služba používaná