V tomto předchozím příspěvku na blogu jste zjistili, že subjekty ORDA mohou mít nyní constructor, což umožňuje, aby se instanciace entit řídila kompletním objektově orientovaným přístupem.
A to není vše – v dalším příspěvku na blogu byla představena první datová událost ORDA v celé řadě: událosttouched .
Chcete přesně vědět, KDY a KDE se constructor a událosttouched jsou spouštěny při přesunech akcí tam a zpět mezi klientskou aplikací a serverem? Tento blogpost je určen právě vám.
Čtěte dál, abyste se dozvěděli všechny podrobnosti a prohlédli si živou ukázku!
Pokud jste ještě neprozkoumali constructors a událosttouched , nečekejte – přečtěte si výše zmíněné blogposty. Vysvětlují, jak by měla implementace probíhat.
před zahájením
Tyto dvě funkce jsou součástí komplexní, výkonné a optimalizované abstrakční vrstvy ORDA. Pro osvěžení paměti si můžete přečíst tento blogpost a tento blogpost .
Pomocí tříd datového modelu ORDA se s daty pracuje prostřednictvím entit, což jsou instance tříd Entity definované ve vaší struktuře.
ORDA lze použít ve více typech aplikací:
- aplikace typu klient/server (C/S)
- aplikace Qodly
- aplikace využívající rozhraní REST API
- aplikace využívající vzdálené datové úložiště
Kde?
Níže uvedená tabulka shrnuje, KDE constructor a touched jsou prováděny události:
| Kde se provádí | C/S (1) | Stránka Qodly (2) REST API (3) Vzdálené datové úložiště (4) |
|---|---|---|
| Konstruktor | Klient | Server |
| Dotčená událost |
Pokud je lokální klíčové slovo: klient |
Server |
(1): Projekt je nasazen na instanci serveru 4D a vzdálení klienti 4D k němu přistupují prostřednictvím síťového připojení. Datové operace mohou probíhat buď na klientovi, nebo na serveru.
(2): Projekt je nasazen na instanci 4D serveru a weboví klienti s ním komunikují prostřednictvím webového prohlížeče. Aplikace Qodly konzumuje rozhraní REST API projektu.
(3): Jakákoli externí aplikace může konzumovat rozhraní REST API vaší aplikace 4D pomocí standardních požadavků REST.
(4): Aplikace 4D se může připojit k jednomu nebo více vzdáleným datovým skladům, což umožňuje přístup k více zdrojům dat. V tomto případě se ke zpracování operací se vzdálenými daty používá ORDA.
Kdy?
Zbytek tohoto blogpostu se zaměřuje na to, KDY se constructor a událosttouched jsou prováděny.
Z důvodů optimalizace a výkonu se constructor nemusí být nutně provedena ihned při instanci nové entity. Totéž platí pro událosttouched . Nemusí být nutně provedena okamžitě, když je aktualizován atribut.
Ponořme se do specifik pro jednotlivé typy aplikací.
samostatná aplikace
V samostatné aplikaci je projekt uložen na místním disku. K přístupu k datům není potřeba žádné síťové připojení, takže všechny operace s daty se provádějí lokálně a okamžitě.
Vše je přímočaré: . constructor a událosttouched se spustí okamžitě, když je instancována nová entita nebo když se změní hodnota atributu.
rest api
Tento případ je jednoduchý: protože všechny akce s entitami se provádějí prostřednictvím požadavků REST na server, je jak constructor i událosttouched jsou na serveru spuštěny, jakmile je požadavek spuštěn.
klient server aplikace
konstruktor
Pokud je na klientovi instancována nová entita, pak se constructor spustí na klientovi.
To znamená, že počáteční hodnoty přiřazené atributům jsou pro klienta okamžitě viditelné. Později, když je volána funkce zahrnující tuto entitu(např. funkce, která přijímá entitu jako parametr), server obdrží entitu s jejími atributy inicializovanými na klientovi (1).
Funkce může být jednou z funkcí rozhraní ORDA API nebo funkcí datového modelu ORDA.
(1) Nezapomeňte, že funkce ORDA jsou vždy prováděny na serveru.

