Nvrhov vzor Builder Jeden z pti vytvejcch nvrhovch
Návrhový vzor Builder Jeden z pěti vytvářejících návrhových vzorů Lukáš Caha
Hlavní informace 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. n Co to znamená? Požadovaný objekt a jeho konstruktor (builder) jsou dvě rozdílné třídy. q Jeden builder může vytvářet různé objekty. q n Hlavní myšlenky vytváří objekty po částech q účel je řídit proces, ne získat produkt q n Cíle vytvořit různé reprezentace podobným postupem q zjednodušit rozšiřitelnost do budoucnosti q přehledný zdrojový kód q
Class diagram
Slovník n Builder q n definuje abstraktní rozhraní pro tvorbu produktu Concrete. Builder implementuje rozhraní Builderu q definuje proces tvorby produktu q n Director řídí proces pomocí Builderu q po krocích vytvoří objekt q n Product q konečný produkt Builderu
Interaction diagram
Implementace Builderu n Builder Interface q Abstratkní třída q n n Product q n Přes virtuální a abstraktní metody definuje, co má každý Concrete. Builder umět Ne abstraktní třída Director q Abstraktní třída n Přes virtuální a abstraktní metody definuje, co má každý Concrete. Director umět
Problém n Vytváříme sendviče n Každý sendvič se musí skládat z chleba n Zbytlé ingredience jsou volitelné a pravděpodobně budou přibývat
Řešení bez Builderu n Tři způsoby řešení: Lehký konstruktor + těžký inicializační kód n Výhody q n Jednoduché Nevýhody q q q n S rostoucí složitostí roste nepřehlednost použití v kódu Všechno musí být public Postrádá všechny výhody OOP Težký konstruktor + lehký inicializační kód Syntaktická zkratka za konstruktor Výhody n q n Jednořádková inicializace Nevýhody q q q Možnost splést si pořadí argumentů Dlouhý kód třídy (hlavně konstruktory) Ne všechny jazyky poskytují možnost defaultních hodnot * Výhody q n Lehce přehlednější kód Nevýhody q Stejné jako u první varianty
Proč zavádět Builder n Builder umí elegantně vyřešit složité vnořené objekty, které je také nutno konstruovat n Builder skryje vnitřní funkcionalitu n Pouze varianta s mnoha konstruktory (přostřední) podporuje immutabilitu n Builder podporuje defaultní hodnoty q n Některé jazyky nemusí podporovat vložení komplikovanějších defaultních hodnot do konstruktoru Builder zavádí čitelnost q Funkčnost kódu plyne z názvů použitých metod místo pořadí v konstruktoru
Řešení s Builderem (zjednodušeně) n Builder q n Rozšiřitelný a modulární Použití builderu Přehledné q Jednořádkové (i když je naformátovaný na více) q
Varianty Postupný n Jeden Builder je doplňován novými argumenty n Vzhledově se moc neliší od použití seterů q Funkčně se ale chová jako Builder Plynulý (fluent) n Na jeden řádek (když pomineme formátování)
Directorless Builder n Učiníme metody Builderu public n Lightweight varianta pokud nám jde více o stavbu produktu
Role Directora n Jako mezikrok mezi Buildery a klientem můžu implementovat Director n Director umožní implementovat předvolby n Je také možné používat jeden Director na správu více Builderů
Builder Přidání Immutability n Kdybychom chtěli zavést immutabilitu, tak by kód vypadal takto q q 1. Construct Builder – vytvoří builder a přidá povinné parametry 2. Add parameters – přidá ostatní volitelné parametry 3. Build – sestaví produkt (nastaví defaultní hodnoty + zavolání konstruktoru produktu) 4. Return product – vrátí hotový produkt Třída Použití Sestavený senvič bude v toustovém chlebu, s kuřecím masem a ledovým salátem ale bez omáčky
Výhody a nevýhody + Imutabilita - tudíž bezpečné pro více vláken + Defaultní hodnoty pro nepovinné parametry + Rozšiřitelnost o nové položky + Zapouzdření + Zbavení se konstruktorů + Fluent interface - Kód je repetetivní a občas zbytečně dlouhý - V závislosti na implementaci imutability dochází k určitému množstí kopírování
Kdy použít Builder pattern n Vytváříme objekt n Cílový objekt se skládá z mnoha složitých podobjektů n Velká část parametrů je volitelná n Potřebujeme rozšiřitelnost objektu n Potřebujeme immutabilitu n Rule of thumb je použít builder při 4+ parametrech
Real world použití n Laravel query builder n Kendo UI builder
Související návrhové vzory n Builder může být určený k tvoření objektů podle patternu Composite, které bývají často komplexní a tudíž vhodné pro Builder n Pro jednoduší objekty začíná návrh často jako Factory metoda, ale časem může být potřeba postoupit ke složitějším creational vzorům n Builder můžeme implementovat jako Singleton
Souvislosti a důsledky n Struktura konečného produktu závisí na implementaci Concrete. Builderu Konkrétní implementační detaily skryté q Změna produktu -> nový builder q n Oddělení konstrukce od reprezentace q n Zapouzdření Konstrukce konečného produktu po krocích
Závěr n Builder odděluje konstrukci od reprezentace n Builder hraje roli konstruktoru n Builder umožňuje produktům být immutable n Builder krok po kroku definuje produkt n Director ovládá více Builderů a umožňuje implementovat předvolby
- Slides: 20