Programando Con Lázarus – Listas Genéricas.
description
Transcript of 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/programandoconlzaruslistasgenricas/ 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
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/ 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
…
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/ 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