Les objets sont devenus une partie essentielle du langage 4D et de Qodly.
Mais lorsque vous déclarez une variable de ce type, vous définissez une référence. Alors, comment savoir si deux objets n’en font qu’un et partagent la même référence ?
À partir de 4D 20 R6, la comparaison des références d’objets est simple : il suffit d’utiliser les opérateurs = et #!
Cet article de blog explore ces opérateurs et la manière dont ils permettent de déterminer si des objets partagent la même référence. En savoir plus !
Égaux, différents…
Lorsque l’on parle d’objets, il est essentiel de faire la distinction entre leur contenu et leur référence. La comparaison à l’aide des opérateurs égal (=) et différent (#), ainsi que d’autres possibilités telles que la recherche et le comptage dans les tableaux, etc. concernent les références.
Il en va de même pour les collections. Lorsqu’une collection est déclarée comme variable, c’est en fait une référence qui est déclarée. Les exemples ci-dessous permettent de clarifier ce point.
Ex1 : Deux objets sont déclarés et partagent la même référence.
var $o1; $o2 : Object
$o1:={a: 1}
$o2:=$o1 // Same reference, $o2 is NOT a copy of $o1
$result:=($o1=$o2) // True
$result:=($o1#$o2) // False
Ex2 : Deux collections sont déclarées et partagent la même référence.
var $c1; $c2 : Collection
$c1:=["a"]
$c2:=$c1 // Same reference, $c2 is NOT a copy of $c1
$result:=($c1=$c2) // True
$result:=($c1#$c2) // False
Ex3 : Cette fois-ci, deux objets et deux collections ont le même contenu. Dans les deux cas, il s’agit de deux objets distincts et de deux collections distinctes !
$o1:={a: 1}
$o2={a: 1}
$result:=($o1=$o2) // False (objects are distinct!)
$result:=($o1#$o2) // True
$c1:=["a"]
$c2:=["a"]
$result:=($c1=$c2) // False (collections are distinct!)
$result:=($c1#$c2) // True
Tableaux et fonctions de tableaux
Find in array et Count in array.
Jusqu’à présent, les fonctions telles que Find in array et Count in array ne pouvaient pas être utilisées avec des tableaux d’objets. Maintenant, c ‘est possible!
$o1:={a: 1}
$objects{20}:=$o1
$position:=Find in array($objects; $o1) // returns20 !
$o1:={a: 1}
$objects{10}:=$o1
$objects{20}:=$o1
$objects{30}:=$o1
$count:=Count in array($objects; $o1) // -> Returns 3
Tri d’un tableau, recherche dans un tableau trié et tableau multitri
Si vos tableaux d’objets contiennent de nombreux éléments et que ceux-ci sont triés, la commande Find in sorted array sera beaucoup plus rapide que Find in the array. C’est pourquoi nous avons également amélioré la commande SORT ARRAY afin qu’elle puisse également trier les objets ! L’ordre de tri est un ordre interne purement technique, mais il est essentiel pour permettre l’utilisation ultérieure de la commande complémentaire Find in sorted array .
Objets et collections à l’intérieur des collections
La fonction query() peut également être utilisée pour rechercher des références d’objets ou de collections… à l’intérieur d’une collection !
Les exemples de code ci-dessous sont désormais valables.
Exemple avec un objet à l’intérieur d’une collection
$o1:={a: 1}
$c1:=[{o: $o1}]
$c2:=$c1.query("o = :v"; {parameters: {v: $o1}})
Exemple avec une collection à l’intérieur d’une collection
$col1:=[1; 2; 3]
$c1:=[{c: $col1}]
$c2:=$c1.query("c = :v"; {parameters: {v: $col1}})
Entités et sélections d’entités
Selon les principes ORDA, il en va de même pour les entités et les sélections d’entités. Même si une entité fait référence à un élément de la base de données, une autre entité faisant référence au même élément sera toujours différente (pas égale).
$e1:=ds.Table.all().first()
$e2:=$e1
$result:=($e1=$e2) // True
$e1:=ds.Table.all().first()
$e2:=ds.Table.all().first()
$result:=($e1=$e2) // False
Il en va de même pour deux sélections d’entités. Celui-ci est peut-être plus facile à comprendre. Dans le second cas, entre la création de $es1 et de $es2, le contenu de la table peut avoir changé. Mais même si ce n’est pas le cas, $es1 et $es2 seront toujours des sélections d’entités distinctes !
$es1:=ds.T1.all()
$es2:=$es1
$result:=($es1=$es2) // True
$es1:=ds.T1.all()
$es2:=ds.T1.all()
$result:=($es1=$es2) // False
Conclusion
Vous disposez désormais des mêmes possibilités de comparaison et de recherche d’objets que pour les chaînes de caractères, les nombres, les dates et les heures. Nous espérons que ces changements pour se conformer aux autres types de variables faciliteront votre développement.
N’hésitez pas à nous faire part de vos commentaires sur le forum !