Hola!
Quería saber si el siguiente modelo estaba bien (adjunto enunciado)
Una librería vende productos que se dividen en las siguientes categorías: libros, artículos de librería, revistas y periódicos. Las revistas y periódicos tienen una periodicidad que mediremos en cantidad de veces al mes que se publican. Todos los productos tienen un precio asociado. Los artículos de librería tienen además del precio de venta, llevan IVA en la venta. Además el kiosco tiene clientes, de los cuales almacena los datos esenciales incluyendo la dirección, y que productos han comprado en un determinado mes y que suscripciones (a revistas o periódicos) ha adquirido el cliente, los productos que compran los clientes se anotan en su cuenta corriente y se les cobra a fin de mes. El kiosco necesita como funcionalidad saber para un determinado mes cuánto debe cobrarle a cada cliente, y lo mismo para un año entero. Para los clientes registrados en el sistema hay un 5% de descuento sobre todas sus compras y además quienes realizan una suscripción anual existe un 20% de descuento sobre el precio del producto (revista o periódico) al cual se suscriben (este descuento es sobre el precio del producto y no se acumula a otros descuentos).
• Realizar el diagrama de clases correspondiente, detallando los métodos y atributos más
importantes.
Hola Tomás:
Sí, está bien. Aunque hay algunas cuestiones que no quedan del todo claras. Haría falta mostrar un poco más de detalles en algunos métodos como para entender su responsabilidad y evaluar si tiene sentido en tu modelo.
Por ejemplo, no se entiende por qué necesitas que haya un método getPrecio()
y a su vez otro método getDescuento()
. Haría falta un diagrama de secuencia para entender cómo los usás, pero a primera vista da la sensación que se usan para violar el principio "Tell, don't ask" al preguntar primero por el descuento para luego calcular el precio (o al revés, pero, en definitiva, de manera separada). Lo ideal es que haya un único método calcularPrecio()
que aplique el descuento internamente según corresponda. O sino, se podría tener un método aplicarDescuento(int unPrecio) : int
que recibe un precio y devuelve el precio con el descuento aplicado, resolviendo de manera polimórfica cuándo se aplica algún descuento y cuándo no (si no se aplica ninguno simplemente devuelve el mismo precio).
Por otro lado, está faltando en tu modelo una clase Compra (o Venta, dependiendo del punto de vista) que se encargue de relacionar al Cliente con los productos que compró. Fijate que en tu modelo no hay ninguna manera de que el método getCostoMensual()
pueda calcular correctamente los precios de las compras del mes ya que en ninguna parte se registra la fecha. Además, si se llegara a actualizar el precio de un producto, no se le debería cobrar el nuevo precio a fin de mes al cliente si es que realizó la compra cuando el precio era menor.
Modelar una cuenta corriente además te ayudaría a gestionar esas relaciones.
Te recomiendo revisar además las observaciones de esta otra consulta que hubo sobre el mismo ejercicio.
Saludos,
Tomás
Muchísimas gracias Tomás.
Para aclarar algunas dudas:
-La idea de getPrecio() y getDescuento() era generar dos métodos que devolvían para un mismo producto un precio (con un descuento aplicado) para clientes registrados (getDescuento()) y otro precio (sin descuento) para clientes del tipo no registrado. De esta forma un cliente registrado tendría en el método getCostoMensual() un ciclo en el cuál se le envía el mensaje getDescuento() para obtener el precio de cada producto, mientras que un cliente no registrado tendría un ciclo en el cual se envía el mensaje getPrecio() a cada producto para obtener el precio. Se me ocurrió implementar dos métodos de esta forma ya que si no el Producto debería saber quién le está mandando el mensaje (un cliente registrado/no registrado).
OK, no lo termino de visualizar completamente pero suena válido. El tema es que todo eso que comentás no queda comunicado en tu diagrama. De alguna manera deberías lograr agregar el detalle justo y necesario para comunicar la justificación de esos métodos. Un diagrama de secuencia ayuda mucho y también algunas anotaciones auxiliares (como la del ejemplo de la página 154 del libro).