Facilità di confronto tra oggetti e collezioni

Tradotto automaticamente da Deepl

Gli oggetti sono diventati una parte essenziale del linguaggio 4D e di Qodly.

Ma quando si dichiara una variabile di questo tipo, si definisce un riferimento. Come si fa a sapere se due oggetti sono in realtà uno solo e condividono lo stesso riferimento?

A partire da 4D 20 R6, confrontare i riferimenti di un oggetto è semplice: si tratta degli operatori = e #!

Questo post esplora questi operatori e come aiutano a determinare se gli oggetti condividono lo stesso riferimento. Scopriamone di più!

Uguale, diverso…

Quando si parla di oggetti, è essenziale distinguere tra il loro contenuto e il loro riferimento. Il confronto con gli operatori di uguaglianza (=) e non uguaglianza (#), così come altre possibilità come la ricerca e il conteggio negli array, ecc. riguardano i riferimenti.

Lo stesso vale per le collezioni. Quando una collezione viene dichiarata come variabile, in realtà viene dichiarato un riferimento. Gli esempi che seguono aiutano a chiarire questo punto.

Es1: Due oggetti sono dichiarati e condividono lo stesso riferimento.
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
Es2: Due collezioni sono dichiarate e condividono lo stesso riferimento.
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: Questa volta, due oggetti e due collezioni hanno lo stesso contenuto. In entrambi i casi, si tratta di due oggetti e due collezioni distinti!
$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

Array e funzioni di array

Find in array e Count in array.

Finora, funzioni come Find in array e Count in array non potevano essere utilizzate con gli array di oggetti. Ora è possibile!

$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

Ordinamento di array, ricerca in array ordinati e array multiordinati

Se gli array di oggetti contengono molti elementi e sono ordinati, il comando Find in sorted array sarà molto più veloce di Find in the array. Ecco perché abbiamo migliorato anche il comando SORT ARRAY in modo che possa ordinare gli oggetti! L’ordinamento è un ordine interno puramente tecnico, ma è essenziale per consentire l’uso del comando complementare Find in sorted array in seguito.

Oggetti e collezioni all’interno di collezioni

La funzione query() può essere utilizzata anche per cercare riferimenti a oggetti o collezioni… all’interno di una collezione!

Gli esempi di codice riportati di seguito sono ora validi.

Ad esempio, un oggetto all’interno di un insieme

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

Esempio con una collezione all’interno di una collezione

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

Entità e selezioni di entità

Secondo i principi ORDA, lo stesso vale per le entità e le selezioni di entità. Anche se un’entità fa riferimento a un elemento del database, un’altra entità che fa riferimento allo stesso elemento sarà comunque diversa (non uguale).

$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

Lo stesso vale per due selezioni di entità. Questo potrebbe essere più facile da capire. Nel secondo caso, nel lasso di tempo che intercorre tra la creazione di $es1 e $es2, il contenuto della tabella potrebbe essere cambiato. Ma anche se non fosse così, $es1 e $es2 saranno sempre selezioni di entità distinte!

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

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

Conclusione

Ora si hanno le stesse possibilità di confronto e ricerca di oggetti che si hanno con stringhe, numeri, date e orari. Ci auguriamo che queste modifiche per conformarsi agli altri tipi di variabili facilitino il vostro sviluppo.

Non esitate a farci sapere cosa ne pensate sul forum!

Roland Lannuzel
- Product Owner ed esperto di 4D - Dopo aver studiato elettronica, Roland è passato all'IT industriale come sviluppatore e consulente, realizzando soluzioni per i clienti con una varietà di database e tecnologie. Alla fine degli anni '80 si è innamorato di 4D e lo ha utilizzato per scrivere applicazioni aziendali che includono sistemi di contabilità, fatturazione e posta elettronica. Entrato a far parte dell'azienda nel 1997, Roland ha dato il suo prezioso contributo progettando specifiche, strumenti di test e demo, oltre a formare e parlare alla comunità 4D in occasione di numerose conferenze. Continua a plasmare attivamente il futuro di 4D definendo nuove funzionalità e strumenti di sviluppo di database.