Einfacher Referenzvergleich von Objekten und Sammlungen

Objekte sind ein wesentlicher Bestandteil der 4D Sprache und von Qodly geworden.

Aber wenn Sie eine Variable dieses Typs deklarieren, definieren Sie eine Referenz. Woher wissen Sie also, ob zwei Objekte tatsächlich ein und dasselbe sind und dieselbe Referenz haben?

Ab 4D 20 R6 ist der Vergleich von Objektreferenzen ganz einfach: Geben Sie die Operatoren = und # ein!

Dieser Blog-Beitrag beschäftigt sich mit diesen Operatoren und wie sie dabei helfen, festzustellen, ob Objekte denselben Bezug haben. Finden Sie mehr heraus!

Gleich, verschieden…

Wenn man über Objekte spricht, ist es wichtig, zwischen ihrem Inhalt und ihrer Referenz zu unterscheiden. Der Vergleich mit gleich (=) und nicht gleich (#) sowie andere Möglichkeiten wie das Suchen und Zählen in Arrays usw. betreffen Referenzen.

Das Gleiche gilt für Sammlungen. Wenn eine Sammlung als Variable deklariert wird, handelt es sich eigentlich um eine Referenz, die deklariert wird. Die folgenden Beispiele sollen dies verdeutlichen.

Bsp. 1: Zwei Objekte werden deklariert und teilen sich dieselbe Referenz.
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
Bsp. 2: Zwei Sammlungen werden deklariert und teilen sich dieselbe Referenz.
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
Beispiel 3: Diesmal haben zwei Objekte und zwei Sammlungen denselben Inhalt. In beiden Fällen handelt es sich um zwei verschiedene Objekte und zwei verschiedene Sammlungen!
$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

Arrays und Array-Funktionen

Find in array und Count in array.

Bis jetzt konnten Funktionen wie Find in array und Count in array nicht mit Arrays von Objekten verwendet werden. Jetzt können sie es!

$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

Array sortieren, in sortiertem Array suchen und Array multisortieren

Wenn Ihre Objekt-Arrays viele Elemente enthalten und diese sortiert sind, wird der Befehl Find in sorted array viel schneller sein als Find in the array. Deshalb haben wir auch den Befehl SORT ARRAY verbessert, so dass er auch Objekte sortieren kann! Die Sortierreihenfolge ist eine rein technische interne Reihenfolge, aber sie ist wichtig, damit der ergänzende Befehl Find in sorted array später verwendet werden kann.

Objekte und Sammlungen innerhalb von Sammlungen

Die Funktion query() kann auch verwendet werden, um nach Objekt- oder Sammlungsreferenzen zu suchen… innerhalb einer Sammlung!

Die folgenden Code-Beispiele sind nun gültig.

Zum Beispiel, ein Objekt innerhalb einer Sammlung

$o1:={a: 1}
$c1:=[{o: $o1}]
$c2:=$c1.query("o = :v"; {parameters: {v: $o1}})

Beispiel mit einer Sammlung innerhalb einer Sammlung

$col1:=[1; 2; 3]
$c1:=[{c: $col1}]
$c2:=$c1.query("c = :v"; {parameters: {v: $col1}})

Entitäten und Entitätsselektionen

Nach den ORDA-Prinzipien gilt das Gleiche für Entitäten und Entitätsselektionen. Selbst wenn eine Entität ein Datenbankelement referenziert, ist eine andere Entität, die das gleiche Element referenziert, unterschiedlich (nicht gleich).

$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

Das Gleiche gilt für zwei Entitätsselektionen. Dieser Fall ist vielleicht einfacher zu verstehen. Im zweiten Fall könnte sich in der Zeitspanne zwischen der Erstellung von $es1 und $es2 der Inhalt der Tabelle geändert haben. Aber selbst wenn das nicht der Fall ist, werden $es1 und $es2 immer unterschiedliche Entitätsselektionen sein!

$es1:=ds.T1.all()
$es2:=$es1
$result:=($es1=$es2) // True

$es1:=ds.T1.all()
$es2:=ds.T1.all()
$result:=($es1=$es2) // False

Schlussfolgerung

Sie haben nun die gleichen Möglichkeiten für den Vergleich und die Suche nach Objekten wie bei Strings, Zahlen, Datums- und Zeitangaben. Wir hoffen, dass diese Änderungen zur Anpassung an die anderen Variablentypen Ihre Entwicklung erleichtern werden.

Zögern Sie nicht, uns Ihre Meinung im Forum mitzuteilen!

Roland Lannuzel
- Product Owner & 4D Experte - Nach seinem Studium der Elektronik arbeitete Roland als Entwickler und Berater in der industriellen IT-Branche, wo er Lösungen für Kunden mit einer Vielzahl von Datenbanken und Technologien entwickelte. In den späten 80er Jahren verliebte er sich in 4D und setzte es bei der Entwicklung von Geschäftsanwendungen wie Buchhaltungs-, Abrechnungs- und E-Mail-Systemen ein. 1997 trat er schließlich in das Unternehmen ein und leistete einen wertvollen Beitrag, indem er Spezifikationen, Testtools und Demos entwarf, Schulungen durchführte und auf vielen Konferenzen für die 4D Community sprach. Er gestaltet die Zukunft von 4D aktiv mit, indem er neue Funktionen und Datenbankentwicklungstools definiert.