Snadné referenční porovnávání objektů a kolekcí

Automaticky přeloženo z Deepl

Objekty se staly nezbytnou součástí jazyka 4D a Qodly.

Když však deklarujete proměnnou tohoto typu, definujete odkaz. Jak tedy poznáte, že dva objekty jsou ve skutečnosti jen jeden a sdílejí stejnou referenci?

Počínaje 4D 20 R6 je porovnávání referencí objektů jednoduché: zadejte operátory = a #!

Tento příspěvek na blogu se zabývá těmito operátory a tím, jak pomáhají určit, zda objekty sdílejí stejnou referenci. Pojďme se dozvědět více!

Stejné, různé…

Když mluvíme o objektech, je nezbytné rozlišovat mezi jejich obsahem a referencí. Porovnávání pomocí rovná se (=) a nerovná se (#), stejně jako další možnosti, jako je vyhledávání a počítání v polích atd. se týkají referencí.

Totéž platí pro kolekce. Pokud je kolekce deklarována jako proměnná, jedná se vlastně o referenci, která je deklarována. Následující příklady vám to pomohou objasnit.

Příklad1: Jsou deklarovány dva objekty, které sdílejí stejnou referenci.
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
Př. 2: Jsou deklarovány dvě kolekce, které sdílejí stejnou referenci.
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
Příklad3: Tentokrát mají dva objekty a dvě kolekce stejný obsah. V obou případech se jedná o dva různé objekty a dvě různé kolekce!
$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

Pole a funkce pole

Find in array a Count in array.

Dosud nebylo možné používat funkce jako Find in array a Count in array s poli objektů. Nyní již mohou!

$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

Třídění pole, hledání v setříděném poli a vícenásobné třídění pole

Pokud vaše pole objektů obsahuje mnoho prvků a ty jsou setříděné, bude příkaz Find in sorted array mnohem rychlejší než Find in the array. Proto jsme také vylepšili příkaz SORT ARRAY tak, aby uměl objekty také třídit! Pořadí třídění je čistě technické interní pořadí, ale je nezbytné, aby bylo možné později použít doplňkový příkaz Find in sorted array .

Objekty a kolekce uvnitř kolekcí

Funkci query() lze použít také k vyhledávání odkazů na objekty nebo kolekce… uvnitř kolekce!

Níže uvedené příklady kódu jsou nyní platné.

Například objekt uvnitř kolekce

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

Příklad s kolekcí uvnitř kolekce

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

Entity a výběry entit

Podle zásad ORDA platí totéž pro entity a výběry entit. I když se jedna entita odkazuje na prvek databáze, jiná entita odkazující na stejný prvek se bude stále lišit (nebude si rovna).

$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

Totéž platí pro dva výběry entit. Tohle by mohlo být srozumitelnější. V druhém případě se v časových intervalech mezi vytvořením $es1 a $es2 mohl změnit obsah tabulky. Ale i kdyby tomu tak nebylo, $es1 a $es2 budou vždy odlišné výběry entit!

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

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

Závěr

Nyní máte k dispozici stejné možnosti porovnávání a vyhledávání objektů, jaké jste měli u řetězců, čísel, dat a časů. Doufáme, že vám tyto změny, které se přizpůsobí ostatním typům proměnných, usnadní vývoj.

Neváhejte nám na fóru sdělit, co si o tom myslíte!

Roland Lannuzel
- Product Owner & 4D Expert - Po studiu elektroniky se Roland věnoval průmyslovým IT jako vývojář a konzultant, který vytvářel řešení pro zákazníky s různými databázemi a technologiemi. Koncem 80. let se zamiloval do 4D a používal jej při psaní podnikových aplikací, které zahrnovaly účetní, fakturační a e-mailové systémy. nakonec se připojil ke společnosti v roce 1997 a Rolandův cenný přínos zahrnuje návrh specifikací, testovacích nástrojů, demoverzí a také školení a přednášky pro komunitu 4D na mnoha konferencích. Nadále aktivně utváří budoucnost 4D definováním nových funkcí a nástrojů pro vývoj databází.