Besoin d’une baguette magique ? Voici des propriétés de classes calculées !

Traduit automatiquement de Deepl
L’apparition des classes dans l’environnement de développement 4D a rendu la programmation plus moderne et plus facile à mettre à l’échelle. Les classes permettent de définir des propriétés, des fonctions et supportent également l’héritage.
Dans votre application, vous avez probablement une classe pour gérer des données scientifiques ou financières. Prenons l’exemple des données financières. Disons que vous avez créé des fonctions pour calculer les impôts. Si vous gérez également plusieurs pays, vous avez peut-être utilisé l’héritage pour gérer les différentes règles. Ensuite, vous affichez ces résultats dans une boîte de liste, mais si l’utilisateur modifie un des attributs utilisés dans la formule, vous devez gérer cet événement pour mettre à jour le résultat.
Avec 4D v19 R3, 4D vous permet de simplifier ce processus grâce aux propriétés calculées : Vous pouvez définir une fonction get et set pour votre propriété calculée, et lorsque vous ajoutez votre propriété à une zone de liste, tout est géré automatiquement par 4D. Plus de logique métier dans votre interface utilisateur.

Propriétés calculées HDI

Définition et calculs

Pour expliquer la puissance de ce concept, faisons aussi simple que possible, et commençons par un exemple concret :
Une classe « Rectangle » contient deux attributs, width and height, et peut inclure des fonctions comme getSurface() et getPerimeter(), qui peuvent éventuellement être utilisées.
Cependant, ne serait-il pas préférable de considérer les adresses surface et perimeter comme des propriétés ordinaires, au même titre que les autres ? Des propriétés qui peuvent être lues et éventuellement modifiées ? Et les autres propriétés dont elles dépendent pourraient aussi être modifiées automatiquement. Eh bien, maintenant c’est possible grâce aux propriétés calculées.

Magique !

Voici deux exemples simples. Dans les deux cas, tous les attributs peuvent être saisis.

Lorsque vous modifiez le width ou le height, le perimeters et le surfaces sont recalculés. L’inverse est également vrai : modifiez le surface ou le perimeter, et les widths et heights varieront en conséquence.

blank

Cela fonctionne également dans les boîtes de liste ! Qui peuvent toujours être triées sur n’importe quelle colonne !
blank

Où est la magie ?

Dans les deux cas, il n’y a pas de script dans les coulisses ! Tous les calculs sont définis une fois pour toutes dans la classe Rectangle ! Voici donc un grand avantage : si vous avez besoin de plus de formulaires utilisant ces attributs, vous n’aurez pas besoin d’écrire de code (comme ci-dessus).

Voyons comment cela se passe !

Accès aux propriétés COMPUTÉES

GET

La première fonction, « get », permet de définir comment la propriété est calculée. Pour cela, elle doit retourner le résultat du calcul.
Cette fonction est la seule qui soit obligatoire et détermine par sa simple présence l’existence de la propriété calculée et la possibilité de l’utiliser.

The function gets surface est définie à l’intérieur de la classe Rectangle.

Function get surface() -> $surface: Réel
$surface := This.width * this.hauteur

Une fois que la fonction ci-dessus a été écrite, vous pouvez maintenant utiliser la propriété de surface comme une propriété normale !

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

SET

La deuxième fonction, « set », si elle existe, va gérer la modification d’une propriété calculée. La modification de la surface va permettre de recalculer la valeur de la largeur et de la hauteur du rectangle.

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

// conserve le rapport largeur-hauteur
$ratio :=This.width/This.height

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

Une fois les fonctions ci-dessus écrites, vous pouvez maintenant modifier la propriété surface comme une propriété normale ! Les attributs width et height seront ajustés en conséquence.

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

ALERT ("La surface de ce rectangle est : "+String($surface)) // renvoie 120
// Modifions la surface
$rect .surface:=1000
// Puis affiche la nouvelle largeur et la nouvelle hauteur
$width :=$rect.width
$height:=$rect.height
ALERT ("Le rectangle est maintenant : "+String($width)+" x "+String($height)) // renvoie 54.77 x 18.25

Interroger et trier…

Les collections remplies d’objets de la classe Rectangle peuvent être interrogées et triées à l’aide de propriétés calculées !

Exemple de requête :

myRectangles:=myRectangles.query("périmètre < 200")

Exemple de commande OrderBy :

myRectangles:=myRectangles.orderBy("périmètre desc")

…et JSON

Lorsque vous utilisez un objet avec des propriétés calculées, ces propriétés seront prises en compte lorsque vous le « stringifiez ».

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

blank

Conclusion

Cet exemple simple montre qu’il est possible d’effectuer des opérations complexes, mais que la complexité restera cachée.
Il permet également de mieux contrôler la publication des données en fonction des contextes, des droits des utilisateurs, etc., puisque les règles peuvent être définies au sein même de la classe.
Bienvenue dans une façon moderne de programmer !
Pour plus de détails, lisez cette documentation.
Roland Lannuzel
- Product Owner & 4D Expert - Après avoir étudié l'électronique, Roland s'est lancé dans l'informatique industrielle en tant que développeur et consultant, créant des solutions pour les clients avec une variété de bases de données et de technologies. À la fin des années 80, il est tombé amoureux de 4D et l'a utilisé pour écrire des applications commerciales, notamment des systèmes de comptabilité, de facturation et de messagerie électronique. Il a rejoint la société en 1997 et a contribué à la conception de spécifications, d'outils de test et de démonstrations, ainsi qu'à la formation et à la présentation de la communauté 4D lors de nombreuses conférences. Il continue à façonner activement l'avenir de 4D en définissant de nouvelles fonctionnalités et des outils de développement de bases de données.