Návrhové vzory pro J2EE Miroslav Beneš
Obsah přednášky z z z z z z z
Význam návrhových vzorů Klasické návrhové vzory GoF Návrh prezentační vrstvy Business vrstva Vzory pro práci s daty Příklady dalších vzorů Záporné vzory
Návrhové vzory pro J2EE
2
Význam návrhových vzorů z
Stavební bloky pro konkrétní řešení. z
z
z z
inspirace mimo počítačový průmysl
Abstrakce technik řešení problémů, které se často opakují Zabraňují objevování již objeveného Zjednodušují komunikaci z
role jména návrhového vzoru
Návrhové vzory pro J2EE
3
Klasické návrhové vzory Gamma, Helm, Johnson, Vlissides: Design Patterns: Elements of Reusable Object Oriented Software, Addison-Wesley (Gang of Four, GoF) z z z z z z
Factory Command Decorator Composite Façade Value Object
- akce - filtry - UI - komponenty - Integer, Boolean, … Návrhové vzory pro J2EE
4
Návrh prezentační vrstvy z
Na straně klienta z
z
(X)HTML, CSS, JS
Na straně serveru
Požadavky z reakce na časté změny v zadání z rozšiřitelnost Návrhové vzory pro J2EE
5
Model-View-Controller z
Model z
z
View z
z
Stav aplikace Interpretace dat z modelu a jejich prezentace uživateli
Controller z z z
Zpracování vstupu od uživatele Aktualizace modelu Zobrazení nového pohledu na data Návrhové vzory pro J2EE
6
Model-View-Controller klient
<<servlet>> Controller
<<JSP page>> View
HTTP request
<<JavaBean>> Model
locate update
choose forward() useBean HTTP response
Návrhové vzory pro J2EE
7
Front Controller Pattern z
MVC nepředepisuje, kolik má být řídicích objektů z
Jeden pro každou obrazovku z z
z
Jeden pro celou aplikaci z
z
Obtížné změny Zařazení společných funkcí (logging, bezpečnost, …) Co se specifickými funkcemi?
Řeší se kombinací vzorů Front Controller, Command a Decorator Návrhové vzory pro J2EE
8
Front Controller Pattern z
z z
Jediné místo v aplikaci, zapouzdřující zpracování požadavku Provedení společných úkolů Přenesení řízení na specifický controller pro konkrétní stránku z z
z
Samostatné servlety Návrhový vzor Command (akce)
Implementace musí být co nejvíce efektivní Návrhové vzory pro J2EE
9
Decorator Pattern z z z z z
Kombinace více malých komponent do jednoho celku Třída obalující původní třídu a zachovávající její rozhraní Možnost řetězení dekorátorů Požadována nezávislost – problémy se správným pořadím dekorátorů J2EE: filtry (preprocesing a postprocesing požadavků) Návrhové vzory pro J2EE
10
Decorator Pattern Decorator1 uživatel
Request
Decorator2
FrontController
preprocess() doFilter()
preprocess() doFilter()
postprocess()
postprocess()
Response
Návrhové vzory pro J2EE
11
Vzory zajišťující efektivitu z
Caching z
Asynchronous Page Pattern z
z
asynchronní načítání dat z externích zdrojů (např. RSS)
Caching Filter Pattern z
z
Filtr zajišťující úschovu dynamicky generovaných stránek Pozor! Umístit až za filtr zajišťující bezpečnost (neautorizované čtení uschovaných stránek)
Návrhové vzory pro J2EE
12
Vzory zajišťující efektivitu z
Pooling z
Resource Pool Pattern z
z
z
Pool – vytváří (přes Factory), spravuje a řídí přístup ke zdroji Resource – řízený zdroj
Příklad: DB spojení z
Jakarta DBCP
Návrhové vzory pro J2EE
13
Komponenty business vrstvy z z
z z z
Strukturovaný model aplikačních dat Procedury pro přístup k aplikačně orientovaným činnostem Často komponenty sdílené více klienty Poskytují rámec pro transakce Poskytují mechanismus pro perzistenci aplikačních dat Návrhové vzory pro J2EE
14
Domain Object Model Pattern z z
Definice skutečných dat a procesů, které jsou spravovány a implementovány systémem Základní vzor většiny J2EE aplikací z z
z
Odstranění závislosti prezentační vrstvy na konkrétním uložení dat Jiná možnost: práce přímo s databází
Technologie z z
POJO – Plain Old Java Objects – nevyžadují kontejner EJB Návrhové vzory pro J2EE
15
Composite Entity Pattern z z
Také Entity Façade Pattern Varianty: z
Mapování každé databázové tabulky na třídu z
z
z
Složitější komunikace, větší režie
Jeden objekt reprezentuje data z více tabulek
Příklad: z
Osoba – kontakty
Návrhové vzory pro J2EE
16
Vzory pro práci s daty z
Příklad: Osoba a adresa z z
z
Osoba s položkami popisujícími adresu Osoba s vazbou na objekt Adresa
Základní problém: náklady na komunikaci z z z
z
Přenos dat po síti Serializace/deserializace dat Opakované vytváření a rušení instancí komponent Násobné dotazy do databáze Návrhové vzory pro J2EE
17
Data Transfer Object Pattern z
Získání skupiny datových položek jedním voláním z z
z
z
Naplnění a vrácení objektu přenášejícího data Rozhraní mezi prezentační a business vrstvou, resp. mezi různými komponentami business vrstvy
Zvýšení efektivity snížením komunikačních nákladů Zlepšení čitelnosti a struktury aplikace Návrhové vzory pro J2EE
18
Data Transfer Object (DTO) public class PatientDTO implements Serializable { public long pat_no = -1; public String fname = null; public String lname = null; public ArrayList addresses = new ArrayList(); } public PatientDTO getPatientDTO() { PatientDTO pat = new PatientDTO(); pat.pat_no = pat_no.longValue(); pat.fname = fname; pat.lname = lname; pat.addresses.add(home); pat.addresses.add(work); return pat; } Návrhové vzory pro J2EE
19
Data Transfer Hash Pattern z
Často se měnící požadavky z z
z
Svázání klienta a serveru stejnou verzí DTO Nutnost změny definice, chceme-li předávat více (či méně) dat
Využití Hashtable/HashMap pro uložení dat z
Potlačení typové kontroly v době překladu
Návrhové vzory pro J2EE
20
Databáze a datové vzory z
Možnost práce s více mechanismy perzistence z z
z z
Relační databáze + JDBC, JDO Textové a binární formáty, XML
Obecný pojem: datový zdroj Perzistence se nemá míchat s business logikou z
testování, závislost na konkrétních mechanismech perzistence, složitost Návrhové vzory pro J2EE
21
Data Access Object Pattern z
z
z
Oddělení kódu přistupujícího do databáze od zpracování dat Delegování zodpovědnosti za přístup do databáze na DAO, jenž pak komunikuje prostřednictvím DTO DAO je lokální objekt, neobsahuje žádnou logiku (jen metody get/set)
Návrhové vzory pro J2EE
22
Data Access Object (DAO) Business Object
uses
uses
uses
DAO
Persistence Mechanism
uses creates/reads
Presentation Object
uses
Data Object
Návrhové vzory pro J2EE
23
Další vzory pro datovou vrstvu z
Lazy Load z
z
IsDirty pattern z
z
Přístup k uloženým procedurám v SQL
Vzory pro práci s primárními klíči z
z
Ukládání dat podle potřeby
Procedure Access Object z
z
načítání dat podle potřeby
Generátory primárních klíčů
Vzory pro objektově relační mapování Návrhové vzory pro J2EE
24
Vzory na rozhraní business vrstvy z
Dva typy rozhraní z z
z
s tlustým klientem s prezentační vrstvou na straně serveru
Často jde o rozhraní Javy a starších technologií (legacy world) z
možnost postupného vylepšování nebo nahrazování zastaralých komponent Návrhové vzory pro J2EE
25
Business Delegate Pattern z
z z
Definice klientského objektu zajišťujícího komunikaci s business objektem Plní roli modelu v MVC Zapouzdřuje znalosti o tom, jak najít business objekt, připojit se k němu a komunikovat s ním z
z
lokální/vzdálená EJB komponenta, CORBA, webová služba apod.
Zpracovává různé zdroje výjimek a převádí je na sadu aplikačních výjimek Návrhové vzory pro J2EE
26
Příklad public class PatientManagementDelegate { public static PatientDTO createNewPatient(PatientDTO patient) throws InvalidPatientException { if( patient==null || patient.getFirstName()==null || patient.getLastName()== null ) throw new InvalidPatientException(“Full Name”); PatientDAO pDAO = PatientDAOFactory.getPatientDAO(); PatientDTO newPat = pDAO.createPatient(patient); return newPat; } Návrhové vzory pro J2EE
27
Session Façade Pattern z
Situace: K provedení jedné operace je třeba přistoupit současně k více EJB
z
Seskupení sady aktivit do session beanu, jehož voláním může klient zpracovat najednou celý případ Zapouzdřuje více session beanů, entity beanů a dalších služeb Zjednodušuje správu transakcí
z z
Návrhové vzory pro J2EE
28
Další vzory z
Vzory pro zajištění souběžného přístupu z z
z
Transakční zpracování Zamykání
Vzory pro zasílání zpráv z z z
Point-to-Point Distribution Pattern Publish-Subscribe Pattern Vzory pro směrování zpráv
Návrhové vzory pro J2EE
29
J2EE Antipatterns z z
Často se opakující chyby v návrhu Důvody jejich rozšíření: z z z
z
Malá zkušenost Nečitelný kód Cut-and-paste development
Typy z
Architektura
Návrhové vzory pro J2EE
30
Architectural Antipatterns z
Příliš mnoho vrstev z
z
Např. úplné ukrytí SQL před dalšími vrstvami; drahé činnosti vypadají jako levné
Leak Collection z
z
Zabránění úklidu dat tím, že data udržujeme ve vyrovnávací paměti Řešení: Soft reference
Návrhové vzory pro J2EE
31
Antivzory na prezentační vrstvě z
The Magic Servlet z z
z
Monolitické JSP z
z
jeden servlet udělá vše např. čtení telefonních čísel z databáze a jejich formátování do HTML podobné, vše v jednom JSP
Přeplněné session proměnné z
umisťování dočasných nebo komplexních dat do session Návrhové vzory pro J2EE
32
Antivzory pro EJB z
Všechno je EJB z z
z
Round-Tripping z z
z
EJB nejsou řešením všech problémů Poměr mezi cenou a získanými výhodami Nastává při přenosu velkého množství dat Posílání balíku dat po malých částech
Stateful When Stateless Will Do z
Ukládání nepotřebných informací Návrhové vzory pro J2EE
33
Závěr z
z
Mnoho uvedených vzorů je obecných – platí nejen pro J2EE, ale i pro .NET Další diskuse o vzorech: z z
z
www.theserverside.com www.theserverside.net
Literatura: Crawford, W., Kaplan, J.: J2EE Design Patterns. O’Reilly, 2003, ISBN 0-596-00427-3
Návrhové vzory pro J2EE
34