Formula: Più potenza dietro la semplicità

Tradotto automaticamente da Deepl

Il comando Formula è disponibile da 4D v17 R3. Finora avete pensato di assegnare una formula come metodo a un oggetto o di costruire oggetti intelligenti in grado di calcolare valori o di fare tutto ciò che vi serve. È davvero fantastico e c’è molto di più di quello che si vede!

Vincent de Lachaux, sviluppatore ed esperto di 4D, mi ha dato una grande dimostrazione di come utilizza questo comando. Per questo post sul blog, ho raccolto diversi scenari da quella dimostrazione per darvi un’idea di una diversa dimensione di questo comando.

Esempio 1 – Semplificare un comando esistente

Alcuni comandi 4D vengono utilizzati centinaia di migliaia di volte nel codice.Spesso passiamo gli stessi parametri, tranne uno.

Prendiamo il semplice esempio del comando OBJECT get pointer. Voglio inizializzare i valori delle mie caselle di controllo, quindi scrivo:

(OBJECT get pointer(Object named; "checkbox"))->:=0

Oppure, scrivo una formula che prende come parametro il nome del mio oggetto:

interface.pointer:=Formula(OBJECT Get pointer(Object named;$1))

Quando voglio assegnare o recuperare il valore della mia casella di controllo, scrivo semplicemente:

(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0

Oppure, se devo impostare migliaia di caselle di controllo, posso creare una formula per semplificare le cose:

interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)

Per impostare una serie di caselle di controllo, posso semplicemente scrivere:

interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("checkbox4";1)

Più facile da leggere e molto più facile da scrivere, dato che non ho bisogno di contare le parentesi…

Esempio 2 – Con un parametro di database

Nel vostro codice, impostate più volte lo stesso parametro del database con valori diversi. Facciamo un esempio concreto con i suggerimenti per il controllo del ritardo. Potreste voler visualizzare i suggerimenti senza ritardo in alcune parti dei vostri moduli e attendere 1s in altre parti. Ogni volta che si utilizza il parametro del database, è necessario ricordare il valore o cercarlo in un altro pezzo di codice.

Perché non creare una formula?

interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1))
interface .tips1sDelay:=Formula(SET DATABASE PARAMETER(Tips delay;60))

Poi, quando si vuole cambiare il valore, basta richiamare la formula:

interface.tips1sDelay()
// or

interface .tipsNoDelay()

Esempio 3 – Utilizzare la formula come variante

È possibile creare una formula che utilizzi i valori passati come parametri di un metodo( ad esempio $1, $2) ma, nel metodo in cui si crea la formula, non è necessario digitare $1 e $2. Le variabili vengono digitate quando la formula viene eseguita. È possibile scrivere metodi o formule generiche.

Ecco un semplice esempio che mostra come il tipo sia definito al momento dell’esecuzione.

$obj:=New object("aggiunta";Formula($1+$2))

$number :=$obj.addition(1;2) // restituisce 3
$text :=$obj.addition("ciao "; "mondo") // restituisce ciao mondo

Esempio 4 – Testare una serie di condizioni

Se si crea una sequenza di condizioni, come If (() & ()), 4D valuta sempre tutte le condizioni. Non si ferma e continua a valutare quelle successive. Se alcune condizioni possono essere valutate solo se quelle più a sinistra sono vere, si è costretti a creare un elenco annidato di condizioni if, per verificare se l’oggetto è valido prima di testare l’attributo. Ecco come funziona:

If (Not(Undefined($o))
If ($o.value#Null)
If ($o.value<5)
// to do
End if
End if
End if

In questo esempio, avevamo “solo” 3 condizioni, ma si può facilmente notare che diventa sempre più complesso. Che ne dite di scrivere tutto in un’unica condizione? Perché non scrivere un metodo che esegua le formule una dopo l’altra? Se il risultato è Vero, si valuta la formula seguente, se il risultato è Falso, ci si ferma e si restituisce Falso.

If (_AND (\
Formula (Not(Undefined($o)));\
Formula ($o.value#Null);\
Formula ($o.value<5)\
))
// to do
End if

Per il metodo _AND, codice molto usuale e semplice:

$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1 // Stop if the condition fails
End if
End for

Spero che questi esempi vi diano indicazioni su altri modi di usare questo comando. Sentitevi liberi di condividere le vostre formule sul forum 4D… Sono sicuro che avete molte idee!

Vanessa Talbot
- Product Owner - Vanessa Talbot è entrata a far parte del team di 4D Program nel giugno 2014. In qualità di Product Owner, è incaricata di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo ruolo è anche quello di assicurarsi che l'implementazione della funzionalità fornita soddisfi le esigenze del cliente. Ha lavorato sulla maggior parte delle nuove funzionalità di multi-threading preemptive e anche su un argomento molto complesso: la nuova architettura per le applicazioni con motore. Vanessa si è laureata presso Telecom Saint-Etienne. Ha iniziato la sua carriera presso il Criminal Research Institute come sviluppatrice per il dipartimento audiovisivo. Ha lavorato anche nei settori dei media e della medicina come esperta di supporto tecnico, produzione e documentazione di nuove funzionalità.