Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“

Slides:



Advertisements
Podobné prezentace
Období vzniku: duben _inovace_FG.9.48 Autor : Vladimír TesaříkČlověk a svět práce, finanční gramotnost, nové auto.
Advertisements

Název školy ZÁKLADNÍ ŠKOLA, JIČÍN, HUSOVA 170 Číslo projektu CZ.1.07/1.4.00/ Číslo a název klíčové aktivity 3.2 Inovace a zkvalitnění výuky prostřednictvím.
Delphi – práce se základními komponentami (1. hodina) OB21-OP-EL-KON-DOL-M-4-008A Orbis pictus 21. století.
Programování v jazyce C++ Dědičnost a polymorfismus.
ZAL – 5. cvičení Martin Tomášek Pole - opakování Základní datový typ. V poli držíme více elementů (jednoho typu) S elementy v poli můžeme manipulovat.
HTML HyperText Markup Language Je to značkovací jazyk používaný na tvorbu webových stránek, které jsou propojeny hypertextovými odkazy. Je hlavním z.
Tabulkový procesor Odebrání skrytých dat a osobních informací kontrolou sešitů Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Růžena Hynková.
Memento. Motivace – kalkulačka 210° sin * /20 ? 0.25 ^2 ?
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
Software Licence a distribuce Karel Nymsa Dotkněte se inovací CZ.1.07/1.3.00/
Funkce Lineární funkce a její vlastnosti 2. Funkce − definice Funkce je předpis, který každému číslu z definičního oboru, který je podmnožinou množiny.
ORGANIZACE PŘIJÍMACÍHO ŘÍZENÍ 2016/2017 část I. - Přihláška na SŠ
Software =je v informatice sada všech počítačových programů používaných v počítači, které provádějí nějakou činnost. - Software je protiklad k hardwaru,
HTML a CSS Rostislav Miarka.
NÁZEV ŠKOLY: S0Š Net Office, spol. s r.o., Orlová-Lutyně
Tutoriál ~ eKnihy Stahování
STANDARDY KVALITY V SOCIÁLNÍCH SLUŽBÁCH „SKSS“
Výukový materiál zpracován v rámci projektu
Interpolace funkčních závislostí
COM – Práce s objektovým modelem jiné aplikace
Lineární funkce - příklady
Řešení nerovnic Lineární nerovnice
ČÍSLO PROJEKTU CZ.1.07/1.5.00/ ČÍSLO MATERIÁLU 1 – Množiny – teorie
STANDARDY KVALITY V SOCIÁLNÍCH SLUŽBÁCH „SKSS“
Číslo projektu CZ.1.07/1.5.00/ Číslo materiálu
Kurz algoritmizace a programování v jazyce C
State 1.
Algoritmizace - opakování
Algoritmizace - opakování
Programování v jazyce C++
Financováno z ESF a státního rozpočtu ČR.
Excel – tabulkový procesor
Jednotné principy klasifikace na GJKT
Jedno-indexový model a určení podílů cenných papírů v portfoliu
Dostupné z Metodického portálu ; ISSN
Název školy : Základní škola a mateřská škola,
Programovací jazyky Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
Abstract Factory.
Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,
9. Heterogenní a homogenní skupiny
EU_32_sada 2_08_PV_Podnebí, podnebné pásy_Duch
Kvadratické nerovnice
Bridge.
Cvičení 4 Dědičnost objektů.
Číslo projektu Číslo materiálu název školy Autor TEmatický celek
jak budovat kulturu školy společně
Řešení nerovnic Lineární nerovnice
BIBS Informatika pro ekonomy přednáška 2
Informatika pro ekonomy přednáška 8
Ing. Martin Molhanec, CSc. CASE 10. přednáška
Microsoft Office Access
Zlomky Násobení zlomků..
Visitor 1 1.
Úvod do praktické fyziky
Teorie chyb a vyrovnávací počet 1
Vztahy mezi útvary charakter průběhu hlavní podnikatelské činnosti
Lineární činitel prostupu
Přednášky z Distribuovaných systémů
Základní škola a mateřská škola Lázně Kynžvart Autor: Mgr
Analýza informačního systému
Informatika pro ekonomy přednáška 8
Vázání dat Data Binding
Lineární funkce a její vlastnosti
Seminář o stavebním spoření
Grafy kvadratických funkcí
Výčtové typy ( Java 5 ) Výčtové typy jsou speciální třídy zavedené pro větší bezpečí a pohodlí. V nejjednodušší variantě se definují příkladmo takto:
Hromadné dokumenty opakující se pro kolekci osob
Adapter
Bridge.
Class Diagrams.
Transkript prezentace:

Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“

Obecné Vlastnosti Cíle vytváří objekty po částech řeší pořadí účel je řídit process, ne získat produkt Cíle vytvořit různé reprezentace podobným postupem zjednodušit rozšiřitelnost do budoucnosti přehledný zdrojový kód

Struktura Director Builder ConcreteBuilder Product řídí proces používá Builder a po krocích vytvoří objekt Builder definuje rozhrání ConcreteBuilder implementuje rozhrání Builderu definuje proces tvorby dané části Product reprezentuje vytvořený objekt

Sequence diagram Klient vytvoří Director a konfiguruje ho ConcreteBuilderem Director požádá ConcreteBuildera o vytvoření části výsledného objektu Klient získá vytvořený objekt od ConcreteBuilderu

Příklad: Fast food restaurace Části hamburger nápoje dezert hračka Jiné části - stejná konstrukce Literatura: http://www.cnblogs.com/xiuyusoft/archive/2011/06/17/2083540.html

