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!