The wiki page is under active construction, expect bugs.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
statnice:bakalar:b6b36omo [2025/06/12 13:16] – [Datové struktury a patterny: lazy loading, object pool, cache map, filter, reduce pattern] prokopstatnice:bakalar:b6b36omo [2025/06/13 07:31] (current) – [Structural design patterns: adapter, proxy, bridge, composite, facade, decorator, flyweight] prokop
Line 395: Line 395:
 </code> </code>
  
-{{statnice:bakalar:omofprototype.png?700}}+{{statnice:bakalar:omoprototype.png?700}}
  
 === Builder === === Builder ===
Line 582: Line 582:
  
 {{statnice:bakalar:sinfacade.png?500}} {{statnice:bakalar:sinfacade.png?500}}
 +
 +=== Composite Design Pattern ===
 +
 + * Účel:
 +  * Umožňuje jednotné zacházení s **jednotlivými objekty** i s **jejich složením (stromová struktura)**.
 +  * Používá se pro reprezentaci **hierarchických struktur** (např. souborový systém, GUI komponenty, organizace).
 +
 + * Struktura:
 +  * **Component** – společné rozhraní pro listy i složené objekty.
 +  * **Leaf** – jednoduchý objekt (např. soubor).
 +  * **Composite** – složený objekt (např. složka obsahující další objekty).
 +
 + * Výhody:
 +  * Rekurzivní zpracování hierarchických struktur.
 +  * Klientský kód se nemusí starat, zda pracuje s listem nebo composite – volá jednotné metody.
 +  * Umožňuje dynamicky přidávat/odebírat prvky.
 +
 +=== Příklad použití: souborový systém ===
 +
 +<code java>
 +  interface FileSystemItem {
 +    void display(String indent);
 +  }
 +
 +  class File implements FileSystemItem {
 +    private String name;
 +
 +    public File(String name) {
 +        this.name = name;
 +    }
 +
 +    public void display(String indent) {
 +        System.out.println(indent + "- File: " + name);
 +    }
 +  }
 +
 +  class Folder implements FileSystemItem {
 +    private String name;
 +    private List<FileSystemItem> children = new ArrayList<>();
 +
 +    public Folder(String name) {
 +        this.name = name;
 +    }
 +
 +    public void add(FileSystemItem item) {
 +        children.add(item);
 +    }
 +
 +    public void display(String indent) {
 +        System.out.println(indent + "+ Folder: " + name);
 +        for (FileSystemItem item : children) {
 +            item.display(indent + "  ");
 +        }
 +    }
 +  }
 +
 +  public class CompositeDemo {
 +    public static void main(String[] args) {
 +        Folder root = new Folder("root");
 +        root.add(new File("readme.txt"));
 +
 +        Folder src = new Folder("src");
 +        src.add(new File("Main.java"));
 +        src.add(new File("Utils.java"));
 +
 +        root.add(src);
 +        root.display("");
 +    }
 +  }
 +</code>
  
 === Decorator === === Decorator ===
