Lazy loading je proces, kdy v kódu předpokládáte práci s nějakým databázovým objektem, ale nechcete ho tahat z databáze hned, protože nevíte dopředu, zda ho skutečně budete potřebovat. Máte tedy připraven kontejner v podobě nějakého objektu, a pokud je volán, tak se poprvé natáhne do paměti jako nová instance a v dalších voláních už pracujete s touto konkrétní instancí.
Implementace v Lotusscriptu v prostředí Lotus Notes je jednoduchá. Uvažujme nějaké uživatelské profily, které umožňují každému uživateli nastavit si zástupce po dobu nepřítomnosti. Uživatel si vybere zástupce z adresáře a nastaví od kdy do kdy nebude v práci; kdy tedy platí tento zástup.
Náš skript zpracovává nějaké workflow a tento uživatel je na řadě jako aktuální participant. Jenže než mu ten úkol předhodíme, musíme zkontrolovat, zda je zastupován nebo ne. To musíme udělat pro každého aktuálního participanta, na kterého ve workflow narazíme.
První, co nás napadne – budeme pokaždé dělat lookup na požadovaný dokument.
Pak nás napadne, že natáhneme všechny uživatelské profily, uděláme resolve zastupování a uložíme ty aktivní do nějaké kolekce.
Oba způsoby jsou možné, ale oba jsou náročné. V prvním případě děláme lookup v pohledu pokaždé, když je potřeba dohledat jméno. V druhém způsobu zase pracujeme se zbytečně velkou kolekcí dat, ze kterých třeba ani většinu nevyužijeme.
Třetí způsob je Lazy loading. Připravíme si prázdnou kolekci a při každém jménu nakoukneme nejprve do ní a pak, pokud tam jméno nenajdeme, zavoláme lookup a nalezený dokument uložíme do kolekce.
Pro implementaci použijeme naší oblíbenou Collection pro kolekci profilů a CollectionItem jako wrapper jednoho profilu. CollectionItem rozšíříme o NotesName a uděláme z něj generický objekt User. Ten pak rozšíříme o SubstituteName, DateFrom a DateTo a uděláme z něj objekt UserProfile.
Kolekci si zapouzdříme do objektu UserSubstitutionManager, kde instanciujeme i poslední objekt, kterým je UserProfileLoader.
A to je vše. Volání pak může vypadat takto:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Dim substitutionManager As New UserSubstitutionManager
Dim participant As NotesName
Dim currentUser As String
Let currentUser = "Pepa Zdepa/user/test"
If substitutionManager.Init Then
If substitutionManager.IsSubstitutionEnabled(currentUser) Then
Set participant = New NotesName(substitutionManager.GetSubstituteName(currentUser))
Else
Set participant = New NotesName(currentUser)
End If
End If |
Komentování je uzavřeno.