Sunteți pe pagina 1din 6

Problema

Se deber desarrollar un sistema que permita gestionar las Ordenes de


Despacho (O/D) de un pequeo distribuidor de productos.
Particularmente el sistema deber permitir generar, consultar,
modificar y eliminar O/D, junto con todos los otros datos asociados.

Ejemplo (incompleto) de desarrollo de una Las O/D son documentos que contienen un nmero identificador, los
datos del cliente al cual van dirigidas y una lista de productos con sus
aplicacin en Java cantidades y precios a despachar.

Se desea que al momento de generar la O/D, el sistema utilice los


Franco Guidi Polanco datos almacenados previamente relativos a clientes y productos. La
Escuela de Ingeniera Industrial aplicacin, por lo tanto, deber mantener tambin estos datos.
Pontificia Universidad Catlica de Valparaso, Chile
fguidi@ucv.cl

Franco Guidi Polanco 2

Problema (cont.) Modelo de Anlisis: primera aproximacin

Ejemplo de una O/D: O/D Cliente


nmero 0..* 1..1 rut
ACME, INC.
N 0162353 precio total razn social
ORDEN DE DESPACHO impuesto direccin
0..* Producto en O/D telfono
RUT Cliente: 1.111.111-3 Razn Social: COYOTE Y ASOCIADOS
Direccin: Camino Troncal 2734, Villa Alemana
cantidad
Telfono: 64654522
0..*
Detalle
Cdigo Nombre Unidad Cantidad Precio unit Total ($) Producto ACME, INC.
N 0162353
ORDEN DE DESPACHO
L323 Lanzacohetes un 2 15.500 31.000 cdigo RUT Cliente: 1.111.111-3 Razn Social: COYOTE Y ASOCIADOS
M001 Maz para correcaminos kg 50 2.000 100.000
P1189 Pintura invisible galn 2 7.000 14.000 nombre Direccin: Camino Troncal 2734, Villa Alemana
Telfono: 64654522
unidad Detalle
Cdigo Nombre Unidad Cantidad Precio unit Total ($)
Subtotal: $ 145.000 precio unitario L323 Lanzacohetes un 2 15.500 31.000
M001 Maz para correcaminos kg 50 2.000 100.000
Impuesto (10%): $ 14.500 P1189 Pintura invisible galn 2 7.000 14.000

Total: $ 159.500 Subtotal: $ 145.000


Impuesto (10%): $ 14.500

Total: $ 159.500

Franco Guidi Polanco 3 Franco Guidi Polanco 4


Modelo de Anlisis: modelo refinado I Modelo de Anlisis: modelo refinado II

Notamos relacin TODO-PARTE entre O/D y Producto en Notamos que una actualizacin en los precios de producto,
O/D modificara la informacin de O/D registradas. Luego es
O/D necesario registrar el precio unitario en el Producto en O/D:
Cliente
0..* 1..1
nmero rut
precio total razn social O/D Cliente
impuesto direccin nmero
0..* 1..1
rut
telfono precio total razn social
impuesto direccin
telfono
0..*
Producto en O/D Producto
0..* 1..1 Producto
cdigo 0..*
cantidad nombre Producto en O/D cdigo
0..* 1..1 nombre
unidad
cantidad unidad
precio unitario
precio unitario precio unitario
Franco Guidi Polanco 5 Franco Guidi Polanco 6

Modelo de Anlisis: comentarios respecto del


Cmo se ve el modelo en un caso?
modelo refinado II
:Cliente
Razonamiento anlogo al anterior, nos Diagrama de objetos: rut=1.111.111-3
razn social= COYOTE Y ASOC.
puede conducir a cuestionar la relacin :O/D direccin=camiino Troncal
telfono=64654522
entre O/D y Cliente: Qu pasa si se nmero=162353
precio total=159500 :Producto
actualizan los datos del cliente? (ej. impuesto=10%
cdigo=L323
cambio de telfono?) nombre=Lanzacohetes
:Producto en O/D unidad=un
cantidad=2 precio unitario=15500
O/D Cliente en O/D Cliente precio unitario=15500 :Producto
1..1 1..1 0..* 1..1 rut
nmero direccin cdigo=M001
razn social :Producto en O/D
precio total telfono nombre=Maz para correcaminos
impuesto direccin cantidad=50 unidad=kg
telfono precio unitario=2000 precio unitario=2000

