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/0131428489mucho más específico sobre dónde poner las cosas
https://www.amazon.com/Applying-UML-Patterns-Introduction-Object-Oriented/dp/0131489062ya 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/0321125215este es muy bueno donde mi tio grady da una explicación de ejemplos
https://www.amazon.com/Object-Oriented-Analysis-Design-Applications-3rd/dp/020189551Xy recuerda que cuando lees todas las fuentes que te di
lo más importante que entenderás es que ni siquiera estarías gateando