Comparação fácil de referências de objectos e colecções

Os objetos tornaram-se uma parte essencial da linguagem 4D e da Qodly.

Mas quando se declara uma variável deste tipo, define-se uma referência. Então, como saber se dois objectos são, de facto, apenas um e partilham a mesma referência?

A partir de 4D 20 R6, comparar referências de objetos é simples: entre com os operadores = e #!

Esse post do blog explora esses operadores e como eles ajudam a determinar se objetos compartilham a mesma referência. Vamos descobrir mais!

Igual, diferente…

Quando se fala de objetos, é essencial distinguir entre o seu conteúdo e a sua referência. A comparação utilizando igual (=) e diferente (#), bem como outras possibilidades como a procura e a contagem em arrays, etc., diz respeito a referências.

O mesmo se aplica às coleções. Quando uma coleção for declarada como uma variável, é na realidade uma referência que é declarada. Os exemplos abaixo ajudarão a clarificar este aspeto.

Ex1: Dois objectos são declarados e partilham a mesma referência.
var $o1; $o2 : Object
$o1:={a: 1}
$o2:=$o1  // Mesma referência, $o2 NÃO é uma cópia de $o1

$result:=($o1=$o2)  // True
$result:=($o1#$o2)  // False
Ex2: Duas colecções são declaradas e partilham a mesma referência.
var $c1; $c2 : Collection
$c1:=["a"]
$c2:=$c1   // Mesma referência, $c2 NÂO é uma cópia de $c1

$result:=($c1=$c2)  // True
$result:=($c1#$c2)  // False
Ex3: Desta vez, dois objetos e duas coleções têm o mesmo conteúdo. Em ambos os casos, são dois objetos distintos e duas coleções distintas!
$o1:={a: 1}
$o2={a: 1}
$result:=($o1=$o2)  // False (objetos são distintos entre si!)
$result:=($o1#$o2)  // True

$c1:=["a"]
$c2:=["a"]
$result:=($c1=$c2)  // False (colleções são diferentes!)
$result:=($c1#$c2)  // True

Matrizes e funções de matriz

Find in array e Count in array.

Até agora, funções como Find in array e Count in array não podiam ser utilizadas com arrays de objetos. Agora podem!

$o1:={a: 1}
$objects{20}:=$o1
$position:=Find in array($objects; $o1)  // retorna 20 !
$o1:={a: 1}
$objects{10}:=$o1
$objects{20}:=$o1
$objects{30}:=$o1

$count:=Count in array($objects; $o1) // -> Retorna 3

Ordenar uma matriz, procurar numa matriz ordenada e numa matriz multi-ordenada

Se as suas matrizes de objetos contiverem muitos elementos e estes estiverem ordenados, o comando Find in sorted array será muito mais rápido do que Find in the array. É por isso que também melhorámos o comando SORT ARRAY para que também possa ordenar objetos! A ordem da ordenação é uma ordem interna puramente técnica, mas é essencial para permitir que o comando complementar Find in sorted array seja utilizado mais tarde.

Objetos e coleções dentro de coleções

A função query() também pode ser utilizada para procurar referências a objetos ou coleções… dentro de uma coleção!

Os exemplos de código abaixo são agora válidos.

Por exemplo, um objeto dentro de uma coleção

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

Exemplo com uma coleção dentro de uma coleção

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

Entidades e seleções de entidades

De acordo com os princípios ORDA, o mesmo se aplica a entidades e seleções de entidades. Mesmo que uma entidade faça referência a um elemento da base de dados, outra entidade que faça referência ao mesmo elemento continuará a ser diferente (não igual).

$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

O mesmo se aplica a duas seleções de entidades. Este caso pode ser mais fácil de entender. No segundo caso, no intervalo de tempo entre a criação de $es1 e $es2, o conteúdo da tabela pode ter mudado. Mas mesmo que não seja esse o caso, $es1 e $es2 serão sempre seleções de entidades distintas!

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

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

Conclusão

Agora tem as mesmas possibilidades de comparar e procurar objetos que tinha com strings de caracteres, números, datas e horas. Esperamos que estas alterações, em conformidade com os outros tipos de variáveis, facilitem o seu desenvolvimento.

Não hesite em dizer-nos o que pensa no fórum!

Roland Lannuzel
- Proprietário do produto & Especialista 4D - Depois de estudar electrónica, a Roland entrou nas TI industriais como desenvolvedor e consultor, construindo soluções para clientes com uma variedade de bases de dados e tecnologias. No final dos anos 80, apaixonou-se pela 4D e utilizou-a para escrever aplicações comerciais que incluem sistemas de contabilidade, facturação e correio electrónico. Juntando-se à empresa em 1997, as valiosas contribuições de Roland incluem a concepção de especificações, ferramentas de teste, demonstrações, bem como formação e palestras para a comunidade 4D em muitas conferências. Ele continua a moldar activamente o futuro da 4D, definindo novas características e ferramentas de desenvolvimento de bases de dados.