Formule : Plus de puissance derrière la simplicité

Traduit automatiquement de Deepl

La commande Formula est disponible depuis 4D v17 R3. Jusqu’à présent, vous avez peut-être pensé à affecter une formule comme méthode à un objet ou à construire des objets intelligents capables de calculer des valeurs ou de faire tout ce dont vous avez besoin. C’est vraiment génial, et il y a plus que ce que l’on croit !

Vincent de Lachaux – Développeur et expert 4D – m’a fait une excellente démonstration sur la façon dont il utilise cette commande. Pour cet article de blog, j’ai compilé différents scénarios de cette démonstration pour vous donner un aperçu d’une dimension différente de cette commande.

Exemple 1 – Simplifier une commande existante

Certaines commandes 4D sont utilisées des centaines de milliers de fois dans le code. Nouspassonssouvent lesmêmes paramètres, sauf un.

Prenons l’exemple simple de la commande OBJECT get pointer. Je veux initialiser les valeurs de mes cases à cocher, donc j’écris :

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

Ou bien, j’écris une formule qui prend le nom de mon objet comme paramètre :

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

Lorsque je veux assigner ou récupérer la valeur de ma case à cocher, j’écris simplement :

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

Ou, si je dois définir des milliers de cases à cocher, je peux créer une formule pour simplifier les choses :

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

Pour définir une série de cases à cocher, je peux simplement écrire :

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

Plus facile à lire – et beaucoup plus facile à écrire, puisque je n’ai pas besoin de compter les parenthèses…

Exemple 2 – Avec un paramètre de base de données

Dans votre code, définissez plusieurs fois le même paramètre de base de données avec des valeurs différentes. Prenons un exemple concret avec les conseils de contrôle des délais. Vous pouvez vouloir afficher les conseils sans délai dans certaines parties de vos formulaires, et attendre 1s dans d’autres parties. Chaque fois que vous utilisez le paramètre de la base de données, vous devez vous souvenir de la valeur ou la rechercher dans un autre morceau de code.

Pourquoi ne pas créer une formule ?

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

Ensuite, lorsque vous souhaitez modifier la valeur, il vous suffit d’appeler la formule :

interface.tips1sDelay()
// or

interface .tipsNoDelay()

Exemple 3 – Utiliser la formule comme variante

Vous pouvez créer une formule qui utilise les valeurs transmises comme paramètres d’une méthode( c’est-à-dire $1, $2) mais, dans la méthode dans laquelle vous créez votre formule, vous n’avez pas besoin de taper $1 et $2. Les variables sont tapées lorsque la formule est exécutée. Vous pouvez écrire des méthodes ou des formules génériques.

Voici un exemple simple montrant que le type est défini à l’exécution.

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

$number :=$obj.addition(1;2) // renvoie 3
$text :=$obj.addition("hello " ; "world") // renvoie hello world

Exemple 4 – Tester une série de conditions

Si vous créez une séquence de conditions, comme If (() & ()), 4D évalue toujours toutes les conditions. Il ne s’arrête pas et continue à évaluer les suivantes. Si certaines conditions ne peuvent être évaluées que si celles de gauche sont vraies, vous êtes obligé de faire une liste imbriquée profonde de conditions if, pour vérifier si l’objet est valide avant de tester l’attribut. Voici comment cela se passe :

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

Dans cet exemple, nous n’avions « que » 3 conditions, mais vous pouvez facilement remarquer que cela devient de plus en plus complexe. Pourquoi ne pas tout écrire dans une seule condition ? Pourquoi ne pas écrire une méthode qui exécute vos formules l’une après l’autre ? Si le résultat est True, vous évaluez la formule suivante, si le résultat est false, vous vous arrêtez et retournez False.

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

Pour la méthode _AND, code très habituel et simple :

$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

J’espère que ces exemples vous donneront un aperçu d’autres façons d’utiliser cette commande. N’hésitez pas à partager vos formules sur le forum 4D… Je suis sûr que vous avez plein d’idées !

Vanessa Talbot
- Product Owner -Vanessa Talbot a rejoint l'équipe du programme 4D en juin 2014. En tant que Product Owner, elle est chargée de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation des fonctionnalités livrées répond aux besoins des clients.Depuis son arrivée, elle a travaillé à la définition des fonctionnalités clés de 4D. Elle a travaillé sur la plupart des nouvelles fonctionnalités de multithreading préemptif et aussi sur un sujet très complexe : la nouvelle architecture pour les applications enginées. Vanessa est diplômée de Telecom Saint-Etienne. Elle a commencé sa carrière à l'Institut de Recherche Criminelle en tant que développeur pour le département audiovisuel. Elle a également travaillé dans les domaines des médias et du médical en tant qu'experte en support technique, en production ainsi qu'en documentation de nouvelles fonctionnalités.