Ver Mensaje Individual
  #1  
Antiguo 26-02-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Reputación: 21
AzidRain Va camino a la fama
Solicito su opinión sobre mi modelado

Desde siempre me ha gustado la cosa esta del OOP sin embargo miles de topes me he dado al tener que modelar modelos (válgase la expresión) E-S en OOP. Como ya sabemos nuncan cuadra al 100%. No quiero usar eso de ECO porque sabe como a .NET (ni lo mande Dios) ni de cosas raras por ahí. Casi siempre me encuentro con el siguiente problema:

Tenemos una ventana que muesta digamos las facturas pendientes por registrar en la contabilidad (de entrada nace TFactura que puede tener a su vez TCliente y TPartidas así como muchas propiedades más). Bien, como TFactura es en realidad un registro de una BD y a su vez lo son TCliente y TPartidas (este último es el detalle de la tabla facturas hablando en términos de BD). De entrada para mostrar todas las facturas lo mas simple es hacer un query y mostrarlo en una tabla, pero coño, entonces donde ha quedao nuestra TFactura. Pensé en una TCollection de TFacturas pero entonces para que coño esta TDataset y los componentes DBAware de Delphi???.
Lo que hice es esto:

Modelé una TFactura y demás parafernalia. TFactura recibe una conexión a la BD para recuperar el contenido de cada registro y almacernarlo en sus propiedades, digamos que cada propiedad tiene que que ver con un campo de la BD. Ahora bien, las partidas, ah las partidas. Bueno, yo lo que hices es darle una propiedad Partidas a TFactura que es en realidad un TClientDataset para crear una tabla en memoria la cual TFactura es capaz de llenar a partir de la tabla de detalle de la BD y a su vez guardar en la BD.

De esta forma puedo usar digamos una rejilla para mostrar el detalle de TFactura usando componentes dbAware. Claro que para la actualización de la BD sí utilizo comandos SQL como INSERT o UPDATE según el caso. Digamos que TFactura sabe como guardarse en la BD y como guardar su "detalle" en la misma BD. De tal suerte que para guardar la factura solo llamo a TFactura.Save quien a su vez llama a SaveDetail quien se encarga de guardar el detalle de la factura.

Los constructores normalmente los hago pasádole a la clase una conexión a la BD que utilizo: TFactura.Create(ZMyConnection) (uso Zeos)


He notado que un efecto adicional es que dejo totalmente independiente la BD de mi modelo de objeto, de manera que si hay excepciones las puedo manejar dentro de mi clase principal sin llegar a la BD más que cuando ya se ha validado casi todo.

Me hubiera gustado prescindir por completo de componentes dbaware pero esto requiere mucho más código y terminaría haciendo cosas al estilo Java y en Delphi se supone que todo se puede hacer mucho más rápido.

Comentarios:¿Es un modelado adecuado? ¿Se me ha pasado algo? ¿Mejor le cambio?
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita