Duda respecto a los métodos generados por el proyecto UML

4 views
Skip to first unread message

Angela Devia

unread,
Nov 1, 2009, 1:06:09 PM11/1/09
to is1_unal...@googlegroups.com
Buenas tardes,

Al momento de generar el código del modelo UML, me genera unos métodos que representan una asociación entre la clase Consulta y RealizarVenta dentro de RealizarVenta que son: public Consulta getListadoDeVenta() y public void setListadoDeVenta(Consulta val).

Esta relación la creé con el fin de que RealizarVenta dependiera de una instancia de Inventario (clase que contiene un listado de productos) en Consulta, pero igual tengo una relación entre RealizarVenta e Inventario que sí me permite definir un inventario en RealizarVenta.

Mi pregunta es ¿Cómo puedo mantener esa condición entre Consulta y RealizarVenta a través de los métodos creados por esta relación? Porque o sino estos dos métodos serían innecesarios siendo que le daría valor al inventario dentro de Realizar venta con los métodos creados de la relación RealizarVenta e Inventario.

¿O sino tendría que cambiar la relación entre RealizarVenta y Consulta de asociación a otro tipo?

miguel

unread,
Nov 1, 2009, 2:48:56 PM11/1/09
to is1_unal...@googlegroups.com


El 1 de noviembre de 2009 13:06, Angela Devia <alegn...@gmail.com> escribió:
Buenas tardes,

Buenas tardes Angela,
 
Al momento de generar el código del modelo UML, me genera unos métodos que representan una asociación entre la clase Consulta y RealizarVenta dentro de RealizarVenta que son: public Consulta getListadoDeVenta() y public void setListadoDeVenta(Consulta val).

Por lo que entiendo Consulta es una clase entidad que guardará información de ventas y RealizarVenta es una clase control que ejecutará la acción de vender, verdad?

Esta relación la creé con el fin de que RealizarVenta dependiera de una instancia de Inventario (clase que contiene un listado de productos) en Consulta, pero igual tengo una relación entre RealizarVenta e Inventario que sí me permite definir un inventario en RealizarVenta.

Acá me empecé a perder...

Supongo que tienes una clase entidad "Inventario" que forma una relación con Consulta de manera que Consulta contiene inventarios, verdad?, por otra parte, la clase Inventario tiene una relación con RealizarVenta.

Mi pregunta es ¿Cómo puedo mantener esa condición entre Consulta y RealizarVenta a través de los métodos creados por esta relación? Porque o sino estos dos métodos serían innecesarios siendo que le daría valor al inventario dentro de Realizar venta con los métodos creados de la relación RealizarVenta e Inventario.

La verdad no comprendo muy bien el funcionamiento del modelo ni del caso de uso. Si pudieras enviar adjuntos archivos con imágenes del diagrama de clases y el de secuencia (de tenerlo) o la especificación paso a paso del caso de uso quizás pueda colaborarte, pero en realidad no me queda claro el punto de tu duda.

¿O sino tendría que cambiar la relación entre RealizarVenta y Consulta de asociación a otro tipo?

Espero entonces más información, hasta luego.

--
Miguel Cubides
Ingeniería de Sistemas
Universidad Nacional

Angela Devia

unread,
Nov 1, 2009, 3:47:22 PM11/1/09
to is1_unal...@googlegroups.com
Consulta y RealizarVenta son clases control. Inventario y Producto son clases entidad.

Los diagramas de secuencia que llevo son siguiendo esta lógica, espero que si ven errores, por favor me comenten, en especial Miguel.

Gracias,

ANGELA DEVIA
Estudiante de Ingenieria de Sistemas
Universidad Nacional
Diagrama de secuencia principal Consulta administrador.jpg

miguel

unread,
Nov 1, 2009, 7:52:39 PM11/1/09
to is1_unal...@googlegroups.com
El 1 de noviembre de 2009 15:47, Angela Devia <alegn...@gmail.com> escribió:
Consulta y RealizarVenta son clases control. Inventario y Producto son clases entidad.

Primero, debo recalcar que las clases control, por notación, suelen usar nombres de verbos en infinitivo (quizás con un acompañamiento en camell case), y las entidades son sustantivos, por lo que te recomiendo cambiar el nombre de la clase Consulta.

Los diagramas de secuencia que llevo son siguiendo esta lógica, espero que si ven errores, por favor me comenten, en especial Miguel.

