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!