Co je ještě únavnějšího než psát stále stejný kód pro úklid v každém možném místě ukončení složité metody?
Ať už spravujete zavírání dokumentů, resetujete meziprocesní příznaky nebo uvolňujete zdroje, zajištění bezchybného provedení úklidových úkolů – bez ohledu na to, jak nebo kde vaše funkce skončí – vždy vyžadovalo pečlivé strukturální plánování. Pokud metoda neočekávaně skončí nebo narazí na předčasný návrat, zapomenutí jediného řádku úklidu může vést k únikům paměti nebo zablokovaným zdrojům.
Od verze 4D 21 R4 jsou tyto starosti minulostí. Seznamte se s novým příkazem defer: výkonným, moderním příkazem pro řízení toku, který byl navržen tak, aby váš kód 4D byl čistší, bezpečnější a mnohem elegantnější.
Pojďme se podívat, jak funguje a jak změní způsob, jakým píšete kód v 4D!
Co je příkaz defer?
Koncept je nádherně jednoduchý: příkaz defer vám umožňuje naskládat výraz, který se automaticky provede až po dokončení běhu aktuální metody nebo funkce.
Když tok provádění narazí na příkaz defer, nevykoná výraz hned. Místo toho jej bezpečně umístí do vyhrazeného interního„odloženého zásobníku“.
Kouzlo se stane, když vaše metoda nebo funkce skončí. Bez ohledu na to, jak se dokončí, 4D automaticky vytáhne všechny výrazy z odloženého zásobníku a provede je v pořadí LIFO (Last In, First Out).
Toto zaručené provedení se spustí ve všech scénářích ukončení:
- Normální dokončení: Když tok provádění skončí přirozeně.
- Předčasné ukončení: Když je nalezen a zpracován příkaz Return.
- Neočekávané přerušení: I když dojde k závažné chybě a uživatel potvrdí přerušení, 4D zajistí, že vaše odložené výrazy budou provedeny, aby se prostředí bezpečně vyčistilo.
Praktické příklady použití
Abychom si ukázali sílu příkazu defer, podívejme se na dva klasické příklady, kde tento příkaz radikálně zjednodušuje vývoj.
Bezchybná správa zdrojů
Při práci s externími zdroji, jako jsou stromy XML, databázové transakce nebo jiné, musíte zajistit, aby byly správně uzavřeny, abyste předešli únikům paměti. S příkazem defer můžete umístit kód pro alokaci a kód pro úklid vedle sebe:
var $root:
:= ("rootName")
( ( ))
Text
$rootDOM Create XML Ref
// Ensure the XML tree will be closed and memory freed, no matter what happens next!
deferDOM CLOSE XML$root
// Do something with the $root tree...
Obnovení stavu prostředí a databáze
Někdy je třeba, aby váš kód dočasně změnil globální parametr databáze nebo nastavení prostředí (například zapnutím podrobného diagnostického protokolování pro konkrétní složitou operaci) a zajistil, aby se poté vše vrátilo do původního stavu. Příkaz defer tuto obnovu stavu zvládá skvěle:
// Get the current state of diagnostic log recording
$logRecording:=Get database parameter(Diagnostic log recording)
// Temporarily enable it for this specific process/method
SET DATABASE PARAMETER (Diagnostic log recording; 1)
// Guarantee the original state is restored as soon as the method/function exits!
defer (SET DATABASE PARAMETER(Diagnostic log recording; $logRecording))
// Execute your complex or heavy operations here...
Bezpečné provedení již od návrhu
Tuto funkci jsme navrhli s ohledem na bezpečnost a robustnost. Nebudete se muset obávat, že selhání úklidové úlohy naruší výstupní tok vaší aplikace.
Pokud výraz provedený z odloženého zásobníku vyhodí chybu, 4D ji automaticky zachytí na pozadí bez jakéhokoli přerušení. Pokračuje plynule v provádění zbytku zásobníku a chová se přesně tak, jako by se výraz spouštěl uvnitř implicitního bloku try.
Aby byl váš kód přehledný a nedocházelo k nekonečným smyčkám nebo nepředvídatelnému chování, implementovali jsme také několik ochranných pravidel:
- Žádné vnoření: Pokud odložený výraz náhodou obsahuje další příkazy defer, jsou tyto vnořené výrazy jednoduše ignorovány.
- Žádné vnitřní návraty: Pokud je příkaz Return omylem volán uvnitř odloženého výrazu, nebude proveden.
Inteligentní vyhodnocení kontextu
Když se vaše odložené výrazy provádějí na samém konci metody/funkce, 4D hladce zpracovává kontext proměnných: standardní lokální proměnné si zachovávají hodnoty, které měly v okamžiku, kdy byly odloženy, zatímco proměnné procesu, lokální proměnné objektů a klasické záznamy odrážejí svůj konečný stav při dokončení metody/funkce.
Závěr
Příkaz defer, který je k dispozici od verze 4D 21 R4, je více než jen vylepšení pro větší pohodlí; je to strukturální vylepšení vašeho vývojového workflow. Seskupením inicializace a úklidu na začátku logiky se váš kód stává čitelnějším, lépe udržovatelným a odolnějším vůči neočekávaným přerušením běhu.
Jste připraveni psát čistší a bezpečnější aplikace 4D? Sdělte nám svůj názor na fóru 4D!
K tomuto příspěvku zatím nelze přidávat komentáře.