En este diagrama noto ciertas características que no comprendo bien, por ejemplo, tú pides consultar dos productos, uno por nombre y otro por código, creo que en realidad se consultaría solo uno, o qiuzás uno con ambos parámetros, por lo que la secuencia sufriría un cambio.

Bien, una vez realizada esta consulta, creo que en la clase Consulta se guardaría el producto encontrado. Entonces, le pides al frame que muestre el resultado de la consulta, en este punto estás generando una referencia bidireccional de control hacia frontera, de manera que ConsultaPanel tendrá un campo de tipo Consulta y Consulta tendrá un campo de tipo FramePrincipal (no se si es lo qeu realmente deseas), además, FramePrincipal tiene un campo de tipo ResultadosDeConsultaPanel y este último tiene un campo de tipo Consulta; acá, o bien le pasas la instancia que tienes de Consulta como parámetro o a través de un método de acceso (set) desde el Frame hacia el panel, o bien usas alguna estrategia para obtener la consulta que tienes instanciada (para no perder la búsqueda que ya has ejecutado).

En este punto, no comprendo bien para qué ejecutas todos los get desde Consulta hacia Producto, si deseas mostrarlos en el panel creo qeu deberías pasarle el producto entero al panel y él se encargaría de ejecutar las consultas a los diferentes campos del producto para mostrarlo en los componentes necesarios.

En el siguiente paso, parece que estás consultando si existe suficiente cantidad de productos en existencia del seleccionado. Recuerda que este producto ya estaba instanciado en la clase control, entonces creo que es innecesario realizar nuevamente la búsqueda, simplemente podrías obtener la cantidad de productos en existencia. Una vez hagas esto te recomiendo que retornes un booleano que le ofrezca inforamción a la frontera acerca de qué acción tomar.

En este punto creo que es cuando viene la duda inicial, pero por lo que he entendido solo has hecho consulta de un único producto para tu venta, y este lo mantienes en Consulta, pero pues asumo que las operaciones anteriores se podrán repetir mientras el usuario así lo desee, en cuyo caso tendrías un listado de productos (creo que tú lo manejas como un "inventario" pero en realidad me parece más apropiado manejarlo como un listado de productos con cantidades asociadas), esto lo puedes hacer mediante una tabla, que podría estar en el panel ListadoDeVentaPanel para la presentación gráfica, y además, debido a que has estado consultando las cantidades de productos existentes en inventario a través de tu control y para esto le has dicho cuántos necesitas, también podrías ir guardándolos en la clase control. De esta manera, cuando vayas a crear tu venta no le setearías un inventario, sino que le pasarías un listado de productos y cantidades solicitadas como parámetro al método que tú desees.


Gracias,

ANGELA DEVIA
Estudiante de Ingenieria de Sistemas
Universidad Nacional


Con gusto, espero haber aclarado un poco el tema (o por lo menos no haberte confundido más), hasta luego.

Angela Devia

unread,
Nov 1, 2009, 9:08:39 PM11/1/09
to is1_unal...@googlegroups.com
El 1 de noviembre de 2009 19:52, miguel <mcub...@gmail.com> escribió:


El 1 de noviembre de 2009 15:47, Angela Devia <alegn...@gmail.com> escribió:

Consulta y RealizarVenta son clases control. Inventario y Producto son clases entidad.

Primero, debo recalcar que las clases control, por notación, suelen usar nombres de verbos en infinitivo (quizás con un acompañamiento en camell case), y las entidades son sustantivos, por lo que te recomiendo cambiar el nombre de la clase Consulta.

Ok, corregido.
 

Los diagramas de secuencia que llevo son siguiendo esta lógica, espero que si ven errores, por favor me comenten, en especial Miguel.

En este diagrama noto ciertas características que no comprendo bien, por ejemplo, tú pides consultar dos productos, uno por nombre y otro por código, creo que en realidad se consultaría solo uno, o qiuzás uno con ambos parámetros, por lo que la secuencia sufriría un cambio.

Ok, corregido. 


Bien, una vez realizada esta consulta, creo que en la clase Consulta se guardaría el producto encontrado.

Yo supondría que toca crear previamente un Inventario que contenga el listado de los productos que se consulten.
 
Entonces, le pides al frame que muestre el resultado de la consulta, en este punto estás generando una referencia bidireccional de control hacia frontera, de manera que ConsultaPanel tendrá un campo de tipo Consulta y Consulta tendrá un campo de tipo FramePrincipal (no se si es lo qeu realmente deseas),

