Programando Con Lázarus – Listas Genéricas.

3
15/10/2015 Programando con Lázarus – Listas genéricas.. | Blog de Tito Hinostroza http://blog.pucp.edu.pe/blog/tito/2013/04/16/programandoconlzaruslistasgenricas/ 1/3 Blog de Tito Hinostroza Ciencia, Tecnología, Filosofía y más. 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íca. 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 nalmente 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

description

kgjg

Transcript of Programando Con Lázarus – Listas Genéricas.

Page 1: Programando Con Lázarus – Listas Genéricas.

15/10/2015 Programando con Lázarus – Listas genéricas.. | Blog de Tito Hinostroza

http://blog.pucp.edu.pe/blog/tito/2013/04/16/programando­con­l­zarus­listas­gen­ricas/ 1/3

Blog de Tito HinostrozaCiencia, Tecnología, Filosofía y más.

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í췎⾥ca.

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 췎⾥nalmente 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

Page 2: Programando Con Lázarus – Listas Genéricas.

15/10/2015 Programando con Lázarus – Listas genéricas.. | Blog de Tito Hinostroza

http://blog.pucp.edu.pe/blog/tito/2013/04/16/programando­con­l­zarus­listas­gen­ricas/ 2/3

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 signi췎⾥ca 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

su췎⾥ciente 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í췎⾥ca. 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 de췎⾥nidas completamente hasta que se vayan a usar. De

forma que nos permite de췎⾥nirlas para un tipo especial de objetos cuando las vamos a usar. Así nos

permiten crear listas de objetos especí췎⾥cos.

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

Page 3: Programando Con Lázarus – Listas Genéricas.

15/10/2015 Programando con Lázarus – Listas genéricas.. | Blog de Tito Hinostroza

http://blog.pucp.edu.pe/blog/tito/2013/04/16/programando­con­l­zarus­listas­gen­ricas/ 3/3

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”.

Puntuación: 4.00 / Votos: 2

Esta entrada se publicó en Programación y está etiquetada con Lazarus, Listas, pascal, programación en

16 abril, 2013 [http://blog.pucp.edu.pe/blog/tito/2013/04/16/programando-con-l-zarus-listas-gen-ricas/]

. Visto: 880 veces