asociacion y multiplicidad

Iniciado por m@o_614, 15 Junio 2012, 23:49 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

Saludos

Alguien que me diga como puedo traducir de un diagrama UML a codigo una asociación entre dos clases que tiene como multiplicidad 1.......*, tengo entendido que significa que una clase puede tener  ninguna o muchas instancia de la otra clase pero no se como implementarlo

gracias


sapito169

#2
Te recomiendo que leas uml for java programer de el tio bob es un libro con una visión pragmática sin fantasías y mentiras ni academicismos falsos (la pura y cruda verdad)

Te corrijo la relación 1 * es de uno a muchos y java no tiene forma nativa de hacerlo
una Orden tiene una o  muchas líneas

según la escuela de pensamiento del diseño dirigido por el modelo apodado  ddd lease "domain driven design quickly"

la relación de 1 a muchos esta bien en el papel (modelando el negocio) pero la realidad es que no hay forma no engorrosa en java la manera mas correcta es  primero creas un objeto vacío(que tiene relación de 0 a muchos) por ejemplo una orden sin líneas y luego mientras el programa corre agregas las líneas de la orden luego ese objeto de negocio ahora llamado "entidad" lo pasamos a otra clase la cual realiza operaciones con la entidad la cual llamaremos "el Servicio" en ella pones la validación de cardinalidad de uno a mucho

segun ivar jacobson

El modo de distribución digase aplicación web programa de consola web service swing llama a servicios (hasta aqui es ddd) pero estos servicios tiene la característica de ser casos de usos llamemos lo Controlador(recomiendo relación de uno a uno entre caso de uso y clase) dentro de estas Clase(caso de uso) realizamos las reglas de negocio del caso de uso.
A si tendríamos clases como RegistroDeOrden ConsultaDeExistencias SubscripcionDeNembresia ConsultaDeNotas
Dentro de el controlador realizamos la validación de que tenga uno a a muchas lineas

También es posible poner la validación de uno a muchos dentro de la clase pero eso no me gusta ponerla ahi

sapito169

#3
segun ivar

Código (java) [Seleccionar]

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Orden {

private List<DetalleOrden> detalleOrdens = new ArrayList<DetalleOrden>();
private Date fecha;

public void agregaDetalle(DetalleOrden detalleOrden) {
detalleOrdens.add(detalleOrden);
}

public DetalleOrden getDetalle(int indice) {
DetalleOrden detalleOrden = detalleOrdens.get(indice);
return new DetalleOrden(detalleOrden.getProducto(),
detalleOrden.getPrecio());
}

public int getCantidad() {
return detalleOrdens.size();
}

public double getTotal() {
double total = 0;
for (DetalleOrden detalleOrden : detalleOrdens) {
total = total + detalleOrden.getPrecio();
}
return total;
}

public void setFecha(Date fecha) {
this.fecha=fecha;

}
}


Código (java) [Seleccionar]

public class RegistroDeOrden implements CasoDeUso {

private final Orden orden = new Orden();
private  final BaseDeDatos baseDeDatos=new BaseDeDatos();

public void agregarDetalle(DetalleOrden detalleOrden) {
if (detalleOrden.getPrecio() < 20) {
throw new ErrorDePrecioMinimo(
"los gerentes no les gustas que los productos que cuesten menos de 20 soles");
}

orden.agregaDetalle(detalleOrden);
}

public void registrar() {
if (orden.getCantidad() < 1 && orden.getCantidad() > 10) {
throw new ErrorDeCantidadDeLineas(
"solo se debe registrar ordenes de entre 1 a 10 lineas");
}
orden.setFecha(new Date());
baseDeDatos.grabar(orden);
}

}


sapito169

forma  pura no la recomiendo
Código (java) [Seleccionar]

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Orden {

private List<DetalleOrden> detalleOrdens = new ArrayList<DetalleOrden>();
private Date fecha;

private Orden() {

}
public Orden(DetalleOrden detalleOrden){
if(detalleOrden==null){
throw new NullPointerException();
}
detalleOrdens.add(detalleOrden);
}

public void agregaDetalle(DetalleOrden detalleOrden) {
detalleOrdens.add(detalleOrden);
}

public DetalleOrden getDetalle(int indice) {
DetalleOrden detalleOrden = detalleOrdens.get(indice);
return new DetalleOrden(detalleOrden.getProducto(),
detalleOrden.getPrecio());
}

public int getCantidad() {
return detalleOrdens.size();
}

public double getTotal() {
double total = 0;
for (DetalleOrden detalleOrden : detalleOrdens) {
total = total + detalleOrden.getPrecio();
}
return total;
}

public void setFecha(Date fecha) {
this.fecha=fecha;

}
}


sapito169

#5
profavor respondanme no me importa respuesta troll ni que critiquen mi codigo
porfavor dime si te sirvio si no entiendes si no estas deacuerdo

otro tema importante quienes de ustedes estan deacuerdo en tener una sona de Negocio libre de framewors donde solo haya clases comunes y corrientes java entidades y casos de usos totalmente libre de cosas raras alguno de ustedes a trabajdo asi?

Nortis

Muy buen código sapito169, lo deja bien claro.

m@o_614

Muchas gracias sapito169 ahora que vea las relaciones 1 * sabré que una clase debe tener muchas instancias y que tendré que utilizar vectores  :)