Potřebujete kouzelnou hůlku? Zde jsou vypočtené vlastnosti tříd!

Automaticky přeloženo z Deepl
Vznik tříd ve vývojovém prostředí 4D umožnil modernější programování a jeho snadnější škálování. Třídy umožňují definovat vlastnosti, funkce a podporují také dědičnost.
Ve své aplikaci máte pravděpodobně třídu pro správu vědeckých nebo finančních dat. Vezměme si příklad finančních dat. Řekněme, že jste vytvořili funkce pro výpočet daní. Pokud také spravujete několik zemí, možná jste použili dědičnost pro správu různých pravidel. Pak tyto výsledky zobrazíte v seznamu, ale pokud uživatel změní jeden z atributů použitých ve vzorci, musíte tuto událost spravovat, abyste výsledek aktualizovali.
Aplikace 4D v19 R3 umožňuje tento proces zjednodušit díky vypočteným vlastnostem: Když přidáte svou vlastnost do pole se seznamem, 4D vše vyřídí automaticky. Žádná další obchodní logika ve vašem uživatelském rozhraní.

HDI Vypočtené vlastnosti

Definice a výpočty

Abychom vysvětlili sílu tohoto konceptu, udělejme to co nejjednodušší a začněme konkrétním příkladem:
Třída „Rectangle“ obsahuje dva atributy, width and height, a mohla by obsahovat funkce jako getSurface() a getPerimeter(),, které by se případně daly použít.
Nebylo by však lepší, kdyby se na surface a perimeter pohlíželo jako na běžné vlastnosti, stejně jako na ostatní? Vlastnosti, které lze číst a případně upravovat? A ostatní vlastnosti, na kterých jsou závislé, by se také mohly automaticky upravovat. No, nyní je to možné díky vypočteným vlastnostem.

Kouzlo!

Zde jsou dva přímočaré příklady. V obou případech lze zadat všechny atributy.

Když změníte vlastnosti width nebo height, přepočítají se vlastnosti perimeters a surfaces. Platí to i obráceně: změňte surface nebo perimeter, a widths a heights se podle toho změní.

blank

To funguje i v rámci seznamových polí! Které lze stále řadit podle libovolného sloupce!
blank

V čem spočívá kouzlo?

V obou případech není za scénou žádný skript! Všechny výpočty jsou definovány jednou provždy v rámci třídy Rectangle! Zde je tedy velká výhoda: pokud budete potřebovat více formulářů využívajících tyto atributy, nebudete muset psát žádný kód (stejně jako výše).

Podívejme se, jak se to dělá!

Přístup k vlastnostem COMPUTED

GET

První funkce, „get“, umožňuje definovat způsob výpočtu vlastnosti. Pro tento účel musí vrátit výsledek výpočtu.
Tato funkce je jediná povinná a svou pouhou přítomností určuje existenci vypočtené vlastnosti a možnost jejího použití.

The function gets surface je definována uvnitř třídy Rectangle.

Function get surface() -> $surface: Real
$surface := This.width * this.height

Po zapsání výše uvedené funkce můžete nyní vlastnost surface používat jako běžnou!

$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // get the surface property
ALERT("The surface of this rectangle is: "+String($surface))

SET

Druhá funkce „set „, pokud existuje, bude spravovat změnu vypočtené vlastnosti. Změna povrchu umožní přepočítat hodnotu šířky a výšky obdélníku.

// this function will be called when surface is modified
Function
set surface
($surface)

// zachovat poměr šířky a výšky
$ratio :=This.width/This.height

This
.height:=Square root($surface/$ratio)
This .width:=Square root($surface*$ratio)

Po napsání výše uvedených funkcí můžete nyní upravit vlastnost surface jako běžnou! Atributy width a height budou odpovídajícím způsobem upraveny.

//Let's create a rectangle who's original width and height are 60x20
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // získáme vlastnost povrchu

ALERT ("Povrch tohoto obdélníku je: "+String($surface)) // vrátí 120
// Upravíme povrch
$rect .surface:=1000
// Pak zobrazíme novou šířku a výšku
$width :=$rect.width
$height:=$rect.height
ALERT ("Obdélník je nyní: "+String($width)+" x "+String($height)) // vrátí 54,77 x 18,25

Dotazy a třídění…

Na kolekce naplněné objekty třídy Rectangle se lze dotazovat a třídit pomocí vypočtených vlastností!

Ukázka dotazu:

myRectangles:=myRectangles.query("perimeter < 200")

Ukázka OrderBy:

myRectangles:=myRectangles.orderBy("perimeter desc")

…a JSON

Pokud použijete objekt s vypočtenými vlastnostmi, budou tyto vlastnosti zohledněny při jeho „řetězení“.

$rect:=cs.Rectangle.new(30; 40)
ALERT (JSON Stringify($rect;*))

blank

Závěr

Tento jednoduchý příklad ukazuje, že je možné provádět složité operace, ale složitost zůstane skryta.
Umožňuje také lepší kontrolu nad zveřejňováním dat podle kontextů, uživatelských práv atd. protože pravidla lze definovat v rámci samotné třídy.
Vítejte v moderním způsobu programování!
Podrobnější informace naleznete v této dokumentaci.
Roland Lannuzel
- Product Owner & 4D Expert - Po studiu elektroniky se Roland věnoval průmyslovým IT jako vývojář a konzultant, který vytvářel řešení pro zákazníky s různými databázemi a technologiemi. Koncem 80. let se zamiloval do 4D a používal jej při psaní podnikových aplikací, které zahrnovaly účetní, fakturační a e-mailové systémy. nakonec se připojil ke společnosti v roce 1997 a Rolandův cenný přínos zahrnuje návrh specifikací, testovacích nástrojů, demoverzí a také školení a přednášky pro komunitu 4D na mnoha konferencích. Nadále aktivně utváří budoucnost 4D definováním nových funkcí a nástrojů pro vývoj databází.