Solución al ejercicio 1. Arquitecturas Software

Anuncio
Solución al ejercicio 1.
Arquitecturas Software
ConsPrecioIU
p: PreciosLN
“interface” PreciosLN
usa calcularPrecio(c1,c2,c3: String): float
Precios
inicializarBD(): void
getPrecio(nombre:String): float
calcularPrecio(kgMan,kgPer,kgNar: String) : float
EN LA PRESENTACIÓN AÑADIMOS UN ATRIBUTO CON LA
LÓGICA DEL NEGOCIO Y MÉTODO PARA ASIGNARLA:
public class ConsPrecioIU extends Frame {
…
PreciosLN pr;
void setLogicaNegocio(PreciosLN p) {pr=n;}
…}
LA LÓGICA DEL NEGOCIO SE DEFINE CON UNA INTERFAZ:
public interface PreciosLN {
public float calcularPrecio(String kgManz,
String kgPer,
String kgNar);
}
LA LÓGICA DEL NEGOCIO SE USA DESDE EL
MÉTODO DE ATENCIÓN AL EVENTO
void button1_actionPerformed(ActionEvent e) {
// En p tenemos el objeto con la lógica del negocio
float precio = p.calcularPrecio(textField1.getText(),
textField2.getText(),
textField3.getText());
Aviso a = new Aviso(this,"Precio es: "+precio);
}
public class Precios implements PreciosLN {
public float calcularPrecio( String kgManz,
String kgPer,
String kgNar) {
float m,p,n;
try{m=Float.parseFloat(kgManz);} catch (Exception ex) {m=0;}
try{p=Float.parseFloat(kgPer);} catch (Exception ex) {p=0;}
try{n=Float.parseFloat(kgNar);} catch (Exception ex) {n=0;}
return m*getPrecio("MANZANAS (Kg.)")+
p*getPrecio("PERAS (Kg.)")+
n*getPrecio("NARANJAS (Kg.)");}
// y los métodos inicializarBD y getPrecio…
}
LA LÓGICA DEL NEGOCIO SE OBTIENE
IMPLEMENTANDO LA INTERFAZ. PARA ELLO
SE REALIZAN LLAMADAS AL NIVEL DE DATOS
Es una solución correcta…
• La solución sigue una arquitectura lógica en
tres niveles (están separadas el nivel de
presentación del nivel lógica del negocio en
clases y el nivel de datos en la BD)
– Presentación: ConsPrecioIU y Aviso
– Lógica del negocio: interfaz PreciosLN y clase Precios
• Es extensible
– Cuando se quiera añadir la regla del negocio para aplicar
descuentos según la cantidad comprada habrá que
reprogramar la clase calcularPrecios de la lógica del
negocio y la BD (para almacenar descuentos, etc.). Pero
NO CAMBIARÁ la clase de presentación
La siguiente solución no es
correcta…
“interface” PreciosLN
ConsPrecioIU
p: PreciosLN
usa
getPrecioMan(): float
getPrecioPer(): float,
getPrecioNar(): float
Precios
inicializarBD(): void
getPrecio(nombre:String): float
getPrecioMan(): float
getPrecioPer(): float,
getPrecioNar(): float
LA LÓGICA DEL NEGOCIO SE USA DESDE EL
MÉTODO DE ATENCIÓN AL EVENTO
void button1_actionPerformed(ActionEvent e) {
// En pr tenemos el objeto con la lógica del negocio
String kgManz = textField1.getText(); // idem. kgPer y KgNar
try{m=Float.parseFloat(kgManz);} catch (Exception ex) {m=0;}
try{p=Float.parseFloat(kgPer);} catch (Exception ex) {p=0;}
try{n=Float.parseFloat(kgNar);} catch (Exception ex) {n=0;}
float precio = m*pr.getPrecioMan()+ p*pr.getPrecioPer() +
n*pr.getPrecioNar();
Aviso a = new Aviso(this,"Precio es: "+precio);}
NO ES EXTENSIBLE. EL PRECIO DE LOS
PRODUCTOS NO DEPENDE DE LA CANTIDAD.
HABRÍA QUE CAMBIAR LA PRESENTACIÓN:
if (m>10) precioMan = pr.getPrecioMan()*0.9;
// idem. con resto de productos y descuentos
La solución propuesta, sin
embargo, no es extensible si se
desea cambiar el número y el
nombre de productos
(lo cual no se pedía en el
enunciado…)
• Una solución extensible ante el
posible cambio “se pueden
consultar los precios de varios
productos” aparece a continuación.
• Para ver si una solución es
extensible hay que saber con
respecto a qué posible cambio es
extensible
void button1_actionPerformed(ActionEvent e) {
// En p tenemos el objeto con la lógica del negocio
Vector datos= new Vector();
datos.addElement(label1.getText());
datos.addElement(textField1.getText());
datos.addElement(label2.getText()); // …
float precio = p.calcularPrecio(datos.elements());
Aviso a = new Aviso(this,"Precio es: "+precio);
}
“interface” PreciosLN
ConsPrecioIU
p: PreciosLN
usa
calcularPrecio(datos: Enumeration): float
obtenerProductos(): Enumeration
Precios
inicializarBD(): void
getPrecio(nombre:String): float
calcularPrecio(PrecCant:Enumeration ) : float
obtenerProductos(): Enumeration
Descargar