Comparación de referencia fácil de objetos y colecciones

Los objetos se han convertido en una parte esencial del lenguaje 4D y de Qodly.

Pero cuando se declara una variable de este tipo, se define una referencia. Entonces ¿cómo saber si dos objetos son, de hecho, uno solo y comparten la misma referencia?

A partir de 4D 20 R6, comparar referencias de objetos es sencillo: ¡introduzca los operadores = y #!

Esta entrada del blog explora estos operadores y cómo ayudan a determinar si los objetos comparten la misma referencia. Averigüemos más.

Iguales, diferentes…

Cuando hablamos de objetos, es esencial distinguir entre su contenido y su referencia. La comparación mediante iguales (=) y no iguales (#), así como otras posibilidades como la búsqueda y el recuento en arrays, etc., se refieren a referencias.

Lo mismo ocurre con las colecciones. Cuando se declara una colección como variable, en realidad se declara una referencia. Los ejemplos siguientes le ayudarán a aclararlo.

Ej1: Se declaran dos objetos que comparten la misma referencia.
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
Ej2: Se declaran dos colecciones y comparten la misma referencia.
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
Ej3: Esta vez, dos objetos y dos colecciones tienen el mismo contenido. En ambos casos, se trata de dos objetos y dos colecciones distintos.
$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 y funciones arrays

Find in array y Count in array.

Hasta ahora, funciones como Find in array y Count in array no podían utilizarse con arrays de objetos. Ahora .

$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

Ordenar ARRAYS, buscar en ARRAYS ordenadOs y multiordenar ARRAYS

Si sus arrays de objetos contienen muchos elementos y éstos están ordenados, el comando Find in sorted array será mucho más rápido que Find in the array. Por eso también hemos mejorado el comando SORT ARRAY para que también pueda ordenar objetos. El orden de clasificación es un orden interno puramente técnico, pero es esencial para poder utilizar más adelante el comando complementario Find in sorted array.

Objetos y colecciones dentro de colecciones

La función query() también puede utilizarse para buscar referencias a objetos o colecciones… ¡dentro de una colección!

Los ejemplos de código que figuran a continuación son ahora válidos.

Por ejemplo, un objeto dentro de una colección

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

Ejemplo con una colección dentro de una colección

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

Entidades y selecciones de entidades

Según los principios de ORDA, lo mismo se aplica a las entidades y a las selecciones de entidades. Aunque una entidad haga referencia a un elemento de la base de datos, otra entidad que haga referencia al mismo elemento seguirá siendo diferente (no 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

Lo mismo se aplica a dos selecciones de entidades. Esto puede ser más fácil de entender. En el segundo caso, en los lapsos de tiempo entre que se crean $es1 y $es2, el contenido de la tabla puede haber cambiado. Pero incluso si no es el caso, ¡$es1 y $es2 siempre serán selecciones 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

Conclusión

Ahora tiene las mismas posibilidades para comparar y buscar objetos que tenía con cadenas, números, fechas y horas. Esperamos que estos cambios para ajustarse a los demás tipos de variables le faciliten el desarrollo.

No dudes en hacernos llegar su opinión en el foro.

Roland Lannuzel
- Propietario de Producto y Experto en 4D - Después de estudiar electrónica, Roland se dedicó a la informática industrial como desarrollador y consultor, construyendo soluciones para clientes con una variedad de bases de datos y tecnologías. A finales de los años 80 se enamoró de 4D y lo ha utilizado para escribir aplicaciones de negocio que incluyen sistemas de contabilidad, facturación y correo electrónico.Eventualmente se unió a la compañía en 1997, las valiosas contribuciones de Roland incluyen el diseño de especificaciones, herramientas de prueba, demos, así como la formación y hablar con la comunidad 4D en muchas conferencias. Continúa dando forma activamente al futuro de 4D definiendo nuevas características y herramientas de desarrollo de bases de datos.