Programando con Lázarus – Listas genéricas..

En mis exploraciones con Lázarus y Free Pascal he encontrado unas estructuras interesantes de las que poco se habla y que, sin embargo, son unas herramientas potentes en la programación de estructuras dinámicas de objetos, números o cadenas.

Estoy hablando de las listas genéricas. Las de la clase «TFPGObjectList».  En vista de que veo muy poca información en español, aquí va mi aporte.

Es cierto que en Free Pascal existen las listas de tipo TFPObjectList, que también manejan objetos, pero las listas genéricas dan un paso adelante al poder manejar listas de objetos de una clase específica.

Antes que nada, un pequeño resumen, que de paso me sirve a mi también:

Para manejar listas de objetos dinámicos en Object Pascal, tenemos dos opciones:

* Manejar directamente arreglos (o matrices) dinámicos.
* Manejar estructuras de listas ya creadas en las librerías.

1. MANEJAR DIRECTAMENTE ARREGLOS DINÁMICOS

Este sería el método clásico, el que yo usaría si no tuviera otras opciones. El procedimiento es clásico:

Declarar la matriz:  Matriz: ARRAY OF Integer;

Dimensionar la matriz:  SetLength(Matriz, 5);

Y finalmente hay que limpiar la matriz. Si manejamos datos como números y cadenas,basta con un: SetLength(Matriz,0).

Pero si manejamos matrices de objetos hay que liberar la memoria que ocupaban los objetos. Limpiar solamente la matriz no «limpia» el espacio de los objetos.  El código sería algo como esto:

for objeto in Matriz do objeto.Free;
SetLength(Matriz, 0);

La desventaja de este método sería que nosotros mismos tendríamos que implementar «a mano», los procedimeintos de inserción, eliminación, ordenamiento, etc.

Sin querer entra en detalle, porque el tema es extenso, vamos al otro método.

2. MANEJAR ESTRUCTURAS DE LISTAS YA CREADAS EN LAS LIBRERÍAS

Esta solución consiste en usar las clases de objetos ya creados que nos liberan del trabajo de tener que implementar la inserción, borrado, ordenamiento, y otras tareas típicas de las listas dinámicas.

Aquí existen diversas opciones, resumiré las que he revisado, aunque sea someramente:

Objetos Tlist: Son las listas más simples, por así decirlo. Almacenan punteros a prácticamente cualquier cosa. Son listas de uso general. En Free Pascal existe una versión llamada TFPList, que básicamente es la misma lista pero no incluye mecanismos para manejar eventos, lo que debiera hacerlas más rápidas. Si usamos esta lista con objetos hay que tener cuidado de ir liberando los objetos que quitemos de un Tlist, porque debemos liberar su memoria manualmente (objeto.Free).

Objetos TObjectList: Serían una versión más especializada de los TList. Estas listas, que tienen todos los métodos de un TList (son sus descendientes), almacenan punteros a TObject, lo que significa que están destinadas a manejar objetos y no simples número o cadenas. La ventaja que nos dan, es que nos pueden ahorrar el trabajo de tener que liberar la memoria del objeto cuando eliminemos su referencia de la lista.Y digo «nos pueden», porque esta opción de recojo de basura, se puede activar o desactivar a voluntad el momento de la creación de la lista. Nuevamente aquí tenemos que Free Pascal incluye una versión «ligera» que es la TFPObjectList que nuevamente no maneja eventos a cambio de velocidad.

No quiero explayarme más porque quiero llegar al punto, y por otro lado no he experimentado lo suficiente con estas estructuras.

LISTAS GENÉRICAS

A lo que quería llegar es que, las listas TObjectList manejan bien los objetos pero siempre almacenarán referencias a TOBject. Cuando las usemos, no va a ser para almacenar TObjects, sino alguna clase más específica. Así que tendremos que hacer conversiones frecuentes de tipo, si es que las usamos, con una posible pérdida de velocidad.

Aquí es donde las listas TFPGObjectList salen al encuentro. Este tipo de listas son las llamadas estructuras de tipo genéricas. Un concepto que también se ve en .NET.

A grandes rasgos, son clases que no están definidas completamente hasta que se vayan a usar. De forma que nos permite definirlas para un tipo especial de objetos cuando las vamos a usar. Así nos permiten crear listas de objetos específicos.

Veamos un ejemplo. Para crear una lista genérica de tipo «Tpersona», declararía un tipo  y una variable así:

TYPE
TListaPersonas = specialize TFPGObjectList<Tpersona>;

VAR
ListaPersonas: TListaPersonas;

Y luego ya tengo una lista que solo acepta Tpersona, pudiendo acceder directamente a sus campos así:

ListaPersonas[1].nombre

ListaPersonas[1].edad

Sin pérdida de velocidad por ligadura tardía y sin necesidad de hacer «TypeCast».

La asignación y borrado de ítems, se hace de la misma forma que en una lista TObjectList, y con las mismas consideraciones.

Estas estructuras caen en la categoría de los llamados «contenedores parametrizables» y son herramientas poderosas de Object Pascal en programación.

Recordar que el primer elemento de la lista es el 0 y no el 1. Además para usar estas listas se debe incluir la unidad «Fgl».


Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*