Ir al contenido


Foto

¿Qué me recomiendan para almacenar Clases?


  • Por favor identifícate para responder
6 respuestas en este tema

#1 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 noviembre 2009 - 07:16

Saludos.

Necesito de su opinión sobre este tema y si es posible una breve explicación del porque ese modo.

La historia es esta: En mi desarrollo personal tengo un DataModule con ciertas funcionalidades para un TpFIBDataSet dichas funcionalidades básicamente consisten en Insert, Edit, Delete, Post y Cancel.

En eso no tengo inconvenientes, cabe aclarar que cada tabla tiene su DataModule que hereda de DmData (DataModule con las funcionalidades).  Cada DataModule es individual no se conocen entre ellos.

Ellos vienen a conocerse, en caso de un Master/Detail, en la pantalla de Captura donde manualmente realizo la "conexión" entre ellos, es lógico que cada uno debe de hacer su Post; sumándole a esto debo de hacer llamada al método ApplyUpdates por cada Detail (manualmente) y luego a la cabecera; no sé preocupen por el asunto de guardar el ID del Master al Detail, eso esta totalmente controlado.

Lo que estoy tratando de expresar es que debo de hacer siempre por cada Detail que tenga en la mano la llamada al método ApplyUpdates, sin embargo quiero hacer un solo ApplyUpdates al Master y este se encargue de hacer los demás en los Detail.

Entonces se me ocurre tener una propiedad (por ponerle un nombre) en el DataModule donde yo pueda en el Master decirle estos son tus hijos para que al momento de hacer ApplyUpdates se los aplique.

Más o menos así:


delphi
  1. DmMaster.Relation.Add(DmDetail1);
  2. DmMaster.Relation.Add(DmDetail2);
  3. DmMaster.Relation.Add(DmDetail3);
  4.  
  5. //Posteando
  6. DmMaster.ApplyUpdates;



Entonces sus recomendaciones andarían por que clase debo definir la propiedad "Relation" para agregar los DataModules y poner manipularlos.

Gracias!
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 18 noviembre 2009 - 08:51

Hola Rolphy Reyes,
Soy un poco lento... déjame ver si te entendí... ¿Lo que deseas saber es como puedes hacer, que dado un método (no necesariamente deba ser el ApplyUpdates) que se comunique y le haga a saber a las clases relacionadas que hagan algo?

Si es eso, lo más simple, es optar por un diseño basado en el concepto de asociación. Tenemos dos tipos de asociación, la agregación por composición (o simplemente, composición) y la agregación compartida (o simplemente, agregación).
El concepto de agregación (para ambos tipos) hace referencia a que una clase A está formada, o constituída, por muchas clases B.

En composición se exige una depedencia absoluta entre Compuesto y Partes: todas las partes forman exclusivamente al Todo y no pueden existir por si mismas. El ejemplo más sencillo de verlo es el concepto de Mano... una mano está constituída por 5 dedos (salvando algunos casos), pero el tener un dedo solo no hace a una mano.
En agregación en cambio, el todo y partes pueden no estar totalmente relacionados... y existir de forma casual. Una parte puede estar en más de un todo y existir por si misma.

Según leo de tu descripción, se puede entender a tu caso como una agregación compartida.

La agregación se suele dar muchas veces, cuando A desea y debe comunicarse con muchos B. La forma en como lo hace es tener una lista. Traducido a Delphi, puedes valerte de ObjectList, o TList, o alguno similar.

Lo más simple es esto:



delphi
  1. TClaseA = class
  2. private
  3.   FListaB: TObjectList;
  4. ...
  5. public
  6.   procedure AddB(B: TClaseB);
  7.   procedure EnviarMensajeAB;
  8.  
  9. procedure TClaseA.AddB(B: TClaseB);
  10. begin
  11.   FListaB.Add(B);
  12. end;
  13.  
  14. procedure TClaseA.EnviarMensajeAB;
  15. var i: integer;
  16. begin
  17.   for i := 0 to FLista.Count - 1 do
  18.     TClaseB(FLista.Items[i]).HacerEsto;
  19. end;



Como ves en el ejemplo, la clase A, envia el mensaje HacerEsto a todas las clases que están asociadas en la lista.
Al ejemplo lo hice al vuelo, no tengo Delphi a mano en estos momentos... no recuerdo bien si así era el manejo de ObjectList.

Al ser un caso de asociación compartida (al menos así lo estoy entendiendo), cuando se libere la clase A no debería, no necesariamente, liberarse todos los B asociados a éste.

