Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Vurkolak en 14 Agosto 2020, 10:53 am



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