No! Lo que yo busco es que al momento de que se obtiene un listado de productos, que son resultado de la consulta y se obtienen al recorrer todos los productos en Inventario, se muestre el panel ResultadoDeConsultaPanel y que este sólo obtenga el listado que es resultado de la búsqueda, de ahí se elige sólo un producto y se modifica el campo numExistencias que ahí ya que no habría riesgo siendo que es una copia del producto original y se copiaría en otro listado de productos que seria "listadoDeVenta" el cual trato de mostrar con el panel ListadoDeVentaPanel.
 
además, FramePrincipal tiene un campo de tipo ResultadosDeConsultaPanel y este último tiene un campo de tipo Consulta; acá, o bien le pasas la instancia que tienes de Consulta como parámetro o a través de un método de acceso (set) desde el Frame hacia el panel, o bien usas alguna estrategia para obtener la consulta que tienes instanciada (para no perder la búsqueda que ya has ejecutado).

¿? No entiendo
 

En este punto, no comprendo bien para qué ejecutas todos los get desde Consulta hacia Producto, si deseas mostrarlos en el panel creo qeu deberías pasarle el producto entero al panel y él se encargaría de ejecutar las consultas a los diferentes campos del producto para mostrarlo en los componentes necesarios.

Pues, según lo que dices, sería que los paneles tuvieran acceso a Producto para ejecutar los get y llenar los campos a mostrar, eso sí se puede implementar.


En el siguiente paso, parece que estás consultando si existe suficiente cantidad de productos en existencia del seleccionado. Recuerda que este producto ya estaba instanciado en la clase control, entonces creo que es innecesario realizar nuevamente la búsqueda, simplemente podrías obtener la cantidad de productos en existencia. Una vez hagas esto te recomiendo que retornes un booleano que le ofrezca inforamción a la frontera acerca de qué acción tomar.

Realmente tengo varias dudas respecto a comunicación entre clases control y frontera:

1.¿Las clases control no deberían entonces llamar funciones de frontera sino que sólo frontera pueda llamar a control y que espere su respuesta? Esto siendo que puede haber más de un tipo de respuesta desde una control o que control necesite mostrar mensajes.

2.Tengo entendido que una recomendación es una clase control por cada frontera, pero aquí trato de mantener todo en una clase para que no se pierda o se interprete mal la información, por eso relaciono así control con frontera. ¿sigue siendo mala práctica?

3.¿Cómo podría mostrar información de varios productos siendo que el número de los productos nunca es constante y cambiaría posiblemente el tamaño de la pantalla? ¿Cuál sería una buena estrategia a implementar para mostrar un listado de productos en pantalla el cual quiero seleccionar para modificar?
 

En este punto creo que es cuando viene la duda inicial, pero por lo que he entendido solo has hecho consulta de un único producto para tu venta, y este lo mantienes en Consulta, pero pues asumo que las operaciones anteriores se podrán repetir mientras el usuario así lo desee, en cuyo caso tendrías un listado de productos (creo que tú lo manejas como un "inventario" pero en realidad me parece más apropiado manejarlo como un listado de productos con cantidades asociadas), esto lo puedes hacer mediante una tabla, que podría estar en el panel ListadoDeVentaPanel para la presentación gráfica, y además, debido a que has estado consultando las cantidades de productos existentes en inventario a través de tu control y para esto le has dicho cuántos necesitas, también podrías ir guardándolos en la clase control. De esta manera, cuando vayas a crear tu venta no le setearías un inventario, sino que le pasarías un listado de productos y cantidades solicitadas como parámetro al método que tú desees.
 
Bueno, pues ya entendí que a pesar de que Inventario contenga productos y que posiblemente lo que intento es copiar esos productos en consulta 2 veces en un Inventario nuevo, es mejor usar ArrayList<Producto> para manejar la información de productos en la consulta.
 


Gracias,

ANGELA DEVIA
Estudiante de Ingenieria de Sistemas
Universidad Nacional


Con gusto, espero haber aclarado un poco el tema (o por lo menos no haberte confundido más), hasta luego.

Pues, la verdad si me surgen algunas dudas 


--
Miguel Cubides
Ingeniería de Sistemas
Universidad Nacional

Gracias por la ayuda, 

1AE.png

miguel

unread,
Nov 1, 2009, 10:03:44 PM11/1/09
to is1_unal...@googlegroups.com


Bien, una vez realizada esta consulta, creo que en la clase Consulta se guardaría el producto encontrado.

