Serve una bacchetta magica? Ecco le proprietà di classe calcolate!

Tradotto automaticamente da Deepl
L’apparizione delle classi nell’ambiente di sviluppo 4D ha reso la programmazione più moderna e più facile da scalare. Le classi consentono di definire proprietà e funzioni e supportano anche l’ereditarietà.
Nella vostra applicazione, probabilmente avete una classe per gestire dati scientifici o finanziari. Facciamo l’esempio dei dati finanziari. Supponiamo che abbiate creato delle funzioni per calcolare le tasse. Se gestite anche diversi Paesi, potreste aver utilizzato l’ereditarietà per gestire le diverse regole. Quindi, si visualizzano i risultati in una casella di riepilogo, ma se l’utente modifica uno degli attributi utilizzati nella formula, è necessario gestire questo evento per aggiornare il risultato.
Con 4D v19 R3, 4D consente di semplificare questo processo grazie alle proprietà calcolate: È possibile definire una funzione get e set per la proprietà calcolata e, quando si aggiunge la proprietà a una casella di riepilogo, tutto viene gestito automaticamente da 4D. Niente più logica aziendale nell’interfaccia utente.

Proprietà calcolate HDI

Definizione e calcoli

Per spiegare la potenza di questo concetto, cerchiamo di semplificarlo al massimo e di iniziare con un esempio concreto:
Una classe “Rettangolo” contiene due attributi, width and height, e può includere funzioni come getSurface() e getPerimeter(), che possono essere utilizzate.
Tuttavia, non sarebbe meglio se surface e perimeter fossero viste come proprietà normali, proprio come le altre? Proprietà che possono essere lette ed eventualmente modificate? E le altre proprietà da cui dipendono potrebbero essere modificate automaticamente. Bene, ora è possibile grazie alle proprietà calcolate.

Magia!

Ecco due esempi semplici. In entrambi i casi, tutti gli attributi possono essere inseriti.

Quando si modificano le proprietà width o height, le proprietà perimeters e surfaces vengono ricalcolate. È vero anche il contrario: modificando surface o perimeter,, widths e heights varieranno di conseguenza.

blank

Questo funziona anche nelle caselle di riepilogo! Che possono comunque essere ordinate su qualsiasi colonna!
blank

Dov’è la magia?

In entrambi i casi, non c’è alcuno script dietro le quinte! Tutti i calcoli sono definiti una volta per tutte all’interno della classe Rectangle! Ecco quindi un grande vantaggio: se avete bisogno di altri moduli che utilizzano questi attributi, non dovrete scrivere alcun codice (proprio come sopra).

Vediamo come si fa!

Accesso alle proprietà COMPUTED

OTTENERE

La prima funzione, “get”, consente di definire come viene calcolata la proprietà. A tale scopo, deve restituire il risultato del calcolo.
Questa funzione è l’unica obbligatoria e determina con la sua sola presenza l’esistenza della proprietà calcolata e la possibilità di utilizzarla.

The function gets surface è definita all’interno della classe Rectangle.

Function get surface() -> $surface: Reale
$surface := This.width * this.altezza

Una volta scritta la funzione di cui sopra, è ora possibile utilizzare la proprietà surface come una normale proprietà!

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

IMPOSTAZIONE

La seconda funzione, “set”, se esiste, gestirà la modifica di una proprietà calcolata. La modifica della superficie consentirà di ricalcolare il valore della larghezza e dell’altezza del rettangolo.

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

// mantenere il rapporto larghezza-altezza
$ratio :=This.width/This.height

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

Una volta scritte le funzioni di cui sopra, è ora possibile modificare la proprietà surface come una proprietà regolare! Gli attributi width e height saranno modificati di conseguenza.

//Let's create a rectangle who's original width and height are 60x20
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // ottenere la proprietà surface

ALERT ("La superficie di questo rettangolo è: " +String($surface)) // restituisce 120
// Modifichiamo la superficie
$rect .surface:=1000
// Poi visualizziamo le nuove larghezza e altezza
$width :=$rect.width
$height:=$rect.height
ALERT ("Il rettangolo ora è: "+String($width)+" x "+String($height)) // restituisce 54,77 x 18,25

Interrogazioni e ordinamenti…

Le collezioni di oggetti di classe Rectangle possono essere interrogate e ordinate utilizzando le proprietà calcolate!

Esempio di interrogazione:

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

Esempio di OrderBy:

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

…e JSON

Quando si utilizza un oggetto con proprietà calcolate, queste proprietà saranno considerate quando lo si “stringerà”.

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

blank

Conclusione

Questo semplice esempio dimostra che è possibile eseguire operazioni complesse, ma la complessità rimarrà nascosta.
Inoltre, consente di controllare meglio la pubblicazione dei dati in base ai contesti, ai diritti degli utenti e così via, poiché le regole possono essere definite all’interno della classe stessa.
Benvenuti in un modo moderno di programmare!
Per maggiori dettagli, leggete questa documentazione.
Roland Lannuzel
- Product Owner ed esperto di 4D - Dopo aver studiato elettronica, Roland è passato all'IT industriale come sviluppatore e consulente, realizzando soluzioni per i clienti con una varietà di database e tecnologie. Alla fine degli anni '80 si è innamorato di 4D e lo ha utilizzato per scrivere applicazioni aziendali che includono sistemi di contabilità, fatturazione e posta elettronica. Entrato a far parte dell'azienda nel 1997, Roland ha dato il suo prezioso contributo progettando specifiche, strumenti di test e demo, oltre a formare e parlare alla comunità 4D in occasione di numerose conferenze. Continua a plasmare attivamente il futuro di 4D definendo nuove funzionalità e strumenti di sviluppo di database.