Implementace Builderu interface typicky abstraktní třída virtuální metody definují, co má každý ConcreteBuilder umět ne nutně „void“ např. vracení vytvořených častí Productu Product žádná abstraktní třída Nemá smysl – vytvořené objekty se hodně odlišují V ConcreteBuilder-i: nově zkonstruované části zpravidla stačí obyčejně připojit, příklad s čtením RTF – další zkonvertované tokeny se přidávají na konec.

Souvislosti a důsledky Struktura konečného produktu vázaná na ConcreteBuilder interface pro konstrukci je stejný konkrétní implementační detaily skryté změna produktu = nový builder Oddělení konstrukce od reprezentace modularita, zapouzdření Umožňuje kontrolu konstrukce během jejího průběhu konstrukce produktu „step-by-step“ řeší kauzalitu při konstrukci jednotlivých bloků

Shrnutí Kdy použit Builder? Proč ho použit? objekt se skládá z více částí složitý proces tvorby částí očekává se rozšíření budování immutable s mnoho volitelnými parametry Proč ho použit? izolace konstrukce a reprezentace umožňuje změnit strukturu bez přepisování všech ConcreteBuilderů třídy mohou zůstat neměnné (immutable)

Kde použít Konstruktory s volitelnými vlastnostmi Řešení public class User { private final String firstName; //required private final String lastName; //required private final int age; //optional private final String phone; //optional private final String address; //optional } Konstruktory s volitelnými vlastnostmi chceme konstruktory s povinnými + všechny možné podmnožiny volitelných argumentů Nechceme veřejné „settery“ Ztratíme výhody neměnných (immutable) objektů Řešení Naprogramovat všechny možné konstruktory Použit volitelné argumenty Builder Pro .NET od verze 3.0 a C++ platí, že je možné použít koncept volitelných argumentů. Nicméně větší množství takových argumentů značně snižuje čitelnost kódu.

Kostruktory public User(String firstName, String lastName) { this(firstName, lastName, 0); } public User(String firstName, String lastName, int age) { this(firstName, lastName, age, ""); public User(String firstName, String lastName, int age, String phone) { this(firstName, lastName, age, phone, ""); public User(String firstName, String lastName, int age, String phone, String address) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.phone = phone; this.address = address; // ... ještě další 4 konstruktory // rozšíření třídy User o 1 atribut problematické

Builder jediný argument konstruktoru třídy „User“: ConcreteBuilder třída „User“ získá Product od ConcreteBuilder public class User { private readonly String firstName; // required private readonly String lastName; // required private readonly int age; // optional private readonly String phone; // optional private readonly String address; // optional // 1 private konstruktor s jediným argumentem: ConcreteBuilder private User(UserBuilder builder) { this.firstName = builder.firstName; this.lastName = builder.lastName; this.age = builder.age; this.phone = builder.phone; this.address = builder.address; // náchylnosti na chyby se zbavíme použitím automapperu }

Builder public class UserBuilder { private readonly String firstName; private readonly String lastName; private int age; private String phone; private String address; public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(int age) { this.age = age; return this; public UserBuilder phone(String phone) { this.phone = phone; return this; public UserBuilder address(String address) { this.address = address; return this; public User build() { return new User(this);

Fluent builder var b builder = new User.UserBuilder("John", "Doe"): builder = builder.age(30); builder = builder.phone("1234567"); builder = builder.address("Fake address 1234"); User user = builder.build();

Builder public class UserBuilder { private readonly String firstName; private readonly String lastName; private int age; private String phone; private String address; //novy atribut private String email; public UserBuilder(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public UserBuilder age(int age) { this.age = age; return this; public UserBuilder phone(String phone) { this.phone = phone; return this; public UserBuilder address(String address) { this.address = address; return this; //pridani atributu public UserBuilder email(String email) { this.email = email; return this; public User build() { return new User(this); Builder

Fluent builder var b builder = new User.UserBuilder("John", "Doe"): builder = builder.age(30); builder = builder.phone("1234567"); builder = builder.address("Fake address 1234"); Builder = builder.email (“mail@mail.com"); User user = builder.build();

Související NV Abstract Factory lze chápat jako limitní případ Builderu Builder vytvoří objekty postupně, po částích, vrátí až na požádání Produkty Builderu nemusí implementovat společný interface nasazení Abstract Factory preferujeme v případě, že celý objekt lze vytvořit „jediným voláním“, odpověď je získána hned Composite je často výsledkem práce Builderu

Příklad z reality @(Html.Kendo().Grid<Kendo.Mvc.Examples.Models.CustomerViewModel>() .Name("grid") .Columns(columns => { columns.Bound(c => c.ContactName).ClientTemplate( @"<div class='customer-photo' style='background-image: url(../content/web/Customers/#:data.CustomerID#.jpg);'></div> <div class='customer-name'>#: ContactName #</div>") .Width(240); columns.Bound(c => c.ContactTitle); columns.Bound(c => c.CompanyName); columns.Bound(c => c.Country).Width(150); }) .HtmlAttributes(new { style = "height: 550px;" }) .Scrollable() .Groupable() .Sortable() .Pageable(pageable => pageable .Refresh(true) .PageSizes(true) .ButtonCount(5)) .DataSource(dataSource => dataSource .Ajax() .Read(read => read.Action("Customers_Read", "Grid")) .PageSize(20) ) http://demos.telerik.com/aspnet-mvc/grid/index

Příklad z reality http://demos.telerik.com/aspnet-mvc/grid/index

Nepřihlášený uživatel Příklad z reality - SIS GUI stejný obsah položek jiné barvy, tvar Obsah podle přihlášeného uživatele jádro stejné další položky zobrazené/vynechané podle privilegií Nepřihlášený uživatel Přihlášený uživatel