entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

¿Buen diseño con modelos de tabla (Table Model) propios?

Hola a todos gracias por leer esta pregunta.

Tengo dudas en una cuestión de diseño, algo muy importante para todos los que creemos que un buen diseño lo es todo.

Al trabajar con tablas y modelos de tabla propios Java Swing, me surge una gran duda: cuáles funcionalidades deben ser responsabilidad del modelo, si se pretende un buen diseño, y cuáles no? Es decir, una mensaje del tipo getSelected() o getPersona(idPersona), quién debería tener la responsabilidad de responder, el modelo o la tabla?

El problema que tengo es que una de las pantallas del sistema que estoy haciendo con mi equipo de trabajo, muestra (gráficamente) una tabla con los datos de una persona (DNI, Nombre, Domicilio, Teléfono, etc.). Para manejar esa tabla, hice un modelo propio, una clase que extiende a Abstract Table Model.

Ahora, cuando el usuario elije una persona y aprieta un botón (Eliminar), yo tengo que saber quién es esta persona, y eliminarla de la BD. Por eso necesito un mensaje del tipo "getPersona" (o algo similar) para después decirle a un gestor de base de datos la persona que quiero eliminar.

Bueno, desde ya
Muchas gracias.

Emanuel.

0voto

codeando comentado

si e entendido tu pregunta me avisas.
hace algun tiempo realize un sistema y me puse a indagar para doder darle un buen estilo amis Jtable, pintar las celdas. las columnas etc. quisas es eso o me equivoco.

1 Respuesta

2votos

Leonardo-Tadei Puntos227320

Hola Emanuel,

no estoy seguro de comprender tu pregunta, o estás mezclando conceptos... el modelo relacional (las tablas) y el modelo de la POO tienen un desajuste por impedancia tal, que es imposible pasar de uno a otro.

Un mensaje del tipo getPersona(idPersona) en un buen diseño no debería existir, porque no debería ser responsabilidad de la clase Persona el almacenarse o hidratarse, sino responsabilidad de las clases que se encarguen de la Persistencia.

Después viene una cosa peor, que es pensar quien devuelve una colección de Personas. Hay implmentaciones en que esto lo devuelve también un Objeto de clase Persona, con lo que el Objeto tiene una crisis de identidad, porque es una persona pero también conoce a todas las demás, lo cual es absurdo (pero que se ve, lamentablemente, bastante).

Si estás en Java, podés usar alguna de las excelentes Bases de Objetos que hay, como Gemstone, etc. Si vas a almacenar en un RDBMS, podrías usar un ORM como Hibernate, que soluciona el problema de la persistencia. Con este tipo de herramientas, la pregunta misma casi que carece de sentido.

Saludos cordiales!

0voto

EmanuelVelzi comentado

Señor, ante todo muchas gracias por su atención.

Realmente me disculpo, porque viendo su respuesta, recién ahora capto la ambigüedad que acompañaba mi pregunta.

En realidad yo apuntaba a las tablas y los modelos de tablas de la interfaz de usuario Swing de Java.

El problema que tengo es que una de las pantallas del sistema que estoy haciendo con mi equipo de trabajo, muestra (gráficamente) una tabla con los datos de una persona (DNI, Nombre, Domicilio, Teléfono, etc.). Para manejar esa tabla, hice un modelo propio, una clase que extiende a Abstract Table Model.

Ahora, cuando el usuario elije una persona y aprieta un botón (Eliminar), yo tengo que saber quién es esta persona, y eliminarla de la BD. Por eso necesito un mensaje del tipo "getPersona" (o algo similar) para después decirle a un gestor de base de datos la persona que quiero eliminar.

El problema es que, pensando en un correcto diseño, me surgió la duda de quién debe darme la información que necesito: la tabla, mediante algún mensaje como "getSelectedRow"; o bien el modelo, mediante algún mensaje como "gerPersonaSeleccionada".

0voto

Leonardo-Tadei comentado

Hola emanuelvelzi,

gracias por tu aclaración: ahora entiendo mucho mejor lo que estás planteando.

Si estás usando una arquitectura MVC, que es lo manda un buen diseño, entonces tu clase SWING que extiende Abstract Table Model es, sin dudas, parte de la Vista. Siendo así, el control de borrar debería enviar aun ControlPersona el mensaje "borrar" con el ID de la Persona correspondiente; así como tenés los distintos datos de la persona para mostrar debés tener su ID también.

Lo que hace luego ControlPersona es validar la entrada e interectuar con el Modelo, que es dónde están las reglas de negocio, para borrar la Persona en cuestión. Luego de esto, envía un mensaje a la Vista diciendo que la acción se realizó (o no e indica el error), para que al recibir el mensaje, la Vista le pida al Modelo su estado actual, que será una lista de Personas pero sin la que se borró.

Así sería una buena implementación de Modelo-Vista-Controlodor.

Dependerá de tu implementación del Modelo cómo se interactue con él para hacer efectivamente el borrado. En el caso de usar por ejemplo Hibernate, el Control pasará al repositorio virtual de Objetos la instancia de la Persona a borrar y nada más, pero esto, insisto, dependerá de tu implementación para la interacción con el RDBMS.

Resumiendo: es responsabilidad de la Vista el saber mostrar datos del Modelo y tener los controles necesarios para manipularlos; es responsabilidad del Control el recibir mensajes de la Vista e interactuar con el Modelo; y será responsabilidad del Modelo el verificar, según las reglas de negocio, si esta Persona se puede borrar.

No sé qué responsabilidades tiene la Persona dentro del Modelo para hacer afirmaciones sobre sus responsabilidades. Esto dependerá de qué métodos tenga la Persona.

Saludos cordiales!

0voto

EmanuelVelzi comentado

Gracias Leonardo, muy atento.

La verdad que más completo imposible.

Saludos, Emanuel.

Editado: cambiado a comentario de la respuesta.

0voto

Leonardo-Tadei comentado

Por nada Emanuel,

recuerda, luego de un tiempo prudencia, sleccionar la respuesta que más te haya servido para que el tema quede cerrado.

Saludos cordiales!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta