Lazy load Použity informace z knihy Patterns of Enterprise Application Architecture od M. Fowlera Jan Sládek
Motivace Všichni to známe... Lazy load Zdroj: http://sliptalk.s3.amazonaws.com/wp-content/uploads/2014/08/12150537/lazy-25.png Všichni to známe... Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Motivace Příklad: Seznam objednávek - načteme pouze nutné minimum Lazy load - načteme pouze nutné minimum - ale víme, kam sáhnout pro doplňující data Příklad: Seznam objednávek Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Motivace Příklad: Seznam objednávek - objednávka může obsahovat Lazy load Příklad: Seznam objednávek - objednávka může obsahovat cenu, jméno zákazníka, odkaz na další objednávky zákazníka náhledy produktů v objednávce ... Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Motivace Příklad: Seznam objednávek Lazy load Příklad: Seznam objednávek - opravdu budeme to vše předem stahovat / načítat z databáze? - raději si jen připravíme přístupové metody a vyčkáváme – třeba nic z toho nebudeme potřebovat Zdroj: http://globe-views.com/dcim/dreams/smile/smile-01.jpg Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Myšlenka Příklad: Seznam objednávek Lazy load Příklad: Seznam objednávek Pokud pracujeme s objektem, jsme líní - nestahujeme hned vše, co s ním souvisí Pro informace si sáhneme až v případě, kdy je potřebujeme (např. zobrazit?) Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Myšlenka Příklad: Seznam objednávek Lazy load Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Lazy initialization (nejjednodušší) Virtual proxy Value holder Ghost O vzoru Lazy load Existují 4 typy lazy load: Lazy initialization (nejjednodušší) Virtual proxy Value holder Ghost Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Je prvek NULL? Načteme ho Jinak ho vrátíme Typy vzoru Lazy load 1) Lazy initialization Je prvek NULL? Načteme ho Jinak ho vrátíme Co se může pokazit? Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Problém 1: NULL je povolená hodnota v databázi Typy vzoru Lazy load 1) Lazy initialization Problém 1: NULL je povolená hodnota v databázi Je prvek opravdu nenačten? Nebo jsme ho načetli, a je prázdný? Řešení Special Case (Null Object) + Flyweight MissingOrder, UnknownOrder... Source: http://sliptalk.s3.amazonaws.com/wp-content/uploads/2014/08/12150537/lazy-25.png Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru Lazy initialization Problém 2 Lazy load Jan Sládek Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru Lazy initialization Problém 2 Lazy load Jan Sládek Architektury Softwarových Systémů, FEL ČVUT
Problém 2: Zapomeneme použít getter Typy vzoru Lazy load 1) Lazy initialization Problém 2: Zapomeneme použít getter Pokud nepoužijeme getter, ale přímo atribut třídy, inicializace neproběhne Řešení Pro vnější přístup – zapouzdření Pro vnitřní přístup ? Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Je prvek příliš složitý? Vytvoříme pro něj kostru/náhled Typy vzoru Lazy load 2) Virtual proxy Je prvek příliš složitý? Vytvoříme pro něj kostru/náhled Co se může pokazit? Source: http://sliptalk.s3.amazonaws.com/wp-content/uploads/2014/08/12150537/lazy-25.png Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Problém: Dvojí identita téhož objektu Typy vzoru Lazy load 2) Virtual proxy Problém: Dvojí identita téhož objektu Virtual proxy se sice chová jako zastupovaný objekt, ale má jiný hashcode Pro jeden objekt může dokonce existovat více proxy! Řešení Překrýt metodu equals() - nutné minimum Neporovnávat pomocí == Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru 3) Value holder Lazy load 3) Value holder Pro každou informaci si sáhneme pouze jednou Uložíme je do zvláštního objektu Jaké to přináší problémy? Source: http://sliptalk.s3.amazonaws.com/wp-content/uploads/2014/08/12150537/lazy-25.png Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Problém: Ztráta silné typovosti Typy vzoru Lazy load 3) Value holder Problém: Ztráta silné typovosti Pokud vytvoříme univerzální holder, pracujeme uvnitř něj s generickými parametry, nikoli přímo s typy Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru 4) Ghost Lazy load Po načtení z DB má objekt pouze ID Ostatní atributy se načtou až když k nim přistoupíme ID: 1051 Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru 4) Ghost Lazy load Vychází z: Lazy inicializace – vše kromě ID je lazy inicializováno (najednou) Virtual proxy – objekt je svým vlastním proxy Vychází z: Lazy inicializace – vše kromě ID je lazy inicializováno (najednou) Virtual proxy – objekt je svým vlastním proxy Rozšíření: Light object Pokud má objekt další často používané atributy (např. název), načteme je společně s ID – vznikne Light object Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru 4) Ghost – implementace (Data Mapper) Lazy load Zdroj: Patterns of Enterprise Applications Architecture, M. Fowler Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Typy vzoru 4) Ghost – implementace (Data Mapper) Lazy load Zdroj: Patterns of Enterprise Applications Architecture, M. Fowler Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Na co si dát pozor Na co si dát pozor u Lazy load Ripple loading Prohlížíme lazy loaded objekty po jednom – každé zobrazení pak znamená zvláštní dotaz do databáze Bez lazy loadu bychom načetli všechny objekty „jednou ranou“, pokud nejsou přílíš rozsáhlé - a při zobrazení uživatel nečeká - může být výhodnější Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Doplnění k Lazy load Identity table Výhody: Uložíme si všechna ID určité sady objektů do hashovací tabulky Při dotazu na tuto sadu: - projdeme tabulku - načteme objekty na základě ID - sestavíme a vrátíme kolekci Výhody: - objekty budou vždy aktuální - ušetříme dotaz na databázi pro získání sady Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Související vzory Související vzory Lazy load Singleton Data Mapper Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Příklad implementace – Value holder Lazy load 1) Bez lazy loadu Provede se vždy Architektury Softwarových Systémů, FEL ČVUT Jan Sládek
Příklad implementace – Value holder Lazy load 2) S lazy loadem Provede se pouze napoprvé Architektury Softwarových Systémů, FEL ČVUT Jan Sládek