Saludos,
  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 18 noviembre 2009 - 09:04

Saludos.

Con tu explicación Delphius, queda para mi bien acertada de que necesito agregación compartida.

Ahora bien, que clase me recomiendas para realizar dicha operación, si un TList o TObjectList o TCollection o cualquier otra clase que se ajuste al almacenamiento.

Como bien indicas no necesariamente tiene que ser ApplyUpdates, solo me referí a ese método como ejemplo. 

Debo de admitir que debo madurar más la idea pero por ahí anda el principio del camino. :)
  • 0

#4 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 640 mensajes
  • LocationLos Mochis

Escrito 18 noviembre 2009 - 10:16

No te servira esto

Nesting DataSets in ClientDataSets
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 18 noviembre 2009 - 11:15

Hola,

Rolphy, no te puedo asegurar totalmente de que sea completamente lo que necesitas. Es al menos lo que a mi me de la impresión, un caso de agregación.
¿Que clase? Pues yo me inclinaría por TObjetList. Aunque debe analizarse con más detenimiento que otras cosas pueden entrar en juego... en principio bastaría con ella.

TCollection yo lo consideraría si es que te es de utilidad que aparezca en el IDE... ten presente que TCollection y TCollectionItem son las clases bases que ofrecen manejar lista de items y por lo general forman parte (atributo) de un clase mayor (de hecho, es un caso de composición. Por ejemplo, Panel con su propiedad Panels (el TCollection) o de un TQuery con Parameters (el TCollection) , pero a un nivel IDE. Básicamente TCollection y TCollectionItem ofrecen métodos públicos y publicados... y si bien se pueden emplear en tiempo de ejecución su verdadera utilidad está para facilitar la edición de items y lista en tiempo de diseño.

Si no tienes pensado contar con esa "ventaja" me parece inapropiado. Además, su uso te obliga a crear una clase que descienda de ambos y sobreescribir sus métodos. Si tu clase ya desciende de una, o forma parte de su propia jerarquía y relaciones, con más razón descartaría esa opción...

No leí el enlace que ofrece axesys. No estaría mal darle una leída. Es un tanto largo y el inglés me cuesta un poco... Si alguien me lo explica... ;)

Saludos,
  • 0

#6 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 19 noviembre 2009 - 07:11

No te servira esto

Nesting DataSets in ClientDataSets


Gracias axesys, pero para el caso que necesito no es lo que ando buscando, conozco de esta opción que nos da el TClientDataSet de hecho es muy buena; aunque esta se realiza a nivel del componente.

Lo que ando buscando es como montar "relaciones" entre DataModule que son independientes entre ellos pero en un punto uno necesita de otro, después de ahí sigue su independencia; con esa opción que propones debería de usar un DataModule donde relacione al Master/Detail, además mi desarrollo no esta basado en TClientDataSet; puedo cambiarlo pero no me interesa por el momento agregar una capa adicional en la aplicación.

Gracias Delphius por tu explicación, veré las ventajas de ambas tal como señalas, además como había mencionado debo de madurar un poco más la idea de relaciones; mientras tanto lo haré "manual"  que es una lata. (y)
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 noviembre 2009 - 08:37

Debo de admitir que debo madurar más la idea pero por ahí anda el principio del camino. :)

además como había mencionado debo de madurar un poco más la idea de relaciones; mientras tanto lo haré "manual"  que es una lata. (y)


Hola amigo,
¿Hay algo que no te convence?
Me gustaría que nos hicieras saber mayores detalles de tus clases... un diagrama de clases tal vez ayude a comprender mejor el panorama.

Me extraña que digas madurar... no se como interpretar esto... Es como si hubiera encontrado un punto débil o sensible en tu auto-estima. Me siento un tanto culpable :(. Yo hablé y expuse el tema desde mi inexperiencia, o poca experiencia, en el tema. No soy quien para cuestionarte.

Como he dicho, no estoy totalmente seguro de que sea lo que necesitas. Parcialmente, según lo que nos comentas, me da la impresión de que es un caso de agregación compartida; pero para tener una mejor comprensión necesitaría de una mirada un tanto más general y profunda de las relaciones entre las clases que estás proponiendo.
Por ejemplo, en ocasiones no es viable la idea de que la clase A sea quien tenga la lista (quizá por cuestiones de herencia o jerarquía de clases, o para mejorar la cohesión y el acoplamiento), y deba acceder a sus partes por indirección a través de una clase C, de este modo esta clase C es el verdadero Compuesto y no A.
Hay otras opciones además de la agregación.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.