Yo supondría que toca crear previamente un Inventario que contenga el listado de los productos que se consulten.

Bien, había entendido mal el concepto de "inventario", pensé que sería el inventario del almacén, pero parece que te refieres a una colección de productos que podrían ser los que se venderán, en ese caso está bien el acercamiento.
 
 
Entonces, le pides al frame que muestre el resultado de la consulta, en este punto estás generando una referencia bidireccional de control hacia frontera, de manera que ConsultaPanel tendrá un campo de tipo Consulta y Consulta tendrá un campo de tipo FramePrincipal (no se si es lo qeu realmente deseas),

No! Lo que yo busco es que al momento de que se obtiene un listado de productos, que son resultado de la consulta y se obtienen al recorrer todos los productos en Inventario, se muestre el panel ResultadoDeConsultaPanel y que este sólo obtenga el listado que es resultado de la búsqueda, de ahí se elige sólo un producto y se modifica el campo numExistencias que ahí ya que no habría riesgo siendo que es una copia del producto original y se copiaría en otro listado de productos que seria "listadoDeVenta" el cual trato de mostrar con el panel ListadoDeVentaPanel.

En este caso no sería más conveniente hacer una tabla dinámica paginada con filtro? de manera que obtengas tus productos (por demanda. digamos de a 20) y que permitas filtrar a través de un campo? esto creo que haría más atractiva la aplicación y no sería muy difícil de trabajar

 
además, FramePrincipal tiene un campo de tipo ResultadosDeConsultaPanel y este último tiene un campo de tipo Consulta; acá, o bien le pasas la instancia que tienes de Consulta como parámetro o a través de un método de acceso (set) desde el Frame hacia el panel, o bien usas alguna estrategia para obtener la consulta que tienes instanciada (para no perder la búsqueda que ya has ejecutado).

¿? No entiendo

En el diagrama de secuencia todos los mensajes van de un objeto hacia otro (que puede ser él mismo) y, para poder hacer esta comunicación, el objeto de la primer clase (la que ejecuta el llamado) deberá tener una instancia del objeto de la segunda (en la que se contendrá la operación que se define en el mensaje). Por esta razón, según tu esquema, existen las asociaciones y contenencias que definí anteriormente.

