Título: Relaciones diagramas UML a JAVA (código) Publicado por: Vurkolak en 14 Agosto 2020, 10:53 am Hola buenos días, intento tratar de entender las relaciones de clases con UML hasta alli todo bien, el problema empieza cuando tengo las cardinalidades *(muchos) entre dos clases, el problema es que no entiendo donde se deberá declarar el array y luego como utilizarlo, no se si depende de la relación si es agregación o compuesta va de una forma u otra.
un ejemplo: tengo clase hotel tengo clase cliente tengo clase reservas Un cliente solo puede estar en un hotel, mientras que un hotel puede tener muchos clientes la cardinalidad es 1...* Un cliente puede hacer una reserva, mientras que una reserva la pueden hacer muchos clientes la cardinalidad 1..* Un hotel puede tener muchas reservas, mientras que una reserva solo puede estar en un hotel la cardinalidad 1...* pues necesito entender donde va el array y como se utiliza luego, otra duda que tengo en una relación de composición como es en este caso cliente-hotel la clase cliente se deberá declarar en la clase hotel?? entiendo que si porque al ser composición si la clase hotel se elimina cliente también desaparecerá no? si estoy diciendo alguna barbaridad me lo deciis sin problemas, ya que estoy empezando con java. Espero que alguien me pueda indicar alguna pagina web o con un ejemplo practico para poderlo entender. Muchas gracias. Saludos. Título: Re: Relaciones diagramas UML a JAVA (código) Publicado por: sapito169 en 18 Agosto 2020, 16:16 pm la composición es solo una cuestión referencial para guiar
en el momento del análisis y diseño nadie entiende como se debe poner en código y nadie le da importancia solo sirve para tener discusiones eternas sin sentido Dependiendo del lenguaje en concreto puede variar bastante en los pequeños detalles y casos limites e internos el ciclo de vida de los objetos en java la regla general es que para eliminar un objeto lo igualas a null y si un objeto no es referenciado por nadie el garbage collector se temo la potestad de liberar la memoria cuando mejor le parezca usando un algoritmo en concreto (mark swep,g1) este proceso en la basta mayoría de veces funciona de maravilla de manera automagica(yo tengo la teoría de que los duendes vienen en la noche y lo hacen por mi como en el cuento) y en los casos que si importa generalmente se hace mal y muere miserable estrepitosamente y escandalosamente la clase cliente se deberá declarar en la clase hotel?? Noooo eso es un muy mal diseño que definitivamente destruirá el rendimiento la aplicación pongas donde lo pongas malogra la ran del proyecto pues necesito entender donde va el array y como se utiliza luego La forma más común de poner el array es en clase contenedora Es mejor que la clase contenedora sea la que tienen el array mejor si es List<T> para mayor facilidad le agregas unos métodos para agregar y eliminar y preferible no poner relaciones cuando pasa por una clase de manera indirecta es mejor evitar relacionar hotel con cliente debido a que hay una clase intermedia reserva puedes evitar usar la clase reserva siempre y cuando no necesitas grabar nada de la reserva Veamos el mismo ejemplo ejemplo sin getters y setters y con clase reserva el sapo aprueba esta manera class hotel{ private int id; private String nombre; } class Reserva{ private int id; private Hotel hotel; private Cliente cliente; private DateTime fechaReserva; } class Cliente{ private int id; private String nombre; private String apellido; } ejemplo getter y setters sin clase reserva muy poca recomendada class hotel{ private int id; private String nombre; private List<Cliente> cliente ; } class Cliente{ private int id; private String nombre; private String apellido; private List<Reserva> cliente ; } tenemos dos formar one to many bidirectional y unidirectional la bidirecional es mejor evitar por que usa más memoria y dejas la posibilidad abierta a bucles infinitos y requiere más cuidado que los frameworks y librerías puedan serializar correctamente sin usar one to many no bidireacional public class Factura{ private int id; private Cliente cliente; private Empleado cajero; private List<DetalleFactura> detalles; public void agregarDetalle(DetalleFactura detalleFactura){ detalles.add(detalleFactura); } public int cantidadLineas(){ return detalles.length(); } public double total(){ return detalles.stream().map(p->p.getTotal()).sum(); } } public class DetalleFactura{ private int codigoDetalle; private int cantidad ; private PrecioProducto precioProducto; public double total(){ return cantidad*precioProducto.getPrecio(); } } public class PrecioProducto { private int id; private Producto producto; private double precio; private DateTime fechaAsignado; } public class Producto{ private int id private String nombre; } ahora bidireccional el sapo no lo aprueba malogra la memora y las librerías public class Factura{ private int id; private Cliente cliente; private Empleado cajero; private List<DetalleFactura> detalles; public void agregarDetalle(DetalleFactura detalleFactura){ detalles.add(detalleFactura); } public int cantidadLineas(){ return detalles.length(); } public double total(){ return detalles.stream().map(p->p.getTotal()).sum(); } } public class DetalleFactura{ private int codigoDetalle; private int cantidad ; private PrecioProducto precioProducto; public double total(){ return cantidad*precioProducto.getPrecio(); } } public class PrecioProducto { private int id; private Producto producto; private double precio; private DateTime fechaAsignado; private DetalleFactura detalleFactura ; } public class Producto{ private int id private String nombre; List<PrecioProducto> precios; } me baso en varias fuentes yo sigo el ejemplo de los libros de martin fowler que estan muy bien echos y son muy realistas y a la vez muy teórico apegado a dar definiciones y clasificaciones estrictas tiene más que ver con patrones, pero da un montón de ejemplos de como usa el análisis y el diseño en situaciones comunes y reales https://martinfowler.com/eaaCatalog/ mucho más específico y enfocado al tema en cuestión https://www.amazon.com/UML-Java%C2%BF-Programmers-Robert-Martin/dp/0131428489 mucho más específico sobre dónde poner las cosas https://www.amazon.com/Applying-UML-Patterns-Introduction-Object-Oriented/dp/0131489062 ya si quieres algo mucho mas avanzado sobre como lidear software muy complejo como analisar e implementar el dominio https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215 este es muy bueno donde mi tio grady da una explicación de ejemplos https://www.amazon.com/Object-Oriented-Analysis-Design-Applications-3rd/dp/020189551X y recuerda que cuando lees todas las fuentes que te di lo más importante que entenderás es que ni siquiera estarías gateando |