:Producto en O/D :Producto

cantidad=2 cdigo=P1189
precio unitario=7000 nombre=Pintura invisible
unidad=galn
precio unitario=7000
Franco Guidi Polanco 7 Franco Guidi Polanco 8
Modelo de Diseo: consideraciones a la primera
Modelo de Diseo: primera aproximacin
aproximacin
El precio total de la O/D ser almacenado en una variable de instancia El modelo establece que una O/D debe estar asociada siempre a un
o calculado sumando los precios unitarios de los Productos en O/D?... Cliente Podemos forzar esto?
No importa, encapsulemos el proceso de obtencin dentro de un S:
mtodo. Incluyendo como parmetro del constructor de O/D una referencia a
Cliente. Podemos, incluso, generar una excepcin en la instanciacin de
OrdenDespacho Cliente O/D si la referencia a cliente pasada por parmetro tiene valor null.
0..* 1..1 Si admitimos un mtodo setCliente, verificando que este mtodo no
nmero rut
contenga una referencia null.
impuesto raznSocial
direccin
getPrecioTotal() OrdenDespacho Cliente
telfono 0..* 1..1
nmero rut
impuesto raznSocial
Producto direccin
0..* setCliente(c:Cliente) telfono
cdigo getPrecioTotal()
Producto en OD setCliente(c:Cliente){
0..* 1..1 nombre OD(cliente:Cliente) if(c != null)
cantidad unidad cliente = c;
precioUnitario precioUnitario }

Franco Guidi Polanco 9 Franco Guidi Polanco 10

Modelo de Diseo: segunda versin Modelo de Diseo: tercera versin

OrdenDespacho Agregamos mtodos y constructores OrdenDespacho Navegabilidad:


nmero: String -nmero: String
impuesto: float -impuesto: float
setCliente(c:Cliente) Cliente setCliente(c:Cliente) 0..* 1..1 Cliente
0..* 1..1
getCliente(): Cliente rut:String getCliente(): Cliente -rut:String
getNumero(): int raznSocial:String getNumero(): int -raznSocial:String
getPrecioTotal(): int Producto direccin:String getPrecioTotal(): int -direccin:String
telfono:String Producto -telfono:String
OD(nmero:int, cliente:Cliente OD(nmero:int, cliente:Cliente
impuesto:float) cdigo:String impuesto:float) -cdigo:String
getRut():String getRut():String
nombre:String -nombre:String
getRaznSocial():String getRaznSocial():String
unidad:String -unidad:String
getDireccin():String getDireccin():String
precioUnitario:int -precioUnitario:int
0..*
getTelfono():String 0..*
getTelfono():String
getCdigo():String Cliente(rut:String,rs:String, getCdigo():String Cliente(rut:String,rs:String,
ProductoEnOD getNombre():String dir:String,tel:String) ProductoEnOD getNombre():String dir:String,tel:String)
getUnidad():String getUnidad():String
cantidad:int -cantidad:int
0..* 1..1 setPrecioUnitario(p:int) 0..* 1..1 setPrecioUnitario(p:int)
precioUnitario:int -precioUnitario:int
getPrecioUnitario()String getPrecioUnitario()String
setCantidad(c:int) setCantidad(c:int) Producto(cod:String,
Producto(cod:String,
getCantidad():int getCantidad():int nom:String, un:String,
nom:String, un:String,
setPrecioUnitario(p:int) setPrecioUnitario(p:int) pu:int)
pu:int)
getPrecioUnitario():int getPrecioUnitario():int
Franco Guidi Polanco 11 Franco Guidi Polanco 12
Modelo de Diseo: cuarta versin Modelo de Diseo: cuarta versin (completa)
OrdenDespacho
OrdenDespacho Cmo agregamos productos a la
-nmero: String
-nmero: String O/D? -impuesto: float
-impuesto: float
setCliente(c:Cliente) 0..* 1..1 Cliente
setCliente(c:Cliente) getCliente(): Cliente -rut:String
getCliente(): Cliente getNumero(): int -raznSocial:String
getNumero(): int getPrecioTotal(): int -direccin:String
getPrecioTotal(): int addProducto(p:Producto,cant:int) Producto -telfono:String
addProducto(p:Producto,cant:int) OD(nmero:int, cliente:Cliente -cdigo:String getRut():String
OD(nmero:int, cliente:Cliente impuesto:float)
Producto -nombre:String getRaznSocial():String
impuesto:float)
-unidad:String getDireccin():String
-cdigo:String -precioUnitario:int
-nombre:String 0..*
getTelfono():String
getCdigo():String Cliente(rut:String,rs:String,
ProductoEnOD -unidad:String
ProductoEnOD getNombre():String dir:String,tel:String)
0..* -precioUnitario:int
-cantidad:int getUnidad():String
-cantidad:int
-precioUnitario:int 0..* 1..1 getCdigo():String 0..* 1..1 setPrecioUnitario(p:int)
getNombre():String -precioUnitario:int
setCantidad(c:int) getPrecioUnitario()String
getUnidad():String setCantidad(c:int) Producto(cod:String,
getCantidad():int
setPrecioUnitario(p:int) setPrecioUnitario(p:int) getCantidad():int nom:String, un:String,
getPrecioUnitario():int getPrecioUnitario()String setPrecioUnitario(p:int) pu:int)
getPrecioUnitario():int
Franco Guidi Polanco 13 Franco Guidi Polanco 14

Cmo implementamos las asociaciones en Java? Cmo implementamos las asociaciones en Java?
OrdenDespacho
Cliente
OrdenDespacho Implementaciones alternativas
-nmero: String -rut:String -nmero: String de la asociacin de O/D y
-impuesto: float -raznSocial:String -impuesto: float Producto en O/D (entre otras)
-direccin:String
setCliente(c:Cliente) 0..* 1..1 setCliente(c:Cliente)
-telfono:String public class OrdenDespacho{
getCliente(): Cliente getCliente(): Cliente
getNumero(): int getRut():String getNumero(): int private String nmero;
getPrecioTotal(): int getRaznSocial():String getPrecioTotal(): int private float impuesto;
addProducto(p:Producto,cant:int) getDireccin():String addProducto(p:Producto,cant:int) private Cliente cliente;
OD(nmero:int, cliente:Cliente getTelfono():String OD(nmero:int, cliente:Cliente private ProductoEnOD[] productoEnOD;
impuesto:float) Cliente(rut:String,rs:String, impuesto:float)
dir:String,tel:String)
}
0..* import java.util.Vector;
public class OrdenDespacho{
public class OrdenDespacho{
private String nmero; Implementacin de la ProductoEnOD
private String nmero;
private float impuesto; -cantidad:int
private Cliente cliente;
asociacin O/D con -precioUnitario:int private float impuesto;
private Cliente cliente;
Cliente setCantidad(c:int)
getCantidad():int private Vector productoEnOD;
} setPrecioUnitario(p:int)
getPrecioUnitario():int }
Franco Guidi Polanco 15 Franco Guidi Polanco 16
Cmo implementamos las asociaciones en Java? Modelo de Diseo: qu falta?
Producto
ProductoEnOD Implementacin Cmo mantenemos los datos de O/D,
-cdigo:String
-cantidad:int -nombre:String de asociacin Clientes y Productos en la aplicacin?
-precioUnitario:int 0..* 1..1
setCantidad(c:int)
-unidad:String entre Podramos manejarlos en arreglos o
-precioUnitario:int
getCantidad():int getCdigo():String ProductoEnOD y Vectores:
setPrecioUnitario(p:int)
getPrecioUnitario():int
getNombre():String Producto
getUnidad():String
setPrecioUnitario(p:int)
public class SistemaOrdenes{
getPrecioUnitario()String
Producto(cod:String, public static void main(String[] arg){
nom:string, un:string,
pu:int) Cliente[] cliente = new Cliente[10000];
OD[] od = new OD[10000];
public class ProductoEnOD{ Producto[] = new Producto[10000];
private int cantidad;
private int precioUnitario; }
private Producto producto; }

}
Franco Guidi Polanco 17 Franco Guidi Polanco 18