Ahora bien, tu panel ResultadosDeConsultaPanel va a mostrar el inventario que ha sido consultado, este inventario está en una instancia de la clase Consulta, y esta instancia ya fué liberada (lo último que hizo fué solicitar una operación al FramePrincipal, por lo que muy probablemente, al solicitar el inventario, lo harás mediante una nueva instancia de dicha clase, con lo que perderías la información del inventario que habías consultado previamente. Para evitar esto es que te sugiero que no liberes tu objeto Consulta, sino que lo envíes como parámetro o a través de métodos de acceso hasta el objeto de la clase ResultadosDeConsultaPanel (la segunda opción que te propuse sería a través de estrategias de ingeniería más avanzadas, pero, que si conoces, serían de gran utilidad).

Para clarificar un poco mejor, necesitaría un diagrama de clases para comprender cómo presentas la contenencia (de hecho sería mucho mejor uno de objetos, pero no se si lo has utilizado).
 
 

En este punto, no comprendo bien para qué ejecutas todos los get desde Consulta hacia Producto, si deseas mostrarlos en el panel creo qeu deberías pasarle el producto entero al panel y él se encargaría de ejecutar las consultas a los diferentes campos del producto para mostrarlo en los componentes necesarios.

Pues, según lo que dices, sería que los paneles tuvieran acceso a Producto para ejecutar los get y llenar los campos a mostrar, eso sí se puede implementar.

Claro que se puede implementar, pero entonces sería a través de los páneles y no de la clase control. Tú harías algo como:

String nombre = miProducto.getNombre();
nombreTF.setText(nombre);

Como notarás, es en el momento de mostrar el nombre que haces la consulta por el getCampo y no desde el control.


En el siguiente paso, parece que estás consultando si existe suficiente cantidad de productos en existencia del seleccionado. Recuerda que este producto ya estaba instanciado en la clase control, entonces creo que es innecesario realizar nuevamente la búsqueda, simplemente podrías obtener la cantidad de productos en existencia. Una vez hagas esto te recomiendo que retornes un booleano que le ofrezca inforamción a la frontera acerca de qué acción tomar.

Realmente tengo varias dudas respecto a comunicación entre clases control y frontera:

Veamos las dudas

1.¿Las clases control no deberían entonces llamar funciones de frontera sino que sólo frontera pueda llamar a control y que espere su respuesta? Esto siendo que puede haber más de un tipo de respuesta desde una control o que control necesite mostrar mensajes.

Exacto, esta es la diferencia entre un mensaje sincrónico y uno asincrónico en un diagrama de secuencia:
Si es sincrónico, el objeto de la clase que recibe el mensaje retornará una respuesta a través de un nuevo mensaje
Si es asincrónico, el objeto de la clase que recibe el mensaje puede retornar a manera de respuesta del mensaje (retorno de un método) el resultado.


2.Tengo entendido que una recomendación es una clase control por cada frontera, pero aquí trato de mantener todo en una clase para que no se pierda o se interprete mal la información, por eso relaciono así control con frontera. ¿sigue siendo mala práctica?

No, no es una mala práctica para nada, solo debes tener presente que, como estás utilizando diferentes clases frontera (igual si utilizaras varios controles para una frontera, o cualquier otra mezcla que necesites) el control no deberá ser reinicializado en ningún momento, de manera que tendrás que enviarlo como parámetros para todos lados (o mantener un apuntador hacia el objeto que estés manipulando en todas las clases frontera, lo cual se lograría con métodos de acceso).

En realidad esta recomendación es para dejar más comprensible el código, ya que si tienes la misma instancia de una clase en diferentes secciones de la aplicación será mucho más complejo su comprendimiento, con lo que se dificultaría el mantenimiento posterior, y todo el software será mantenido, recuerda: deberás desarrollar tu código como si quien fuera a dar mantenimiento a tu aplicación fuera un sicópata asesino que sabe dónde vives tú y toda tu familia.
 
3.¿Cómo podría mostrar información de varios productos siendo que el número de los productos nunca es constante y cambiaría posiblemente el tamaño de la pantalla? ¿Cuál sería una buena estrategia a implementar para mostrar un listado de productos en pantalla el cual quiero seleccionar para modificar?

Como ya te dije anteriormente, podrás utilizar una tabla paginada, esto sería mantener una tabla con una dimensión máxima de X filas, y, de haber más de X filas, habilitarías botones para "siguiente" y "anterior", mostrando la información pertinente. Para esto podrás crear métodos de tipo:

public List<Elemento> obtenerElementos(int indiceInferior, int indiceSuperior){
    return this.elementos.subList(indiceInferior, indiceSuperior);
}
 
 

En este punto creo que es cuando viene la duda inicial, pero por lo que he entendido solo has hecho consulta de un único producto para tu venta, y este lo mantienes en Consulta, pero pues asumo que las operaciones anteriores se podrán repetir mientras el usuario así lo desee, en cuyo caso tendrías un listado de productos (creo que tú lo manejas como un "inventario" pero en realidad me parece más apropiado manejarlo como un listado de productos con cantidades asociadas), esto lo puedes hacer mediante una tabla, que podría estar en el panel ListadoDeVentaPanel para la presentación gráfica, y además, debido a que has estado consultando las cantidades de productos existentes en inventario a través de tu control y para esto le has dicho cuántos necesitas, también podrías ir guardándolos en la clase control. De esta manera, cuando vayas a crear tu venta no le setearías un inventario, sino que le pasarías un listado de productos y cantidades solicitadas como parámetro al método que tú desees.
 
Bueno, pues ya entendí que a pesar de que Inventario contenga productos y que posiblemente lo que intento es copiar esos productos en consulta 2 veces en un Inventario nuevo, es mejor usar ArrayList<Producto> para manejar la información de productos en la consulta.

Cualquiera de las dos maneras estaría bien, solo ten en cuenta que tu aplicación deberá ser lo más comprensible posible, por ejemplo, como ya me sucedió, el nombre "Inventario" puede producir ambigüedad por su significado.
 


Gracias,

ANGELA DEVIA
Estudiante de Ingenieria de Sistemas
Universidad Nacional


Con gusto, espero haber aclarado un poco el tema (o por lo menos no haberte confundido más), hasta luego.

Pues, la verdad si me surgen algunas dudas 

En ese caso espero ir solucionándolas incrementalmente (y no así agregarlas).
 
 

Gracias por la ayuda, 

ANGELA DEVIA
Estudiante de Ingenieria de Sistemas
Universidad Nacional

Con gusto, cualquier nueva duda por favor comunícala.

Hasta luego,
1AE.png
Reply all
Reply to author
Forward
0 new messages