Comparaison de référence facile des objets et des collections

Traduit automatiquement de Deepl

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 !

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.