You are on page 1of 8

Caso de uso 1: “Identificar usuario”.

Escenarios:
1) Normal
2) Usuario o contraseña incorrectos

Diagrama de casos de uso:

Identificar usuario
Empleado

Escenario 1:

Escenario normal: el nombre y la contraseña son correctos

: FrameSesion : Sesion : Connection : Statement

: Empleado

validar( )
validar(String, String)
createStatement()

executeQuery( )
Escenario 2:

Escenario normal: el nombre y la contraseña son correctos

: FrameSesion : Sesion : Connection : Statement

: Empleado

validar( )
validar(String, String)
createStatement()

executeQuery( )
Diagramas de colaboración (equivalentes a los dos diagramas de
secuencia mostrados):

Escenario 1

3: createStatement()
1: validar( ) 2: validar(String, String)

: : Sesion
FrameSesion :
Connection
: Empleado

4: executeQuery( )

:
Statement
Escenario 2

1: validar( )
2: validar(String, String) 3: createStatement()

: : Sesion
FrameSesion
: Empleado :
Connection

5: DialogError( )
6: setMensaje(String)
7: setVisible(Boolean)
4: executeQuery( )

:
DialogError :
Statement
Diagrama de clases multicapa.

-mSesion
<<pantalla>>
Sesion
FrameSesion
(from Use Case View) -mBD
(from Use Case View)

validar() Connection
validar()
(from Logical View)

createStatement()()

Statement
DialogError (from Use Case View)
(from Use Case View)

executeQuery()
setMensaje()
setVisible()
DialogError()

Aspectos de la implementación.
Tras realizar la “traducción a código” tal y como hemos explicado en clase, debemos tomar
ciertas decisiones de “bajo nivel”.

Traducción A:
La clase FrameSesion la construimos utilizando el entorno de desarrollo que tengamos.
Según los diagramas anteriores, deberemos añadirle el código indicado a continuación en
cursiva:
public class FrameSesion extends Frame
{
private Sesion mSesion=new Sesion();
public FrameSesion()
{
// This code is automatically generated by Visual Cafe when you add
// components to the visual environment. It instantiates and initialises
...
void buttonAceptar_ActionPerformed(java.awt.event.ActionEvent event)
{
validar();
}

private void validar() {


if (!mSesion.validar(textFieldNombre.getText(),
textFieldContraseña.getText())) {
DialogError d=new DialogError(this, true);
d.setMensaje("Nombre de usuario o contraseña incorrectos");
d.setVisible(true);
}
}
}

Obsérvese que el método validar() inmediatamente anterior corresponde al mensaje pasado


desde el actor Empleado a la clase FrameSesion, y que hemos indicado en los diagramas de
secuencia y colaboración anteriores.
El código de la clase Sesión sería el siguiente:
import java.sql.*;

public class Sesion {


private Connection mBD;

public Sesion() {
// Conexión mediante ODBC
String url="jdbc:odbc:Merprosa1";
String driver="sun.jdbc.odbc.JdbcOdbcDriver";
try {
Class.forName(driver);
mBD=DriverManager.getConnection(url, "", "");
}
catch (Exception e) {
System.err.println("Error al conectar a la base de datos: " + e);
}
}

public boolean validar(String nombre, String contraseña) {


String SQL="Select contraseña from Usuarios where Nombre='" + nombre +
"'";
try {
ResultSet r=mBD.createStatement().executeQuery(SQL);
if (r.next()) {
if (r.getString(1).equals(contraseña))
return true;
}
return false;
}
catch (Exception e) {
System.err.println("Error al realizar la consulta " + SQL + ": " +
e);
return false;
}
}
}
Mediante la traducción anterior de la clase sesión, algunos posibles mensajes de error se
muestran por la consola: por ejemplo, si el origen de datos “Merprosa1” no existe, se
produce una excepción (se crea un objeto de clase Exception) en el bloque try del método
validar(String, String); esta excepción es capturada el bloque catch que le sigue,
mostrándose el resultado por la consola (pantalla negra). Puesto que es deseable que todos
los mensajes de error se muestren el diálogo de error que hemos construido, en lugar de
realizar el tratamiento del error en el bloque try...catch, lo que haremos será transformar el
método validar(String, String) para que lance los errores que capture fuera de su ámbito.
Esto se consigue añadiendo las palabras “throws Exception” a continuación de la cabecera
del método. Al hacerlo, nos obligamos a colocar un bloque try..catch en el método que
llama al método que contiene la cláusula throws...Exception.
Para conseguirlo, realizamos la siguiente traducción alternativa “B”.

Traducción B:
En esta traducción, rescribimos el método validar(String, String) de Sesión y lo dejamos de
esta manera:
public boolean validar(String nombre, String contraseña) throws Exception {
String SQL="Select contraseña from Usuarios where Nombre='" + nombre +
"'";
ResultSet r=mBD.createStatement().executeQuery(SQL);
if (r.next()) {
if (r.getString(1).equals(contraseña))
return true;
}
return false;
}
Nota que hemos suprimido las cláusulas try...catch de este método, y que le hemos añadido
throws Exception en su cabcera.
Ahora, puesto que el método validar(String, String) puede arrojar una excepción, debemos
capturarla allá donde lo llamemos. Es decir, que el método validar() de FrameSesion debe
ser modificado y quedar de este modo:
private void validar() {
try {
if (!mSesion.validar(textFieldNombre.getText(),
textFieldContraseña.getText())) {
DialogError d=new DialogError(this, true);
d.setMensaje("Nombre de usuario o contraseña incorrectos");
d.setVisible(true);
}
}
catch (Exception e) {
DialogError d=new DialogError(this, true);
d.setMensaje("Error: " + e);
d.setVisible(true);
}
}

Mientras que antes era más sencillo, pero el resultado menos elegante:
private void validar() {
if (!mSesion.validar(textFieldNombre.getText(),
textFieldContraseña.getText())) {
DialogError d=new DialogError(this, true);
d.setMensaje("Nombre de usuario o contraseña incorrectos");
d.setVisible(true);
}
}

You might also like