OMO Flashcards
(85 cards)
Paradigmata SW vyvoje
- Imperativni - pro popis cinnosti se pouziva sekvence prikazu
- jde o “How to” popis toho, co a jak se ma provest
- OO - abstrakce realneho sveta do objektu, jejich vztahy a komunikace, zapouzdreni
- Proceduralni - program je repreentovan jako flow procecud - script nad daty - Deklarativni - pro popis zpracovani se nepouziva sekvence kroku
- jde o “What is” popis/znalost, kde deklaruju neco
- Funcionalni - zpracovani programu je agregace funkci nad immutable daty
- Logicky - program reprezentovan jako axiomy a dokazovani vztahu
Hlavni rozdily proceduralni vs funkcionalni programovani
Proceduralni:
- mutable data
- iterace
- manipulace se stavem
- jednoduchost porozumeni kodu
- jednoduchy debuggin
- delsi kod
- side efekty procedur
Funcionalni:
- immutable data
- rekurze
- bez stavu objektu
- kratsi kod
- elegantnejsi reseni
- zadne side efekty
Logicke programovani
Treba Coque v logice, problem solver ktery urci, zda nejaka otazka na tvrzeni plati
Deklaruje pravidla,axiomy, fakta a dotazy
- problem solver z definovanych pravidel se snazi odvodit otazku
Dva typy komplexity v systemu
- Esencialni - takova, ktere se nejde zbavit, vetsinou je podminena nejakym business pozadavkem realneho sveta, nejde to odstranit ze systemu
- treba vydani kreditu je podmineno jeste kontrolou profilu zakanznika - Incidentni - takova, kterou jsem si zavedli sami a lze se ji zbavit implementaci
- treba vydani kreditu resim pres dva ruzne systemy ktere musim tedy synchronizovat
Jak strukturovat problem komplexity zadaneho systemu, kroky
- Dekompozice - rozlozim cely system na mensi komponenty
- Abstrakce - skryvam komplexitu komponent do jednodussich
- Hierarchie - provazani komponent emzi sebou
- Design patterny - aplikuju v kazdem kroku
Cohesion a coupling, reusability
Principy pro dekompozici systemu do modulu
- Cohesion - soudrznost, tedy spojuju moduly podle podobnosti funkcionality tak, aby spolu byly takove, ktere vykonavaji co nejpodobnejsi aktivituCohesion se dívá dovnitř modulu.
Znamená to, že všechny části modulu dělají „jednu věc“ nebo velmi úzce související věci.
Příklad:
Modul PDFGenerator obsahuje funkce jako renderText, addImage, saveToFile → všechny slouží ke generování PDF, takže vysoká cohesion.
Naopak modul, který má parseXML, sendEmail, logToFile → nízká cohesion, protože funkce spolu moc nesouvisí.
✅ Cílem je vysoká cohesion – moduly by měly být logicky ucelené a zaměřené na jednu oblast. - Coupling - provazanost, moduly maji pevne vazby uvnitr a co nejvolnejsi vazby mezi sebou
Coupling se dívá ven – mezi moduly.
Znamená to, jak moc jeden modul závisí na jiném (zná jeho interní detaily, často ho volá, očekává konkrétní datové struktury…).
Vysoký coupling = moduly jsou silně závislé (změna jednoho rozbije druhý).
Nízký coupling = moduly jsou co nejvíce nezávislé, komunikují přes jasně definovaná rozhraní (např. přes rozhraní/API).
✅ Cílem je nízký coupling – moduly se mohou měnit nezávisle na sobě → lepší údržba, testování, znovupoužitelnost. - Reusabillity - modul je soutreden na vykonani nejake konkretni funkce, ale idealne i mimo kontext, tak aby mohl byt pouzit v jinem modulu nebo v jinem zivotnim cyklu nebo na jinem miste
DRY
Dont reperat yourself - stejny kod se nenachazi ve vice modulech
- opakujici se kody musi schovat do jedne rutiny v ramci jednoho modulu
Flexibilty isolation
Izolace flexibitily - princip tvorby modulu tak, aby pripadna zmena zasahla vazby pouze uvnitr tohoto modulu
- tedy prepisovani classy mi ovlivni pouze tuto classu a ne nic jineho
- toto castecne resi encapsulace - zapouzdreni dat, ktere jsou privadni pro modul a ven se pokutuji pouze na vyzadani pres inteface
Abstrakce, obecne co to je
Pristup, kde ke komplexnim uloham pristupujem jako k hotovym elementarnim jednotkam a neresime schovanou komplexitu uvnitr, o kterou se postara vnitrni abstraknit vrstva
- neco jako rekurze - problem vidim jako uz hotovy a samotna rezie je schovana hluboko v rekruzi
Jde v podstate o prinicp rozdel a panuj - vetsi problem vnimej jako schovana reseni mensich podproblemu
Samotny UML diagram systemu je uz sam o sobe abstrakce systemu - zavedl jsem entity, jejich vztahy, vazby…, tedy cely system jsem rozlozil na mensi entity ktere resi jednotlive problemy
Jmenna abstrakce
Obycejne pojmenovani promennych, class, funkci, atd. abych se k nim mohl odkazovat
- je to jenpouzivanejsi druh abstrakce, protoze v podstate vsechno v Imperativnim programovani je pojmenovane
- schovavam tedy komplexni logiku do “nazvu” -> do jmena, tedy funkce je pro me pouze nejaka abstarkni findById, a neresim jak je to implementovano uvnitr
Objektova abstrakce
Druha nejpouzivanejsi abstrakce hlavne vyuzivana ve skoro 100% OOP
- komplexni realnou entity ze sveta schovam do objektu
- neresim jak je implementova a jak se chova a funguje uvnitr
- pouze potrebuje od nej aby mi poskytoval svoje hodnoty a chovani navenek
- abstrakce - schovani komplexniho a jen jednoduche na venek
Datova abstrakce
Dalsi nejpouzivanejsi abstrakce
- ADT je mnozina elementu a definovane operace na nich
- tedy znovu neresim jak je ADT implementovan uvnitr
- pouze na venek mam interface (metody) jak s nim pracovat a pocitat a jake hodnoty do toho muzu vrazit a ocekavat navratove hodnoty
Proceduralni abstrakce
V pdostate se jedna o abstrakci pomoci metod - metoda je pro me “black-box” o kterem pouze vim, co prijima za parametry a co vraci za hodnotu, tedy dali abstrakce, tkera schovava komplexni logiku a navenek pouze piskytuje interface
- vyhoou je moznost za a redukce kodu DRY a za b prepouzitelnost metod na ruznych msitech nezavisle na modulu a kontextu
Call-by-Value, Call-by-Refernce
- By value - do funkce se posle kopie posilane promenne
- zmena poslane promenne v metode neovlivni puvodni posilanou metodu - By refernce - do funcke poslu stejnou adresu na ktere mam puvodni promennou
- zmena parametru v tele funcke je hned i zmenou puvodniho poslaneho parametru
Co je design pattern
Obecne efektivni reseni znameho a casteho problemu ktere ma implementaci nezavisle na jazyku a infrastrukture
- muze byt v jakekoliv vrstve SW
Pozadavky na kvalitni SW
Kritéria kvality softwarového systému jsou:
Schopnost reagovat na změny = kritérium číslo jedna u softwarového vývoje
§ Flexibilita - množství a složitost změn, které musím v systému provést proto, aby fungoval i pro jiné scénáře
§ Přepoužitelnost - použitelnost systému pro konstrukci v různých aplikacích
§ Rozšiřitelnost - schopnost systému adaptovat se na změny ve specifikaci (rozšiřuji funkcionalitu)
§ Robustnost - schopnost systému reagovat na nepředpokládané situace
§ Kompatibilita - jednoduchost kombinování softwarových komponent mezi sebou
§ Použitelnost - jednoduchost použití systému uživatelem nebo jiným systémem
§ Efektivnost - minimalizace požadavků na zdroje (hardwarové, lidské, finanční)
§ Škálování - schopnost systému fungovat při narůstající zátěži
§ Portovatelnost - náročnost přenesení software do jiného hardwarového a softwarového prostředí
Nelze dosahnout vseho na 100% -> jakakoliv snaha o vyllepseni jedne vlastnosti nutne znamena pokles jine vlastnosti
- treba zvyseni flexibility zvysuje i komplexitu -> zvyseni casu a penez
- zvyseni prepouzitelnostni snizuje pouzitelnost (musim zvysit obecnsot) atd..
- tedy snazim se maximalizovat nejdulezitejsi pro me a zakaznika komponenty ale az do urcite hladiny, kdy dalsi vylepseni uz jsou neumerna vuci zeslabeni jinych vlastnosti
Records v Jave
Trida, ktera nema update metody a slouzi pouze jako uchovani stavu objektu
- treba je to imutable verze tridy
Abstraktni trida
Takova, kterou nelze instanciovat
- muze predepisovat jak definovane tak i nedefinovane metody
- je to jako interface, ktery uz ma treba nejake definovane metody a atributy
- muzu dedit od abstraktni tridy
- je to jako metoda Vehicle - nejabstraktnejsi tridy pro Car a Truck, kterou bych ale nemel byt schopny instanciovat, ale poskytuje mi spolecne atributy, spolecne funkce (treba drive) a i predpis pro spolecne funkce, ktere ale budu pretezovat (treba honk)
Interface z pohledu promennych a modifikatory metod
Vsechny metody jsou public (dava smysl -> chci se na ne dotazovat jako API)
- promenne jsou public static final
Vztahy mezi objekty v UML diagramu
- Asociace - plna cara s jednoduchou sipkou
- obycejny nezavisly naprosto vztah
- jako atribut ve tride jine metody
- zakladni vztahova vazba - Dedicnost - plna cara s nevyplnenou slozitou sipkou
- Realizace - srafovana cara s nevyplnenou komplexni sipkou (implementace)
- Zavislost - srafoana cara s jednoduchou sipkou (ani se nemodeluje)
- Agreagce - pllna cara s nevyplnenym kosoctvercem
- nezavisle entity, jenomze vlastneny objekt nemuze mit vice vlastniku
- tedy je to vazba 1:1, nebo 0:N
- treba predmet a profesor (oba mohou existovat nezavisle)
- jenomze profesor muze mit nekolik predmetu (agreguje je)
- predmet nemuze (rekneme) mit vic profesoru
- nejde vytvorit cyklus
- profesor ma pole predmetu, predmet ma jednoho profesora jako atribut - Kompozice - plna cara s vyplnenym kosoctvercem
- zavislost, kdy vlastneny objekt nemuze logicky existovat bez jeho vlastnika
- neexistuje cyklus, vazba zase 1:1, nebo 0:N
- pri zaniknuti vlastnika -> zanikaji i jeho kompozity (slozeniny)
- kompozit muze byt i inner trida vlastnika
- treba House a Room
Komunikace mezi objekty
Pomoci Message Passing - posilani zprav
- tedy abstrakne receno je to provolani nejake metody tridyA, do ktere vlozim odkaz na triduB, a na tride B zavolam jinou metodu atd…
- bud synchronne za sebou
- nebo asynchronne bez ekani ve vice vlaknech
Class Diagram
Grafice zobrazeni dekomponovaneho abstraktniho systemu pomoci treba UML schematu
- zobrazuje tridy, metody, atributy, pristupovane modifikatory, treba navratove a hodnoty a parametry, typ promennych a hlavne vazby a vztahy mezi objekty
SOLID
S - Single Responsibilty Principle
- trida ma pouze jeden ucel a metody naplnuji pouze funkce s timto ucelem
- jednodussi udrzba a mene zasahovani
- treba generovani dokumentu a jeho formatovani je vyhodne rozdelit do dvou trid
O - Open/Close Principle
- trida by mela byt OTEVRENA na ROZSIROVANI
- ZAVRENA na UPRAVOVANI
- tedy v hotovych trida delam pouze bug-fixing, novou funkcionalitu pridavam hlavne do potomku podle potreby, chci minimalizovat opravy hotoveho kodu
- tridu pouze rozsiruju, ne prepisuju
L - Lisko Substitution Principle
- zaklad polymorfismu
- misto tridyA muzu nahradit toto misto jakymkoliv potomkem tridyA
- tedy obecne chovani mohu nahradit konkretnejsi implementaci bez problemu
I - Interface Segregation Principla
- je lepsi mit vice jemnejsich interfacu/vice stepeni, nez jeden interface, ktery je moc obecny
- tzn pokud v interfacu deklaruju DVE METODY, ale trida, ktera bude toto implementovat bude pouzivat POUZE JEDNU -> tak je to moc obecny interfac a je lepsi ho rozlozit na dva interfacy, do kazdeho dat zlvast ty emtody
D - Dependency Inversion Principl
- tridy by nemely zaviset na konkretnich implementacich, ale pouze prijimat abstraktni parametry
- klasicky do konstruktoru/metody posilam jako parametr konkretni instanci (vstikovani zavislosti - injection) a trida s ni pracuje uz podle definovaneho chovani
- SPATNE - konstruktor si SAM NASTAVI pevnou zavislost treba na konkretni instanci a tim NENI SCHOPNY REAGOVAT NA ZMENY
- tedy trida pracuje s ABSTRAKTNIM OBJEKTEM (treba Database), ktery ji poslu do konstruktoru/metody
- timto definuje abstraktni chovani a mohu do ni posialt ruzne zavislost (konkretni isntance jako SQLDB, NoSQLDB, InMemoryDB…, tedy tam vstrikavam konkretni implementace do modulu, ktery je na nich nezavisly)
REFERENTIAL TRANSPARENCY ve funkcionalnim programovani
Je vlastnost vychazejici z pure funkci
- vyraz je referencne transparentni, pokud ho muzeme nahradit primo hodnotou, aniz by se zmenil vysledek programu
- tedy prijemnym dusledkem toho je, ze volani funkce s parametry muzeme primo nahradit uz hotovou hodntou, ktera byla vracena touto funkci s temitoparametry nekdy uz driv (memorizace vysledne hodnoty)
- je to jakysi caching navratovych hodnot, ktere optimalizuje kod