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