dotýkaná událost
Ve výchozím nastavení se událost touched spouští na serveru, ale klíčové slovo local umožňuje spustit ji místo toho na klientovi.
Bez klíčového slova local:
V tomto příkladu je funkce apply() fiktivní funkcí, která slouží pouze k tomu, aby aktualizace provedené na entitě na klientovi byly viditelné na serveru.

S klíčovým slovem local:

qodly app
Obě stránky constructor i událosttouched se provedou na serveru – jakmile se server dozví o nově instancované entitě nebo o změně atributu.
Při vykreslování běží stránka Qodly ve webovém prohlížeči, ale kdykoli nějaká akce vyžaduje logiku na straně serveru, jsou požadavky odeslány prostřednictvím rozhraní REST API na server 4D.
Konstruktor
Pokud instancujete novou entitu pomocí standardní akce Create:

dojde k tomu lokálně na front end. Konstruktor se tedy neprovádí okamžitě. Spustí se, jakmile server zjistí novou instancovanou entitu.
V tomto příkladu je funkce apply() fiktivní funkcí, která slouží pouze k tomu, aby aktualizace provedené na entitě na klientovi byly viditelné na serveru.

Poznámka:
Pokud front end instancuje novou entitu pomocí standardní akce Create a nastaví hodnotu atributu použitého v konstruktoru, nebude tato hodnota přepsána konstruktérem při spuštění na serveru.

Na druhou stranu, pokud je entita instancována prostřednictvím funkce na straně serveru, konstruktor se na serveru spustí okamžitě. Vrácený zdroj Qodly (entita) bude obsahovat atributy inicializované konstruktorem.

Dotčená událost
Událosttouched se na serveru spustí, jakmile server zjistí změnu hodnoty atributu.
V tomto příkladu je funkce apply() fiktivní funkcí, která slouží pouze k tomu, aby aktualizace provedené na entitě na klientovi byly viditelné na serveru.

použití vzdáleného úložiště dat
Funguje to podobně jako aplikace Qodly, protože použití vzdáleného datového úložiště spouštípožadavky interně pomocí rozhraní REST API. Pokud je vmístní aplikaci 4D instancována nová entita. constructor spustí, jakmile se o ní server dozví.
Totéž platí pro událosttouched – pokud je vmístní aplikaci 4D aktualizována entita, spustí se, jakmile server zjistí změnu v atributech entity.
příklad č. 1
Ve třídě ProductsEntity je implementována stránka constructor.
Class extends Entity
Class constructor()
This.creationDate:=Current date()
This.comment:="Automatic comment"
Provede se tento kód:
var $connect:={hostname: "127.0.0.1"}
var $remote : 4D.DataStoreImplementation
var $product : 4D.Entity
var $status : Object
$remote:=Open datastore($connect; "demo")
// The constructor has not been executed yet
// The creationDate and comment attributes are empty
$product:=$remote.Products.new()
// Here the constructor is run because the save() is done on the server
// The server detects it is a newly instantiated entity
// The creationDate and comment attributes are filled
$status:=$product.save()
příklad #2
Ve třídě ProductsEntity je implementována událosttouched a funkce apply():
Class extends Entity
Function event touched comment($event : Object)
This.comment:=Uppercase(This.comment)
exposed Function apply() : cs.ProductsEntity
return This
Tento kód se provede:
var $connect:={hostname: "127.0.0.1"}
var $remote : 4D.DataStoreImplementation
var $product : 4D.Entity
$remote:=Open datastore($connect; "demo")
$product:=$remote.Products.all().first()
// The comment attribute is not uppercased
$product.comment:="New comment"
// Because the apply() function is called on the server
// the touched event is triggered
// and the comment attribute is now uppercased
$product:=$product.apply()
Hrajte si s přiloženým HDI a vyzkoušejte si tyto příklady naživo!
