Modelado de Dominio para Gestión de Compras en Supermercados
Resumen
¿Cómo organizamos el esquema de compras?
En la parte crucial de la construcción de cualquier sistema, la organización adecuada del esquema de compras es fundamental. Este es el primer paso para asegurar que nuestro supermercado funcione de manera eficaz. Vamos a utilizar la programación orientada al dominio para crear clases específicamente diseñadas que soporten este sistema, ofreciendo una solución robusta y eficiente.
¿Qué clases de dominio necesitamos?
Primero, será esencial crear dos clases de dominio: Purchase y PurchaseItem. Estas clases se diseñarán para mantener todos los atributos y funciones referentes al proceso de compra.
purchaseID: un identificador único de tipo entero para cada compra.
clientID: la identificación del cliente asociada a la compra.
fecha (LocalDateTime): para almacenar la fecha de la compra.
método de pago (String): especifica cómo se realizó el pago.
estado (String): indica si la orden ya se pagó o no. Otras detalles como comentario se pueden manejar aquí también.
items (List of PurchaseItem): una lista de productos incluidos en la compra.
Clase PurchaseItem
publicclassPurchaseItem{privateint productID;privateint quantity;privatedouble total;privateboolean active;// Getters y Setters}
La clase PurchaseItem cubre:
productID: identificador del producto.
quantity: cantidad de este producto en la compra.
total: calcular el total con base en el valor del producto por la cantidad.
active: determina si el producto está activo en la compra.
¿Cómo definir la especificación del repositorio?
El siguiente paso crítico es establecer la especificación para el repositorio que proveerá las funcionalidades requeridas para manejar compras. Para esto, creamos una interfaz denominada PurchasesRepository.
getAll: Devuelve una lista de todas las compras en el supermercado.
getByClient: Accede a las compras realizadas por un cliente en específico.
save: Guarda una nueva compra en el sistema.
Este diseño asegura que en ocasiones de consultar una lista de compras, incluso si un cliente no tiene compras, no cause errores al manejar el resultado.
¿Qué pasos adicionales deben considerarse?
La preparación de este esquema escolarizará los requerimientos funcionales hacia un sistema más ordenado, aumentando su capacidad para adaptarse a los cambios y extender sus funcionalidades. Como recomendación práctica:
Asegurarse de mantener actualizaciones regulares y evaluaciones del esquema para garantizar que refleje nuevas reglas de negocio.
Implementar pruebas automatizadas para validar que cada funcionalidad mantenga la integridad del sistema.
Considerar el uso de patrones de diseño que faciliten la escalabilidad y mantenibilidad del código.
Por último, al fortalecer consecutivamente tu dominio técnico, es esencial seguir experimentando y aprendiendo. La programación y el diseño orientado al dominio proporcionan un camino innovador para seguir desarrollando habilidades claves. ¡Sigue adelante y nunca dejes de aprender!
Aprovecho que no hay comentarios, para decir lo contento que estoy con el curso, me ha tomado un año poder llegar hasta este punto y asimilar todo el contenido. Mi mas sincero reconocimiento profesor @Alejandro Ramírez, todo muy claro y preciso.
Totalmente de acuerdo!, en este curso uno necesita respiros para comprender que es lo que se está haciendo. Pero eso no es señal de que el contenido sea malo, si no que cada clase contiene mucha sustancia. :ok_hand:
Me genera un alivio saber que al igual que me sucedió a mi, ustedes tuvieron que tomarse un pequeño respiro para poder entender algunas cosas.
Las clases "Category", "Product", "Purchase" y "PurchaseItem" a mi parecer deberian ir en el paquete "dto" ya que al final son enviadas al cliente del api (FrontEnd o Otro Sistema Backend) al ser DTO (Data Transfer Object)
Excelente profe Alejandro Ramírez, mejor que todos los cursos de Spring sin desmerecer.
Claro y preciso.
x2
Estuve leyendo varios materiales y cursos, y honestamente, Spring se me hacía algo super complejo. Gracias a este curso, y obviamente al profesor Alejandro, me queda mucho más claro y creo que puedo revisar materiales más complejos y entenderlos sin problema.
Me gusta también como se detiene cada cierto tiempo a explicar la utilidad o función de lo que estamos utilizando, siento que ayuda a no sólo escribir código a ciegas sino que queda claro que es lo que estamos realizando.
Muy completo el curso :D
x2
Que buen profesor y que curso tan detallado. Me saco el sombrero ante tanta excelencia
Antes de ver la clase siempre veo los comentarios y como no hay muchos, quiero decir que estoy muy feliz de haber tomado este curso de Spring, el profesor alejandro explica muy bien los temas, mi app funciona correctamente hasta el momento. Excelente curso
Buenas noches.
Profe, una pequeña pregunta, después de crear un product el auto incremental del id suma uno al id del producto con el id mayor, pero cuando borramos ese último producto agregado, y luego añadimos otro producto, entonces ese valor de id no queda disponible si no que sigue incrmentando, digamos creamos lechuga y se le asigna el id 51, luego la borramos y nuevamente creamos un nuevo producto, digamos berenjena, entonces el id que le asigna ya no es 51 si no 52, como podemos hacer que se base en el id mayor o en alguno que se haya borrado entre la mitad, y que se encuentre disponible?
Esto lo controla el sequence de postgres o del motor de BD que estas usando, las secuencias siempre van incrementando y no se devuelven
Todo genial tanto el contenido, como lo aborda y ejemplifica Alejandro Ramirez, felicitaciones
Profesor no falto colocar en la clase PurchaseItem colocar el Id de id_compra? ya que solo se coloco el id del producto a comprar, si no es así, por que no se colocó?
No la puse porque la única forma de acceder al PurchaseItem es a través de Purchase y desde allí si existe la relación.
En esta clase, cuando implementamos el repositorio puedes ver como se hace para asociar los ítems a la compra (minuto 5:40).
Hola! Tengo una pregunta acá.
El método delete del productservice, es un VOID. Cómo puedo meterlo dentro de un IF?
Los demás lo dijeron y me uno: "Excelentes clases"
Se crea una interfaz en programación para definir un contrato que las clases deben seguir, es decir, especifica qué métodos deben implementarse sin dictar cómo lo hacen. Esto fomenta la programación orientada a objetos, permite la reutilización de código y la separación de responsabilidades.
Aunque el código puede funcionar sin interfaces, su uso mejora la escalabilidad y la mantenibilidad, especialmente en proyectos grandes. Sin embargo, es buena práctica usarlas cuando se busca flexibilidad y un diseño más limpio.
En lugar de Optional<List>, que se me hace muuuuuy confuso, es más claro mantener simplemente List que puede ser vacía
Muy contento del curso que estamos realizando!
Gracias profesor y comunidad 🥰
Muy didácticas las clases.
Excelente curso! 🧡🚀
Para la fecha de creacion de este proyecto no existian las Anotaciones @Data y @Builder ?
venia tan bien, hasta q dejo de compilar y no se xq
Caused by: org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'jpaMappingContext':Invocationof init method failed; nested exception is org.hibernate.service.spi.ServiceException:Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]