Line 1361: Line 1431:
 </code> </code>
  {{statnice:bakalar:omocache.png?400}}  {{statnice:bakalar:omocache.png?400}}
 +
 +=== Map, Filter, Reduce (stream API) ===
 +  * Funkcionální operace na sekvencích dat (např. kolekce) umožňující čistý a efektivní styl programování.
 +  * Vzniká **pipeline** z řetězených operací, které jsou **lazy** vyhodnocovány.
 +
 +  * **Map**: transformace každého prvku.
 +  <code java>
 +     List<String> names = people.stream()
 +         .map(Person::getName)
 +         .collect(Collectors.toList());
 +  </code>
 +
 +  * **Reduce**: agregace prvků do jedné hodnoty.
 +   <code java>
 +     // Příklad z prezentace – nalezení největšího čísla
 +     List<Integer> numbers = Arrays.asList(5, 12, 3, 21, 7);
 +
 +     int max = numbers.stream()
 +         .reduce(Integer.MIN_VALUE, (a, b) -> a > b ? a : b); \\tady passujeme lambda funkci
 +
 +     System.out.println("Maximum: " + max);
 +   </code>
 +
 +  * **Filter**: výběr pouze těch prvků, které splňují predikát.
 +   <code java>
 +     List<Person> fromPraha = people.stream()
 +         .filter(p -> p.getCity().equals("Praha"))
 +         .collect(Collectors.toList());
 +   </code>
 +
 +  * **Kombinování:**
 +  <code java>
 +     List<String> sortedNames = people.stream()
 +         .filter(p -> p.getCity().equals("Praha"))
 +         .map(Person::getName)
 +         .sorted()
 +         .collect(Collectors.toList());
 +  </code>
 +
 +
 ===== Specifikace, návrhy specifikací, web API, Apiary, Swagger, GraphQL ===== ===== Specifikace, návrhy specifikací, web API, Apiary, Swagger, GraphQL =====
 +
 +<markdown>
 +### Specifikace
 +
 += Formální popis toho, jak se má komponenta v systému chovat
 +
 + - zahrnuje popis jejích rozhraní, funkcí a očekávaného chování
 + - představuje společný kontrakt pro implementátora komponenty a klienta komponenty
 + - význam specifikace: předchází chybám, srozumitelnost, připravenost na změny
 +
 +
 +**Behaviorální ekvivalence**
 +
 +"Dva kódy jsou behaviorálně ekvivalentní, pokud při stejných vstupech ve stejném kontextu dávají stejné výstupy a vedou ke stejnému stavu systému."
 +
 + - odpovídá na otázku zda-li se dva zdrojové kódy chovají stejně (možnost výměny kódu beze změny chování systému)
 + - není obecně testovatelná
 + - faktory ovlivňující behav. ekvivalenci: Vstupní hodnoty, Kontext běhu, Vedlejší efekty, Chybové stavy
 + - hraje roli i kontrakt mezi klientem a implementací:
 +   - Preconditions = požadavky, které musí klient splnit, než zavolá funkci
 +   - Postconditions = záruky, které funkce poskytne
 +
 +**Změna specifikace** - silná vs. slabá
 +
 +S2 je silnější nebo stejná jako S1 pokud:
 + - Preconditions pro S2 jsou slabší než nebo stejné jako pro S1
 + - Postcondition pro S2 jsou silnější nebo stejné jako pro S1
 +
 +=> můžeme nahradit S1 za S2 bez ovlivnění stávajících klientů
 +
 +**Přesnost popisu specifikace**
 +- Deterministic: jednoznačně určený výstup
 +- Undetermined: není jednozačně určen výstup 
 +
 +Příklad: "vrátí __první__ index i, kde arr[i] = val" vs "vrátí index i, kde arr[i] = val"
 +
 +**Deklarativní vs Operativní specifikace**
 +
 +- Deklarativní: nepopisuje detaily interních kroků implementace, popisuje výstup na základě vstupů
 +- Operativní: popisuje kroky implementace, slouží jako návod pro vývojáře
 +
 +(deklarativní preferovanější)
 +
 +**Testování** - testy musí splňovat podmínky specifikace, testy nesmí být podřízeny implementaci, ale výhradně specifikaci rozhraní
 +
 +### REST (Representational State Transfer)
 +
 += architektonický styl pro návrh webových API (nemusí být nutně vázaný na HTTP protokol)
 +- REST API jsou navrženy na základě resources = objekty/data/služby ke kterým klient přistupuje
 +- každý resource má identifikátor - URI
 +- používá se jednotný interface, aby byl zajištěn decoupling klienta a serveru (v HTTP použito verb v hlavičce - get, put, post, delete, patch)
 +- ! je bezestavový, odpovědi mohou být cacheovány
 +
 +Existují různé úrovně implementace:
 +- Level 0: jedno URI pro všechny operace, operace jsou post volání na toto URI
 +- Level 1: separátní URI pro jednotlivé resources
 +- Level 2: využití HTTP metod pro definici operací na resource
 +- Level 3: využití hypermedia odkazů (odpovědi obsahují URI na další resources např. objednávka -> uri pro položky)
 +
 +**Web API**
 +
 += api na webovém serveru nebo klientu
 +- request response koncept, předávání zpráv ve formátu JSON nebo XML
 +- ve většine řešení postavený na HTTP (využívání response kódů)
 +
 +SOAP (Simple Object Access Protocol)
 +
 +- protokol pro komunikaci mezi 2 zařízeními
 +- pro popis služeb využívá WSDL (web services description language) - formální popis poskytované funkcionality (xml)
 +- zprávy jsou ve formátu XML
 +- zpřístupňuje klientovi funkce a operace (např. může mít funkci CreateEmployee pro vytvoření zaměstnance v systému) -> orientovaná procedurálně
 +- není cachovaný
 +- pomalejší
 +
 +REST API
 +
 +- zpřístupňuje klientovi data -> orientovaná datově
 +- využívá HTTP - metody pro přístup ke zdrojům: get, put, post, delete, patch
 +- podporuje různé formáty - především JSON ale mohou být různé
 +- popis endpointů je méně formální
 +- rychlejší
 +
 +GraphQL
 +
 +- efektivní nástupce REST API
 +- dává možnost specifikace požadovaných dat
 +- když operace vrací objektový graf, tak mohu specifikovat hloubku a podmnožiny atributů jednotlivých entit
 +- zvládá větší zátěž než REST
 +
 +Open API
 +- Open API Initiative - zaměřuje se na vytvoření,zkvalitňování a propagaci formátu pro popis rozhraní, které bude nezávislé na dodavateli
 +- Open API Specification 
 +  - definuje standard pro popis REST API, nezávislé na programovacím jazyku
 +  - může být použita pro generování klientského i serverového kódu pro různé programovací jazyky, generování dokumentace, validace obsahu zpráv, testování
 +
 +Swagger
 +
 +- framework pro definici rozhraní podle specifikace OpenAPI
 +- pokrývá celý životní cyklus REST API:
 +  - návrh - Swagger Editor - nástroj pro psaní OpenAPI specifikace v YAML/JSON
 +  - dokumentace - Swagger UI - vygeneruje interaktivní dokumentaci z OpenAPI popisu
 +  - build - Swagger Codegen - automaticky generuje kód klientů/serverů podle specifikace
 +  - testování - Swagger Inspector - umožňuje testovat API volání přímo z prohlížeče
 +  - deployment - zakomponování do Docker apod.
 +
 +na datové struktury se v rámci zpráv odkazuje pomocí REF - uri
 +
 +APIARY
 +
 +- obdobný nástroj swaggeru
 +
 +</markdown>
Navigation

Playground

QR Code
QR Code statnice:bakalar:b6b36omo (generated for current page)