Observacin a la utilizacin de arreglos Conveniencia de utilizar colecciones


public class SistemaOrdenes{
La aplicacin es public static void main(String[] arg){ Es conveniente utilizar clases que permitan mantener datos
responsable de manejar de Clientes, O/D y Productos:
los arreglos (Clientes, O/D Cliente[] cliente = new Cliente[10000];
OD[] od = new OD[10000];
y Productos): Producto[] = new Producto[10000]; listaOD:Lista
identificar posiciones
disponibles
// agregar un Cliente
no acceder a posiciones for(int i=0;i<cliente.length;i++){
N01:OD N02:OD N99:OD
inexistentes if( cliente[i] == null )
listaProductos:Lista

realizar bsquedas etc


etc.
// agregar un Producto Perno:Producto Golilla:Producto
for(int i=0;i<producto.length;i++){
if( producto[i] == null ) listaClientes:Lista
etc

} Inducap:Cliente Acme:Cliente Insumor:Cliente
}
Franco Guidi Polanco 19 Franco Guidi Polanco 20
Implementacin de Listas Implementacin de Listas
public abstract class Lista{
private Object[] elem = new Object[10000];
private int posLibre = 0; La implementacin de estas colecciones reduce las
Lista
public boolean agregar(Object o){ responsabilidades de la aplicacin:
if(posLibre < elem.length){
{abstract} elem[posLibre] = o;
posLibre++; public class SistemaOrdenes{
-elemento:Object return true; public static void main(String[] arg){
-posLibre:int }
return false;
agregar(o:Object) } ListaClientes listaCliente = new ListaClientes();
buscar(clave:String):Object {abstract} ListaOD listaOd = new ListaOD();
eliminar(clave:String) public abstract buscar(String clave); ListaProducto listaProducto= new ListaProductos();
public boolean eliminar(Object o){

for(int i:=0; i<posLibre; i++ ){
if( elem[i]==o){ // agregar un Cliente
...
listaCliente.agregar( nuevoCliente );

// agregar un Producto
ListaOD ListaClientes ListaProductos listaProducto.agregar( nuevoProducto );
}
buscar(clave:String):Object buscar(clave:String):Object buscar(clave:String):Object }

Franco Guidi Polanco 21 Franco Guidi Polanco 22

Finalmente nuestro modelo: Refinamiento sucesivo

Lista
{abstract}
Podramos definir un nico tipo de lista para
manipular todas las colecciones?
Respuesta: S.
ListaOD ListaClientes ListaProductos
Pregunta Cmo? Con uso adecuado de abstracciones
(ver principio de inversin de dependencia). Tarea.
0..* 0..*
0..* 1..1 Adems podramos utilizar Generics de Java.
OrdenDespacho Cliente
Se sugiere revisar adems el Java Collections
0..*
0..* Framework.
0..* 1..1
ProductoEnOD Producto

Qu diferencia existe entre las clases indicadas en celeste


y las restantes clases?
Franco Guidi Polanco 23 Franco Guidi Polanco 24

S-ar putea să vă placă și