Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-11-2005
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Listas de objetos: ¿Herencia o Encapsulación?

Hola.

Antes que nada quiero saludar a todos puesto que es mi primer post, así como agradecer de antemano vuestra ayuda.

Vamos al asunto.
Se trata de una simple clase que va a contener una lista de objetos. Para ello me voy a apoyar en la clase TStringList (va a poseer Valores y Objetos asociados).

¿Qué creéis que es más correcto (o elegante)?

Código Delphi [-]
  TMiLista = class
   protected
     FObjetos: TStringList;
   public
     constructor Create;
     destructor Destroy; override;
     function AddObjeto(const Abbrev: string; Objeto: TMiObjeto): Integer;
     function GetObjeto(Abbrev: string): TMiObjeto;
   end;
   
   
   TMiLista = class(TStringList)
   private
     function GetObject(ObjIndex: Integer): TMiObjeto;
     procedure SetObject(ObjIndex: Integer; const Value: TMiObjeto);
   public
     destructor Destroy; override;
     function GetObjeto(Abbrev: string): TMiObjeto;
     property Objects[ObjIndex: Integer]: TMiObjeto read GetObject
       write SetObject;
   end;

Hay que tener en cuenta que, si posible, no quiero dar acceso a la propiedad Objects, es decir, no dar acceso a los objetos de la lista directamente, sino hacerlo sólo a través de los métodos (establecer como una "caja negra").
Por ello, mi preferencia es la primera clase, pero si me decís que no es elegante, o no se suele hacer, pues utilizaré la segunda clase.

Muchas gracias.
Un saludo.

EDITO para modificar modificar y aclarar un poco el título.

Última edición por Jome fecha: 24-11-2005 a las 13:03:44.
Responder Con Cita
  #2  
Antiguo 21-11-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: May 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.874
Poder: 21
delphi.com.ar Va por buen camino
Cita:
Empezado por Jome
...no quiero dar acceso a la propiedad Objects, es decir, no dar acceso a los objetos de la lista directamente, sino hacerlo sólo a través de los métodos (establecer como una "caja negra")...
Con algo tan excluyente como eso, la primera opción es la única posible.

Si quieres utilizar las ventajas del polimorfismo, y quieres que tu clase pueda ser utilizada por ejemplo por los controles de la VCL, la segunda opción es la apropiada.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 22-11-2005
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Cita:
Empezado por delphi.com.ar
Si quieres utilizar las ventajas del polimorfismo, y quieres que tu clase pueda ser utilizada por ejemplo por los controles de la VCL, la segunda opción es la apropiada.
Bien, pues utilizaré la segunda opción ya que, por lo que dices, aporta más flexibilidad aunque, en principio, simplemente se tratará de una simple lista de objetos sin más.

¡Muchas gracias!
Responder Con Cita
  #4  
Antiguo 22-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
¿No te sería más comodo derivar de TObjectList?, que maneja una lista de objetos por sí mismo.

El string lo meterías dentro del objeto, y listo.

Solo tendrías que hacer un par de forzados de tipos para tener una lista de objetos que te devuelvan el TMiObjeto en lugar del típico TObject.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 22-11-2005
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Cita:
Empezado por Lepe
¿No te sería más comodo derivar de TObjectList?, que maneja una lista de objetos por sí mismo.

El string lo meterías dentro del objeto, y listo.

Solo tendrías que hacer un par de forzados de tipos para tener una lista de objetos que te devuelvan el TMiObjeto en lugar del típico TObject.

saludos
La decisión de usar TStringList ha sido porque necesito poder buscar entre los objetos mediante el campo Abbrev. Entonces, me he apoyado en la clase TStringList porque posee el método Find (si está ordenado) ó IndexOf (si no está ordenado) y así no tengo que implementarlo yo.
Es cierto que con un TStringList desperdicio algo de memoria,ya que el campo Abbrev lo contiene por duplicado: una vez como Value y otra dentro del propio MiObjeto.

La clase TObjectList también posee el método IndexOf pero, salvo que me corrijáis, creo que no lo puedo aprovechar para buscar entre los objetos según un determinado campo (corregidme si me equivoco porque de esto no estoy seguro).

Es cierto que mediante la clase TObjectList me puedo evitar tener que destruir cada uno de los objetos, pero dentro del uso que le voy a dar a esta lista no se encuentra el de poder borrar algún objeto, simplemente va a ser una lista fija que contendrá objetos provenientes de un archivo XML, y a la que accederé de vez en cuando (se puede decir que una vez cargada, será de sólo lectura).

Precisamente por ser de sólo lectura, en lugar de heredar de TStringList había pensado en encapsular el TStringList, y publicar (wrappear -ó como se diga- ) sólo el método Find (ó IndexOf) ya que es el único que voy a emplear. Pero bueno, el usuario delphi.com.ar me ha dado a entender que heredar me aportaría más flexibilidad (y quizás más adelante me dé cuenta de que la necesito) y me ha convencido.
Responder Con Cita
  #6  
Antiguo 23-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Cita:
Empezado por Jome
La clase TObjectList también posee el método IndexOf pero, salvo que me corrijáis, creo que no lo puedo aprovechar para buscar entre los objetos según un determinado campo (corregidme si me equivoco porque de esto no estoy seguro).
No te equivocas, indexOf le tienes que pasar un TObject y te dice si está o no.

Implementarlo es bastante fácil, es un simple bucle por los objetos y comparar con la propiedad TMiObjeto.Abrev. Además puedes implementar la opción CaseSensitive, o pasarlo como parámetro a tu rutina: IndexOfAbrev

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 24-11-2005
Jome Jome is offline
Registrado
 
Registrado: Nov 2005
Posts: 8
Poder: 0
Jome Va por buen camino
Cita:
Empezado por Lepe
No te equivocas, indexOf le tienes que pasar un TObject y te dice si está o no.

Implementarlo es bastante fácil, es un simple bucle por los objetos y comparar con la propiedad TMiObjeto.Abrev. Además puedes implementar la opción CaseSensitive, o pasarlo como parámetro a tu rutina: IndexOfAbrev

saludos
¿No crees que será más rápido el método Find (o IndexOf) de TStringList que el que pueda implementar yo recorriendo los objetos y comparando el campo Abbrev?
Responder Con Cita
  #8  
Antiguo 24-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.206
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por Jome
¿No crees que será más rápido el método Find (o IndexOf) de TStringList que el que pueda implementar yo recorriendo los objetos y comparando el campo Abbrev?
Quizá no sea mucho más eficiente pero una cosa es cierta. Ya está hecho. Es una cuestión de gustos claro, y sé que difiero de Lepe en este aspecto , pero yo preferiría el TStringList por lo mismo que ya has mencionado.

// Saludos
Responder Con Cita
  #9  
Antiguo 24-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
Cita:
Empezado por Jome
¿No crees que será más rápido el método Find (o IndexOf) de TStringList que el que pueda implementar yo recorriendo los objetos y comparando el campo Abbrev?
En delphi escribe TStringList.IndexOf, ahora mantén la tecla CTRL pulsada mientras haces clic sobre IndexOf, irás directamente a su implementación, si no está ahí, tendrás el Inherited del TStrings, y mira el código fuente que usa la VCL. Te dará muchas pistas de como implementarlo bien.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:05:08.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi