Download consultar precios

Document related concepts
no text concepts found
Transcript
1
1
Ejercicio de Arquitecturas
Software
Caso de Uso
CONSULTAR PRECIOS
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
2
La interfaz de usuario
asociada a un caso de
uso llamado
CONSULTAR PRECIO
aparece a continuación,
junto con la clase Java
correspondiente :
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
import java.awt.*;
import java.awt.event.*;
public class ConsPrecioIU extends Frame {
Label label1 = new Label();
Panel panel1 = new Panel();
Button button1 = new Button();
Button button2 = new Button();
Panel panel2 = new Panel();
GridLayout gridLayout1 = new GridLayout(3,2);
Label label2 = new Label();
TextField textField1 = new TextField();
Label label3 = new Label();
TextField textField2 = new TextField();
Label label4 = new Label();
TextField textField3 = new TextField();
public ConsPrecioIU() {
super();
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace(); } }
// Continúa…
2
private void jbInit() throws Exception {
this.setTitle("Frame Title");
label1.setText("CONSULTAR PRECIO");
label1.setAlignment(Label.CENTER);
button1.setLabel("Consultar Precio");
button1.addActionListener(new java.awt.event.ActionListener () {
public void actionPerformed(ActionEvent e) {
button1_actionPerformed(e); } });
button2.setLabel("Cancelar");
button2.addActionListener(new java.awt.event.ActionListener () {
public void actionPerformed(ActionEvent e) {
button2_actionPerformed(e); } });
label2.setText("MANZANAS (Kg.)");
label3.setText("PERAS (Kg.)");
label4.setText("NARANJAS (Kg.)");
panel2.setLayout(gridLayout1);
this.add(label1, BorderLayout.NORTH );
this.add(panel1, BorderLayout.SOUTH );
panel1.add(button1, null);
panel1.add(button2, null);
this.add(panel2, BorderLayout.CENTER );
panel2.add(label2, null);
panel2.add(textField1, null);
panel2.add(label3, null);
panel2.add(textField2, null);
panel2.add(label4, null);
panel2.add(textField3, null);
this.pack();
this.setVisible(true);}
void button1_actionPerformed(ActionEvent e) {...}
void button2_actionPerformed(ActionEvent e) {...}
A. Goñi, J.R. Zubizarreta,}J. Iturrioz. Dpto. LSI, UPV/EHU
3
4
Se dispone también de una clase llamada Aviso que
sirve para crear Dialog modales asociados al objeto
Frame actual. La llamada new Aviso(this,"Pulsa
Aceptar y me voy"); crearía lo siguiente :
Además, nos han proporcionado los siguientes métodos, los
cuales no sabemos ni a qué clase pertenecen ni qué es lo que
hacen exactamente , pero nos han dicho que son útiles para
acceder a los datos almacenados en la siguiente tabla de una
BD Access. Además nos dicen que dicha BD es accesible por
medio de una fuente de datos ODBC llamada PRODS
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
3
5
public void inicializarBD () {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conexion=DriverManager.getConnection("jdbc:odbc:PRODS ");
sentencia=conexion.createStatement(); }
catch(Exception e){System.out.println("Error"+e.toString());} }
public float getPrecio(String nombre) {
try{ rs= sentencia.executeQuery("SELECT PRECIO FROM PRODUCTOS "+
"WHERE NOMBRE='"+nombre+"'");
if (rs.next()) return rs.getFloat("PRECIO");
} catch (Exception e) {System.out.println("Error: "+e.toString());}
return 0; }
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Se pide : Rellenar la clase ConsPrecioIU con el código
necesario para que al pulsar el botón CONSULTAR
PRECIO aparezca como resultado el precio de los
productos escogidos. Por ejemplo, el resultado sería el
siguiente :
si los precios actuales fueran los que aparecen en la tabla
ACCESS anterior y se hubiera pulsado el botón CONSULTAR
PRECIO con los siguientes datos de entrada:
La solución debe basarse en una arquitectura lógica en 3
niveles y ser extensible ante un futuro cambio en la lógica del
negocio, ya que se está pensando en “aplicar porcentajes de
descuento a cada producto dependiendo de la cantidad de Kg.
que se compre”.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
6
4
7
Primera solución
“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
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
8
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
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*p.getPrecioMan()+ p*p.getPrecioPer() +
n*p.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
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
5
9
Segunda Solución
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
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
EN LA PRESENTACIÓN AÑADIMOS UN ATRIBUTO
CON LA LÓGICA DEL NEGOCIO Y MÉTODO PARA
ASIGNARLA:
10
public class ConsPrecioIU extends Frame {
…
PreciosLN p;
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);
}
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
6
11
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);
}
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
12
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
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
7
13
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
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
14
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…)
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
8
15
• 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
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
16
Tercera solución
“interface” PreciosLN
ConsPrecioIU
p: PreciosLN
usa
calcularPrecio(datos : Vector): float
obtenerProductos (): Vector
Precios
inicializarBD(): void
getPrecio(nombre:String): float
calcularPrecio(PrecCant: Vector) : float
obtenerProductos (): Vector
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
9
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);
Aviso a = new Aviso(this,"Precio es: "+precio);
}
“interface” PreciosLN
ConsPrecioIU
p: PreciosLN
17
usa
calcularPrecio(datos : Vector): float
obtenerProductos (): Vector
Precios
inicializarBD(): void
getPrecio(nombre:String): float
calcularPrecio(PrecCant: Vector) : float
obtenerProductos (): Vector
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
18
• El método obtenerProductos() se
necesitará para colocar dichos
productos en la interfaz de usuario…
• Implementad dicho código…
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
10
19
El resto de transparencias no las
he utilizado…
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
20
Nivel de
Presentación
JAVA RMI
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
Nivel Lógica del
Negocio
Nivel de Datos
JAVA JDBC
11
21
Restricciones de los Applets
•
An applet can’t touch the local disk.
– No reading: you wouldn’t want an applet to read and transmit
private information over the Internet without your permission.
– No writing: Writing is prevented, of course, since that would be an
open invitation to a virus.
– Java offers digital signing for applets. Many applet restrictions are
relaxed when you choose to allow trusted applets (those signed by
a trusted source) to have access to your machine.
•
•
Applets can take longer to display, since you must download
the whole thing every time, including a separate server hit for
each different class. Your browser can cache the applet, but
there are no guarantees. Because of this, you should always
package your applets in a JAR (Java ARchive) file that
combines all the applet components (including other .class files
as well as images and sounds) together into a single
compressed file that can be downloaded in a single server
transaction. “Digital signing” is available for each individual entry
in the JAR file.
No puede hacer una conexión de red a otro nodo de Internet
que no sea aquél de donde se ha descargado
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
22
Ventajas de los Applets
•
•
There is no installation issue. An applet has true platform
independence (including the ability to easily play audio files,
etc.) so you don’t need to make any changes in your code for
different platforms nor does anyone have to perform any
“tweaking” on installation. In fact, installation is automatic every
time the user loads the Web page that contains applets, so
updates happen silently and automatically. In traditional
client/server systems, building and installing a new version of
the client software is often a nightmare.
2.You don’t have to worry about bad code causing damage to
someone’s system, because of the security built into the core
Java language and applet structure. This, along with the
previous point, makes Java popular for so-called intranet
client/server applications that live only within a company or
restricted arena of operation where the user environment (Web
browser and add-ins) can be specified and/or controlled.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
12
23
Métodos de los applets
•
•
•
•
•
•
Applets are built using an application framework. You inherit from class
JApplet and override the appropriate methods. There are a few
methods that control the creation and execution of an applet on a Web
page
init( ): Automatically called to perform first-time initialization of the
applet, including component layout. You’ll always override this method.
start( ): Called every time the applet moves into sight on the Web
browser to allow the applet to start up its normal operations (especially
those that are shut off by stop( )). Also called after init( ).
stop( ): Called every time the applet moves out of sight on the Web
browser to allow the applet to shut off expensive operations. Also called
right before destroy( ).
destroy( ): Called when the applet is being unloaded from the page to
perform final release of resources when the applet is no longer used
Note that applets are not required to have a main( ). That’s all wired
into the application framework; you put any startup code in init( ).
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
24
Ejecución de applets
• To run this program you must place it inside a Web
page and view that page inside your Java-enabled
Web browser. To place an applet inside a Web page
you put a special tag inside the HTML source for that
Web page to tell the page how to load and run the
applet.
• Al principio (applets de AWT)
• <applet code=Applet1 width=100 height=50>
</applet>
• Después (Applet de Swing)
• With Internet Explorer, the extension mechanism is
the ActiveX control, and with Netscape it is the plugin. In your HTML code, you must provide tags to
support both.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
13
25
Ejecución de applets
<html><head><title>Applet1</title></head><hr>
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93“ width="100"
height="50" align="baseline" codebase="http://java.sun.com/products/plugin/1.2.2/jinstall1_2_2-win.cab#Version=1,2,2,0">
<PARAM NAME="code" VALUE="Applet1.class">
<PARAM NAME="codebase" VALUE=".">
<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2">
<COMMENT>
<EMBED type="application/x-java-applet;version=1.2.2"
width="200" height="200" align="baseline“ code="Applet1.class" codebase="."
pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html">
<NOEMBED>
</COMMENT>
No Java 2 support for APPLET!!
</NOEMBED>
</EMBED>
</OBJECT>
<hr></body></html>
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
26
Con appletviewer
• Sun’s JDK (freely downloadable from java.sun.com)
contains a tool called the Appletviewer that picks the
<applet> tags out of the HTML file and runs the
applets without displaying the surrounding HTML
text.
• Because the Appletviewer ignores everything but
APPLET tags, you can put those tags in the Java
source file as comments:
•
•
// <applet code=MyApplet width=200 height=100>
// </applet>
• This way, you can run “appletviewer MyApplet.java”
and you don’t need to create tiny HTML files to run
tests.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
14
27
¿Validar la entrada es nivel de
presentación o lógica del negocio?
•
•
Validar la entrada tiene que ver con la presentación, con la interacción
con el usuario, que ha escrito mal los datos: debe hacerse en el nivel
de presentación
Sin embargo, a veces no está tan clara la diferencia entre nivel de
presentación y lógica del negocio
– Si uno solicita sacar -500 € de un cajero no podrá hacerlo porque no tiene
sentido según la “lógica del negocio” de los cajeros automáticos
– Si uno solicita sacar 998 € de un cajero, no podrá hacerlo porque la “lógica
del negocio” dice que no se sacan monedas de cajeros
– Si uno solicita sacar a débito 1500 € de un cajero (y no tiene s aldo) no
podrá hacerlo porque así lo indica la “lógica del negocio”
– ¿Los datos -500, 998 y 1500 son erróneos? Algunos podrán comprobarse
en la presentación y otros en la lógica del negocio.
•
En el ejemplo anterior del gestor de billetes…
– ¿La restricción de que los nombres deben tener al menos 5 caracteres y
deben ser todos alfabéticos es una regla del negocio? ¿O es un problema
de presentación?
– ¿Qué sucedería si después se decidiera no dar billetes si no se proporciona
el nombre y el apellido? El código anterior NO VALDRÍA y tendríamos que
cambiar el nivel de presentación. ¿Pero no es en realidad un cambio en
una regla del negocio?
•
Usando Applets (o JSPs ) no importaría ya que el nivel de presentación
“se instala” en el lado del servidor y se ejecuta en los clientes. Cambiar
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
la lógica del negocio o presentación NO requiere reinstalar los clientes
28
¿Validar la entrada es nivel de
presentación o lógica del negocio?
• Prever los cambios y colocarlo donde
mejor convenga
– Extensibilidad
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
15
29
The jsp:setProperty Action
• <jsp:setProperty att=val*/>
• Set bean properties, either explicitly or
by designating that value comes from a
request parameter.
• Legal attributes are
– name="beanName"
– property="propertyName|*"
– param="parameterName"
– value="val"
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
30
The jsp:getProperty Action
• <jsp:getProperty name="propertyName "
•
value="val"/>
• Retrieve and output bean properties.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
16
31
The jsp:plugin Action
• <jsp:plugin attribute="value"*>...
•
</jsp:plugin>
• Generates OBJECT or EMBED tags, as
appropriate to the browser type, asking
that an applet be run using the Java
Plugin.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
32
The jsp:forward Action
• <jsp:forward page="relative URL"/>
• Forwards request to another page.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
17
33
JSP Introduction
• JSP makes it easier to create and maintain HTML, while still
providing full access to servlet code
• JSP pages get translated into servlets
– It is the servlets that run at request time
– Client does not see anything JSP-related
• You still need to understand servlets
– Understanding how JSP really works
– Servlet code called from JSP
– Knowing when servlets are better than JSP
– Mixing servlets and JSP
• Other technologies use similar approach,
but aren't as portable and don't let you use
Java for the "real code"
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
34
Uses of JSP Constructs
Simple
Application
Complex
Application
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
• Scripting elements
calling servlet code
directly
• Scripting elements
calling servlet code
indirectly (by means
of utility classes)
• Beans
• Custom tags
• Servlet/JSP combo
(MVC), with beans
and possibly custom
tags
18
35
Calling Java Code Directly:
JSP Scripting Elements
•
•
•
•
•
•
•
•
•
•
•
•
•
JSP Expressions
– Format: <%= expression %>
– Evaluated and inserted into the servlet’s output.
• JSP Scriptlets
– Format: <% code %>
– Inserted verbatim into the servlet’s _jspService method
• JSP Declarations
– Format: <%! code %>
– Inserted verbatim into the body of the servlet class
• Predefined variables
– request, response, out, session, application
• Limit the Java code that is directly in page
– Use helper classes, beans, custom tags, servlet/JSP combo
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
36
JSP include Directive
• <%@ include file="url" %>
• A file on the local system to be included
when the JSP page is translated into a
servlet
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
19
Arquitectura física en 2 niveles:
cliente flaco/servidor gordo
• Parte de la lógica del negocio se
combina con el nivel de datos
CLIENTE
NIVEL DE
PRESENTACIÓN
NIVEL DE
LÓGICA DEL
NEGOCIO 1
37
NO LO
HE DADO
SERVIDOR
NIVEL DE
DATOS + LÓGICA
DEL NEGOCIO 2
• Se usan procedimientos almacenados (stored procedures)
en la BD. Un procedimiento almacenado puede servir para
ejecutar una serie de sentencias SQL.
• Comunicación Cliente/Servidor en SQL + Proc. almacenados
• Se necesitan APIs como por ejemplo JDBC y/o ODBC
• Deben instalarse DRIVERS de la BD en todos los clientes
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Arquitectura física en 2 niveles:
cliente flaco/servidor gordo
38
NO LO HE DADO
•
•
•
•
•
•
El despliegue de la aplicación es alto: instalar drivers y configurar todos los
clientes (Idem.)
Cambiar de SGBD requiere reinstalar todos los clientes
– Aún peor: El lenguaje para definir procedimientos almacenados
suele ser propietario (propio de cada SGBD)
Cambiar el esquema de la BD puede afectar a los clientes (Idem.)
Cambiar la lógica del negocio implica recompilar y desplegar en todos los
clientes
– TAL VEZ NO, si afecta sólo a procedimientos almacenados
Costos de conexión con la BD son altos. Cada cliente una conexión. (Idem.)
La red se puede sobrecargar. Cada sentencia SQL usa la red.
– ESTE PROBLEMA SE SUAVIZA.
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU
20
Y también los de secuencia (diseño)
39
Lógica del Negocio
Datos
Presentación
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
40
A. Goñi, J.R. Zubizarreta, J. Iturrioz. Dpto. LSI, UPV/EHU
Ingeniería del Software
A. Goñi, J.R. Zubizarreta, J. Iturrioz
Dpto. LSI. Facultad de Informática. UPV/EHU