Pair vs. Arrays y Diccionarios: como elegir la opción correcta

A continuación encontrarás traducido al castellano el artículo escrito originalmente por Gabriel Ludosanu y publicado en el Blog oficial de Xojo.

Como desarrolladores estamos buscando continuamente los métodos más refinados y eficaces para la gestión de datos en nuestras apps. Aunque los Array y los Diccionarios reciben la mayor atención, también existe otra clase interesante: Pair. Probablemente se trate de uno de los tipos de datos más infrautilizados si bien tiene un gran potencial en determinados contextos.

Este artículo se centra en la clase Pair, mostrando sus puntos fuertes y comparándola con los Array y los Diccionarios. También te ayudará a identificar cuales son las situaciones más propicias para cada tipo de dato.

¿Qué es la Clase Pair?

En Xojo, la clase Pair es una estructura básica capaz de almacenar dos valores asociados: Left (izquierda) y Right (derecha). Estas propiedades pueden contener cualquier tipo de dato, permitiéndote emparejar cualesquiera tipos de datos por parejas.

Var myPair As New Pair("Pie", 15)

En la línea de código anterior, myPair.Left contiene el valor “Pie” (una cadena de texto o String), mientras que myPair.Right contiene el valor 15 (un entero o Integer). La clase Pair es especialmente útil cuando necesitas asociar dos valores sin el sobre-coste de tener que crear una clase o estructura dedicados.

Ventajas en el uso de la Clase Pair

1. Devolución de múltiples Valores desde un Método

A veces necesitas que un método devuelva más de un valor. Si bien puedes hacerlo utilizando un parámetro identificado con ByRef (por referencia) o bien crear tu propia clase personalizada, con el uso de Pair obtienes una solución rápida y limpia.

Ejemplo:

Public Function GetMinMax(values() As Integer) As Pair
  Var minValue As Integer = values(0)
  Var maxValue As Integer = values(0)
  
  For Each value As Integer In values
    If value < minValue Then minValue = value
    If value > maxValue Then maxValue = value
  Next
  
  Return New Pair(minValue, maxValue)
End Function
// Uso
Var numbers() As Integer = Array(5, 2, 8, 3, 9)
Var result As Pair = GetMinMax(numbers)
MessageBox("Min: " + result.Left.StringValue + ", Max: " + result.Right.StringValue)

2. Asociar datos relacionados de forma temporal

A la hora de procesar datos es posible que debas asociar dos valores de forma temporal sin necesidad de que persistan en el tiempo o bien sin la necesidad de crear una compleja estructura de datos para ello.

Ejemplo:

Var people() As Pair
people.Append(New Pair("Alice", 30))
people.Append(New Pair("Bob", 25))
people.Append(New Pair("Charlie", 35))
 
For Each person As Pair In people
  MessageBox(person.Left.StringValue + " tiene " + person.Right.IntegerValue.ToString + " años.")
Next

3. Representación de pares Clave-Valor

Mientras que los Diccionarios están diseñados para el almacenamiento de pares Clave-Valor, a veces puede que necesites representar los pares de clave-valor de forma explícita, como cuando iteras por las entradas de un Diccionario.

Ejemplo:

Var dict As New Dictionary
dict.Value("Red") = "#FF0000"
dict.Value("Green") = "#00FF00"
dict.Value("Blue") = "#0000FF"
 
For Each key As Variant In dict.Keys
  Var entry As New Pair(key, dict.Value(key))
  MessageBox(entry.Left.StringValue + " su código de color es " + entry.Right.StringValue)
Next

Comparación: Pair vs. Arrays vs. Diccionarios

Comprender cuando utilizar la clase Pair sobre los Array o los Diccionarios es crucial a la hora de escribir código eficiente.

Pair

  • Estructura: Contiene exactamente dos valores relacionados (Left y Right).
  • Seguridad de Tipo: Tanto las propiedades Left y Right pueden contener cualquier tipo de dato.
  • Uso: Ideal a la hora de asociar de forma temporal dos datos o bien para aquellos métodos que precisen devolver dos valores.
  • Rendimiento: Ligero y con sobrecarga mínima.

Array

  • Estructura: colección ordenada de elementos, accesibles mediante su índice.
  • Seguridad de Tipo: los elementos almacenados han de tener el mismo tipo de dato que el declarado para el Array (excepto de que el Array se haya declarado con tipo Variante).
  • Uso: mejor opción a la hora de lidiar con listas o elementos donde su orden tenga importancia.
  • Rendimiento: eficiente para la iteración sobre colecciones de gran tamaño.

Diccionarios

  • Estructura: colección de pares por clave-valor, con el uso de claves únicas por par.
  • Seguridad de Tipo: tanto las claves como los valores pueden ser de cualquier tipo, si bien generalmente se utilizan Strings o números enteros como clave.
  • Uso: cuando necesitas una búsqueda rápida de valores atendiendo a la clave utilizada para su almacenamiento.
  • Rendimiento: Optimizado para el acceso por clave-valor; impacto de rendimiento en la gestión de la tabla hash utilizada para las búsquedas.

Consideraciones en el uso de Pair en vez de Arrays o Diccionarios

  • Simplicidad: cuando necesites asociar dos elementos sin tener que crear una estructura compleja.
  • Asociaciones temporales: para pares con una vida corta, como pueda ser su uso en métodos o bucles.
  • Devolución de múltiples valores: cuando los métodos han de devolver dos valores relacionados.

Buenas prácticas con Pair

  • Datos inmutables: Dado que Pair es una clase has de tener precaución a la hora de modificar las propiedades Left o Right, especialmente si el Pair se comparte en diferentes partes del código.
  • Código descriptivo: utiliza comentarios o convenciones a la hora de asignarles nombres para identificar lo que representan tanto la propiedad Left como Right, dado que no proporcionan significado semántico por sí mismos.

Ejemplo:

// Pair: Left = Nombre de producto, Right = Precio
Var productPair As New Pair("Laptop", 999.99)

Limitaciones de la clase Pair

  • Ausencia de significado: al contrario de lo que ocurre con las clases personalizadas o bien las estructuras, la clase Pair no ofrece significado sobre su contenido.
  • Tamaño fijo: está limitado a exactamente dos elementos; en el caso de los datos más complejos, considera el uso de una clase o bien estructura.
  • Tipo de referencia: al tratarse de una clase, las instancias creadas a partir de Pair es un tipo de dato por referencia, lo cual tiene las implicaciones asociadas en la gestión de memoria y su uso en hilos.

Conclusión

La clase Pair es una herramienta útil que puede simplificar tu código cuando necesites asociar dos valores relacionados. Si bien no sustituye al uso de Arrays o Diccionarios, la clase Pair es valiosa en situaciones concretas en las que se priorice la sencillez y eficiencia.

Recursos:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *