FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Clases Maestro Detalle
Hola...
Primero que nada q tengan una feliz navidad... Sucede que decidí incursionar un poco en la programación orientada a objetos… Estoy desarrollando un proyecto donde tengo mis formas y uso métodos de clases creadas… Tengo una clase Conexión y mis clases de Clientes, Proveedores etc. heredan de esa clase les pongo el código de mi clase proveedor… Todas las demas clases son identicas... Me gustaría que checaran el código y me dijeran si la forma de hacerlo es la correcta… ya que no tengo experiencia en esto... Pero lo que me esta deteniendo con el desarrollo es como se harían las clases de Maestro detalle por ejemplo tengo Mis Clases Movimientos que contiene los movimientos que se hacen en el almacén pero cada movimiento puede tener varios Productos en la clase Detalle_Movimiento estas 2 clases se comunican con las tablas de la Db. que son Movimientos y Detalle_Movimiento les pongo lo que tengo para ver si alguien me puede iluminar un poco y decirme como puedo hacer para ir guardando los productos en la clase Detalle_Movimiento o si solo tengo que hacer una sola clase es la primera vez que estoy haciendo esto y la verdad no se como se hace… declaro Propiedades de tipo Arrays …? En la clase Movimiento o fuera de ella uso listas…? Clase Movimeinto Clase Detalle_Movimeinto Ojala y alguien me pueda ayudar me siento perdido...
__________________
Saludos... |
#2
|
||||
|
||||
Esto te puede facilitar la creación de las clases y su mapeo en una base de datos:
http://dn.codegear.com/es/article/36846 |
#3
|
||||
|
||||
Hola Axesys Gracias por contestar...
Bueno ya habia visto un poco esa tecnologia Eco para mi es fantastica lo malo es que mi proyecto lo estoy desarrollando con Delphi para win32 y creo que no lo puedo usar solo que fuera el delphi para .net... No se que me aconsejas voy a tratar de hacer un ejemplo con el eco de lo que quiero hacer y de hay haber si puedo encontrar la estructura de las clases para copiar lo que necesito y seguir con mi proyecto... bueno haber si encuentro la estructura que quiero... o mas bien la forma en como estan diseñadas las clases... Gracias...
__________________
Saludos... |
#4
|
||||
|
||||
Hola no se como dije que probaria si no tengo la versión de Delphi .Net solo tengo Delphi para win32 y con esa no se puede... ojala y alguien mas pueda ayudar un poco...
__________________
Saludos... |
#5
|
||||
|
||||
Hola NickName,
Disculpa, pero no puedo darme el lujo de estar probando tu código... la verdad es que el tiempo en estos momentos son demasiados acotados... Por el vistazo que le dí habría que definir mejor el concepto y entendimiento de lo que es realmente el concepto de "Maestro/Detalle" en POO. Se que dices que te estás iniciando en el mundo de la POO. Te aconsejo que para seguir en este mundo de la POO agarres un buen plano: UML. Te recomiendo el libro UML y Patrones de Craig Larman y/o UML Gota a Gota de Martin Flower y Kendall Scott. Si ya sabes algo de UML sabrás que todo deriva de un diseño del dominio. Un ejemplo sencillo, de lo que comprendo y entiendo del problema que redactas, es este (disculpa por lo burdo): Código:
Proveedor - 1 ------- 1..* - Movimientos - 1 -------------------- 1..* - LineasMovimientos realiza Esta-conformado-por Generalmente, (no siempre) este manejo de la cardinalidad se consigue con la implementación de un objeto contenedor (como menciona Craig), posiblemente un TObjectList. La idea de la cardinalidad (el 1-Muchos) y de este ObjectList es mantener en memoria la relación entre cada proveedor y sus movimientos. De modo que ha simple diseño (y sobre todo rápido) yo lo veo así:
O si el diseño lo amerita... hacer esto:
Siendo ya, en este caso, TMovimiento descendiente de TObjectList pero que contiene los elementos necesarios y adecuados; ocultando (preferiblemente) la arquitectura de su descendiente (es decir que es posible que sería conveniente que a los fines de uso de esta clase, que oculte al exterior el hecho de que internamente es un TObjectList).
Y este procedimiento se realiza en forma análoga entre Movimiento y su detalle. Por otro lado, no me convence la idea de que las clases lógicas invadan o contengan funciones que podrían (nota la palabra: podrían) recaer en la capa de datos. Es decir que estas clases deleguen el trabajo de hacer la consulta y el acceso a la base de datos a otro objeto que posiblemente esté más calificado. La idea de delegar este trabajo es que tanto TProveedor, como TMovimiento envien el mensaje de grabar, modificar, borrar, etc a este objeto y sea éste el encargado de hacer el trabajo sucio. ¿Porqué dije podría? Porque si tu diseño (mejor dicho el dominio) es simple es posible que adosar esta nueva clase (llamemosla AccesoDB) haga más complicado al modelo y lleve a costos y pérdida de tiempo. Creo que resulta lógico pensar que si son estas tres clases (Proveedor, Movimiento, LineaMovimiento) las únicas en el dominio... incorporar esta cuarta... sería un poco lioso y molesto... pero cuando el diseño engloba a más... es claro y evidente de que se necesita un mejor diseño de las clases y su delegación de funciones. El diseño de tus clases debería seguir el flujo de la información que te proporciona el modelo. El punto de partida de la cardinalidad que yo te he mostrado es tan sólo uno de los puntos a tener en cuenta. Teniendo en cuenta esto yo estaría pensando en métodos como: GetMovimientos(): que se encargaría de obtener los movimientos para un proveedor. La clase Proveedor envíea este mensaje a la clase Movimiento. Y a su vez, este nombre sugiere que el proceso sea análogo para sus detalles: GetDetalleMovimientos() o getLineaMovimientos() InsertarMovimientos(): que al parecer, a mi modo de ver, sería el Proveedor que envía el mensaje... aprovechando el hecho de que está el TObjectList lo que podría realizar es hacer por ejemplo un Add sobre su FMovimiento...
En fin... esto dependerá de como estructures y diseñes tus clases. Como te decía... hay varias posibilidades de como lograr hacer los "vinculos". Y asi seguiría con el diseño. Se que no te he ayudado con el código pero al menos creo haber dicho que algo deberías tener en cuenta: La correcta asignación de responsabilidades. No es que lo que hayas hecho esté mal...sino que no veo como logras hacer referencia entre la clase proveedor y la clase movimientos. No veo, al menos yo, un vinculo de interés (o como debe decirse: asignación de responsabilidades). Para una primera aproximación, tu diseño ha sido un gran avance. Si realmente deseas llevar un sentido más "purista" hacia la POO, considero tomes bien estas palabras: leer un buen libro de UML y perder el miedo al análisis y diseño primero. Y ten presente que no hay un único diseño y comprención del problema. Existen tantos diagramas de dominio, como personas hay en este mundo... por lo que no existe una única solución de como implementar correctamente la asignación de responsabilidades de las clases. De modo que para poder recibir la mejor ayuda sería oportuno que tu nos informes de tu modelo, de tu comprensión del dominio. Porque si yo te muestro mi diseño es posible que no sea tan coincidente con el tuyo y para ti sea más complicado de asimilarlo y comprenderlo. Espero haber sido de ayuda. Saludos, PD: Disculpa por tanto texto. Última edición por Delphius fecha: 26-12-2007 a las 07:40:48. |
#6
|
||||
|
||||
Otra opción InstantObjects
Para Win32 puedes usar InstantObjects
http://sourceforge.net/project/showf...group_id=94747 Checate el video de intro Saludos |
#7
|
|||||||
|
|||||||
Hola Delphius...
Primero que nada muchas gracias por toda tu aportación de verdad te agradesco mucho... Cita:
Cita:
Cita:
Uso los Fibplus para conectarme a Firebird: Por todo lo que comentas y otro hilo que cheque hasta me da pena publicar mi codigo... en un hilo que cheque comentan que los atributos privados de una clase se deben de usar en la misma clase y los publicos desde fuera y mi clase no aplica eso... Cita:
Cita:
Cita:
Cita:
Por otro lado creo que mi modelo es simple: segun yo tengo mi clase Conexion con esta me conecto a la DB... y todas mis demas clases heredan de esta para Insertar Modificar y Eliminar Datos.. lo demas es comun Movimeintos con su Detalle_Movimiento, Ticket y su Detalle_Ticket pero la verdad no tengo nada diseñado como dises solo la idea de acuerdo a la Db que tengo y mi problema es q no se como estructurar esas clases Maestro Detalle... bueno y siendo realistas creo que me falta mucho que aprender.... Por todo Gracias...
__________________
Saludos... |
#8
|
||||
|
||||
Gracias Axesys checare esa opción.... y les comento....
__________________
Saludos... |
#9
|
||||
|
||||
Hola NickName,
De curiosidad he vuelto para ver si respondías. Me alegro que tengas en cuenta mis comentarios y que estés abierto a alternativas. No tengo Delphi a mano... pero al ver la forma en que tu haz hecho tu diseño, no lo veo correcto. A mi modo de ver... no tiene sentido lógico que las clases Proveedor, Movimiento, etc hereden de Conexion. Veamos si me explico: la asignación de responsabilidades es un juego sencillo. Al igual que en la realidad a uno le toca a hacer lo que sabe haber. Y claro está, si lo saber hacer es porque tiene la información para saber hacer su tarea. En POO esto se traduce: un objeto hace algo con la información que este tiene. Un objeto que no sabe delimitar sus funciones y/o delegar parte de su trabajo a otro objeto tiene problemas de diseño. Y es aqui parte del problema. Una clase Movimiento debería delegar parte de su trabajo hacia la clase LineaMovimiento. Es como querer asignarle todo el trabajo de oficina a una persona. Parte del problema se soluciona teniendo un ObjectList como te comentaba:
Ahora continuando con el planteo. ¿Quien se encargaría de crear cada detalle del movimiento? O dicho de otro modo: ¿Que clase tiene la información necesaria para crear cada LineaMovimiento? Comprendiendo el modelo ("Un Movimiento está compuesto por al menos una Linea de detalle") podemos afirmar que la clase Movimiento es una excelente candidata. Por lo que dicha clase debe contar con un método que realize esta operación. Por ejemplo:
¿Terminamos? No... Bueno... ya se ha conseguido hacer parte de la referencia... Hemos creado una linea, pero claro... aqui no termina la historia. ¿Cómo mantenemos la referencia? ¡FLineaMovimiento al rescate! Una vez que se crea la linea de movimiento (y muy posiblemente se asignan algunos valores a sus propiedades), es necesaria asociarla al ObjectList... Podríamos hacer algo como:
Y asi podemos continuar viendo que debe hacer cada clase y/o conocer cada clase. Ahora pensemos... ¿Sería correcto que todas la clases entiendan de SQL y sepan conectarse a la base de datos? ¿Que tienen que ver un Movimiento, un Proveedor, una LineaDeMovimiento con el acceso a base de datos? Poco y nada. Ahora tu me dirás: ¿Pero que no es que cada clase debe hacer lo que sabe y cuenta con la información para ello? ¿Pero si cada una cuenta con la información necesaria porqué no hacer que ellas sean quienes accedan a la base de datos? La respuesta es que la verdad está a medias. Es correcto el hecho de que tanto Proveedor, como Movimientos, etc... tienen la información necesaria. Pero ¿es necesario que todas sepan y entiendan de SQL? La respuesta es NO. Lo correcto sería tener otra clase que sepa de SQL, entienda sobre base de datos. Viendo que me aportaste mayor información acerca de tu dominio. Yo ya optaría por algo más modular. Me hablas de Ticket y su respectivo detalle. Ya tienes 5 clases que aprenden SQL... contra una que entiende. Tu viniste haciendo una asignación de responsabilidades a la inversa. Hiciste el trabajo sucio en la parte alta de la rama del diagrama y debería ir en la parte baja. Lo más correcto sería que Proveedor, y demás se comuniquen con esta clase extraña que entiende de base de datos y nada más que de base de datos y le pasan los datos lo que se desea grabar, modificar, etc. Por ejemplo tal vez algo como esto:
AccesoDB, podría leer desde las propiedades del Movimiento y en base a lo que lee arma un SQL y lo manda a ejecutar. Lo más correcto es que no haya una única clase que se encargue del trabajo sucio. Es de esperar que sean varios objetos quienes colaboran en dicha tarea. Yo ya te he comentado que si te impongo un modelo y mi punto de vista sería perjudicial para ti. Haz el tuyo y de alli estructura las clases correctamente. En vista a que no tienes un diseño preliminar recomiendo que antes de seguir metiendo código te documentes mejor sobre UML. No conduzcas por la carretera de POO sino tienes un mapa que te indique si vas bien o mal. Podríamos continuar con las explicaciones, pero es un tema que no se aprende en pocos días. si bien aqui puede que haya espacio para ir redactando cada tema o duda que te vayan surgiendo... no va alcanzar para evacuarte todas tus dudas. Lee UML y Patrones y asimilarás la idea y la filosofía que encierra el mundo POO. Saludos, Última edición por Delphius fecha: 26-12-2007 a las 21:11:07. |
#10
|
||||
|
||||
Hola Delphius Muchas gracias....
He leeido todo lo que se atraviesa en mis ojos de POO pero no es lo mismo leer que aplicar todo ya en un lenguaje en particular lo que hise y te mostre fue algo paresido a lo que vi en un curso que tome de C# por momentos sentia que estaba bien y luego sentia que no... bueno a mi me gusta delphi por eso lo elegi como lenguaje o mas bien tengo algo de tiempo haciendo cosas y siempre que desarrollo algo tenia que hacer todo de nuevo por eso elegi hacerlo ahora Orientado a objetos se que cuesta mucho se codifica mas pero todo tiene su recompensa y siento que al final me sentire bien por el trabajo realizado... Si entiendo todo lo que me dijiste hoy prometo leer todo lo que pueda del primer libro que me recomendaste (Uml y Patrones) ya sabia que me costaria mucho pero no me arrepiento de haber elegido esta forma de desarrollo... Cita:
No tenia ni idea y me preguntaba como sabra la clase AccesoDb que Grabar si se supone que tengo Clientes, Proveedores Ticket etc etc y cada clase tiene distintos campos... y por eso aplique lo que vi en ese curso que te digo que no me convencia... Cita:
De verdad te agradezco mucho toda tu ayuda se que cuesta mucho saber lo que sabes por eso muchas gracias por aportar Toda esa Luz... bueno mejor dicho Conocimientos...
__________________
Saludos... |
#11
|
|||||
|
|||||
Cita:
Es cierto, no es lo mismo leer que aplicarlo. Sobre todo si lo que lees está redactado y usa de ejemplo otro lenguaje. Personalmente opino que cuando uno se siente confuso sobre la manera en que está trabajando es una muestra de un diseño débil. Aunque también es posible que se esté buscando a un arbol dentro del bosque. No lo tomes a mal, sino como un largo proceso de maduración. Cita:
Cita:
Lo correcto y lo primordial a aprender: Armar las relaciones entre los objetos y los Patrones GRASP: Asignación de responsabilidades. Son intuitivos (al menos yo a estas alturas los siento así). Pero patrones más avanzados como Factoría, Estrategia, Composite... no se les entiende a la primera (De hecho me estoy peleando con la Factoria). A medida que continúes con la lectura de el libro comprenderás de lo que te he dicho. De hecho debería serte familiar lo que dije antes. Ya que el ejemplo lo he adaptado de el libro Cita:
Por eso te decía que es mucho más probable de que no sea una única clase la que hace el trabajo sucio. Es posible que haya una o dos más. Pero en fin, si bien puede parecerte que añadir más clases al modelo te resulta complicado notarás que las clases se volverán más relajadas, con lo que: 1. Cada clase se vuelve más estable. 2. Mantienen un bajo acoplamiento y alta cohesión. Con lo cual se vuelven fácilmente reutilizables. 3. Adosar nuevas clases hace que el modelo se amplie con poco esfuerzo. Cita:
Aprende UML primero y el modelo del dominio pronto te saldrá de la cabeza y notarás las cosas más frescas. Ya he dicho que no soy el gran experto, me haces sonrojar. Te agradezco que tomes mis palabras en cuenta. Te doy mi consejo, algo que ya te he dicho antes: El modelo no es único. Eso es lo lindo de la POO, que un mismo dominio posee diversas interpretaciones y buscar la más adecuada es más de arte que de ciencia. Saludos, |
#12
|
||||
|
||||
Ok Delphius...
Seguiere hechandole a la lectura... y en unos de estos dias haber si ya puedo con el diseño... y les comento.... Bueno por todo gracias de verdad...
__________________
Saludos... |
#13
|
|||
|
|||
Cita:
|
#14
|
||||
|
||||
Hola...
Cita:
Por ejemplo para asignar el nombre del proveedor hago algo parecido a: Despues solo ejecuto el metodo que desee atravez de algun boton Espero y me alla explicado y te sirva un poco...
__________________
Saludos... |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Problema tabla Maestro-detalle en la q la pk de t.detalle formad por 2cods de la maes | akinom38 | Varios | 1 | 09-11-2007 19:27:44 |
Respecto a la relacion maestro detalle detalle | ilichhernandez | Conexión con bases de datos | 0 | 15-05-2007 18:13:54 |
Numerar el detalle Maestro / detalle en secuencia | josejose | SQL | 5 | 10-02-2007 00:27:38 |
Reporte Maestro/Detalle/Detalle de 4 Tablas | jovehe | Impresión | 2 | 23-03-2005 01:25:02 |
Maestro-Detalle ;Actualizar detalle a partir de un DBgrid | norberto_larios | Conexión con bases de datos | 1 | 11-09-2004 18:17:34 |
|