INGENIERÍA DEL SOFTWARE. 4º ING. INF. (UPV/EHU) 12/09/01

Anuncio
INGENIERÍA DEL SOFTWARE. 4º ING. INF. (UPV/EHU)
NOMBRE:
12/09/01
GRUPO:
1.-¿Es posible que un sistema que no ofrezca mecanismos de GENERICIDAD proporcione la
posibilidad de definir CLASES GENÉRICAS? Razona la respuesta. (0,5 ptos.)
2.- ¿Qué es un PROCESO de GESTIÓN del PROCESO SOFTWARE? (0,5 ptos.)
3.- ¿Qué es la ROBUSTEZ del software? ¿Qué ofrece Java para mejorar la ROBUSTEZ del
software? (0,5 ptos.)
4.- En el Proceso Unificado de Desarrollo de software, ¿qué diferencia hay entre un
COMPONENTE de PRUEBA y un PROCEDIMIENTO de PRUEBA? (0,5 ptos.)
5.- (1,25 ptos.) La clase Passwords permite almacenar pares <nombre,password> y obtener de
una manera eficiente el password correspondiente a un nombre. No es posible tener dos pares
con un mismo nombre. Se pide implementarla usando la estructura de datos HashMap de JGL.
public class Passwords {
/**
* Almacena el par <nombre,password >. Si nombre existía , cambia el password
* @param nombre
* @param password
*/
public static void aniadirNomPass(String nombre, String password) {..}
/**
* Devuelve el último password asignado al nombre
* @param nombre
* @return password
*/
public static String obtenerPassword(String nombre) {..}
}
Nota: utilizar solamente el constructor y métodos siguientes de HashMap
•
•
•
El constructor HashMap(boolean permiteDuplicados), crea un objeto de HashMap vacío
que sirve para introducir pares <clave,valor>. Se podrá tener más de un par para un misma clave si y
sólo si permiteDuplicados es true
Object get(Object clave) devuelve el valor asociado con clave o null si no existe
Object put(Object clave, Object valor) realiza lo siguiente: si clave no existe
dentro del HashMap, introduce el par < clave, valor > y devuelve null. Si existe, cambia de valor y
devuelve el anterior.
6.- (1,25 ptos.) Utilizando el algoritmo Sorting.sort de JGL, se pide escribir la clase
OrdenPers para que ordene a las personas de la siguiente manera: primero todos los de color
de pelo RUBIO, después los de color CASTAÑO y después los de cualquier otro color de pelo.
Las personas dentro de cada uno de estos 3 grupos se ordenan de mayor a menor edad.
Array contenedor =
contenedor.add(new
contenedor.add(new
contenedor.add(new
contenedor.add(new
contenedor.add(new
new Array( );
Pers("pepe",32,"RUBIO"));
Pers("pepe",30,"CAST AÑO"));
Pers("ana",33,"RUBIO"));
Pers("koldo",33,"NEGRO"));
Pers("amaia",33,"BLANCO"));
Sorting.sort(contenedor, new OrdenPers ());
Uno de los posibles órdenes válidos sería el siguiente:
Pers("ana",33,"RUBIO")
Pers("pepe",32,"RUBIO")
Pers("pepe",30,"CASTAÑO")
Pers("koldo",33,"NEGRO")
Pers("amaia",33,"BLANCO")
public static void sort(Sequence c, BinaryPredicate comp)
Clasifica los elementos en la secuencia JGL c utilizando comp. El método execute(o1,o2)
devuelve true cuando o1 debe colocarse antes que o2 en la secuencia c.
BinaryPredicate es una interface con el siguiente método:
public boolean execute(Object o1 Object o2)
7.- (1,25 ptos.) La interfaz de usuario asociada a un caso de uso llamado RESERVAR
LABORATORIO aparece a continuación, junto con las clases Java correspondientes:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ReservarLab extends JFrame {
JPanel jPanel1 = new JPanel();
JLabel jLabel1 = new JLabel();
BorderLayout borderLayout1 = new BorderLayout();
JPanel jPanel2 = new JPanel();
JComboBox jComboBox1 = new JComboBox();
JComboBox jComboBox2 = new JComboBox();
JButton jButton1 = new JButton();
JPanel jPanel3 = new JPanel();
GridLayout gridLayout1 = new GridLayout(6,6);
JTextField jTextField1 = new JTextField();
JTextField cajasTexto[][] = new JTextField[5][5];
GestorLabs gestor = new GestorLabs();
public ReservarLab() {
super();
try { jbInit(); }
catch (Exception e) { e.printStackTrace(); } }
private void jbInit() throws Exception {
this.setSize(new Dimension(400, 300));
jLabel1.setText("NOMBRE USUARIO:");
jPanel2.setLayout(gridLayout1);
jButton1.setText("Reservar");
this.getContentPane().setLayout(borderLayout1);
this.setTitle("Reservar Laboratorio");
jTextField1.setColumns(20);
this.getContentPane().add(jPanel1, BorderLayout.NORTH);
jPanel1.add(jLabel1, null);
jPanel1.add(jTextField1, null);
this.getContentPane().add(jPanel2, BorderLayout.CENTER);
jPanel2.add(new JLabel());
String etiqsDias[] = new String[5];
etiqsDias[0]="L"; etiqsDias[1]="M"; etiqsDias[2]="X";
etiqsDias[3]="J"; etiqsDias[4]="V";
for (int i=0;i<5;i++)
{ jPanel2.add(new JLabel(etiqsDias[i]) );
jComboBox1.addItem(etiqsDias[i]); }
String etiqsHor[] = new String[5];
etiqsHor[0]="9-10"; etiqsHor[1]="10-11"; etiqsHor[2]="11-12";
etiqsHor[3]="12 -13"; etiqsHor[4]="13-14";
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e); } }) ;
for (int i=0;i<5;i++) {
jPanel2.add(new JLabel(etiqsHor[i]));
jComboBox2.addItem(etiqsHor[i]);
for (int j=0;j<5;j++) {
cajasTexto[i][j] = new JTextField();
jPanel2.add(cajasTexto[i][j],numComp++); } }
dibujarReservas();
this.getContentPane().add(jPanel3, BorderLayout.SOUTH);
jPanel3.add(jButton1, null);
jPanel3.add(jComboBox1, null);
jPanel3.add(jComboBox2, null); }
public void dibujarReservas() {
for (int i=0;i<5;i++)
for (int j=0; j<5; j++) {
cajasTexto[i][j].setText(gestor.getReserva(j,i));
} }
void jButton1_actionPerformed(ActionEvent e) {
gestor.setReserva(jComboBox1.getSelectedIndex(),
jComboBox2.getSelectedIndex(),jTextField1.getText());
dibujarReservas(); } }
import java.sql.*;
public class GestorLabs extends Object {
Connection conexion;
Statement sent; ResultSet rs;
public GestorLabs() {
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conexion=DriverManager.getConnection("jdbc:odbc:Labs");
sent=conexion.createStatement();}
catch(Exception e) {System.out.println("Err:"+e.toString());} }
public String getReserva(int dia, int hora) {
try{ rs=sent.executeQuery("SELECT NOMBRE FROM RESERVAS "+
"WHERE DIA="+dia+" AND HORA="+hora);
if (rs.next()) return rs.getString("NOMBRE"); }
catch (Exception e) {System.out.println("Error: "+e.toString());}
return null; }
public void setReserva(int dia, int hora, String us) {
try{ sent.executeUpdate("UPDATE RESERVAS SET NOMBRE='"+us+"' "+
"WHERE DIA="+dia+" AND HORA="+hora+" AND NOMBRE='LIBRE'");
} catch (Exception e) {System.out.println("Error: "+e.toString());}
} }
EN TODA SOLUCIÓN QUE SE PROPONGA DEBE APARECER LO SIGUIENTE:
•
•
•
Las clases junto con sus métodos y relaciones con otras clases en notación
UML
Indicar si se aplica un PATRÓN DE DISEÑO concreto
Código Java que se considere necesario para “entender” la solución propuesta
Decir si la solución propuesta sigue una arquitectura lógica en 3 niveles. Si es así, indicar qué
partes del código corresponden a cada nivel. Si no es así, indicar qué habría que hacer para
conseguir que el software siguiera una arquitectura lógica en 3 niveles y qué partes del código
corresponderían a cada nivel.
8.- (1 pto.) Una vez definido el software siguiendo una arquitectura lógica en 3 niveles, definir
cómo se puede conseguir una arquitectura física en 3 niveles.
9.- (1 pto.) En la solución propuesta en el ejercicio 7, si hay varios usuarios ejecutando el caso de
uso RESERVAR LABORATORIO, esto es, varios objetos de la clase ReservarLab en ejecución,
entonces habrá varias conexiones abiertas con la BD asociada a la fuente de datos ODBC Labs.
¿Es cierta la anterior afirmación? En el caso en el que lo sea, propone r una solución a dicho
problema.
10.- (1 pto.) La clase ReservarLab sería más REUTILIZABLE si en la clase ReservarLab
sustituyéramos este código
...
GestorLabs gestor = new GestorLabs(); // Variable de instancia de ReservarLab
public ReservarLab() { // CONSTRUCTOR de ReservarLab
super();
...
PROPUESTA 1
}
por el siguiente:
GestorLabs gestor;
// Variable de instancia de ReservarLab
public ReservarLab(GestorLabs g) {
// CONSTRUCTOR de ReservarLab
gestor = g;
...
}
PROPUESTA 2
Teniendo en cuenta que GestorLabs está definida como una clase, ¿es cierta la anterior
afirmación? En el caso en el que no lo sea, indicar cuándo la PROPUESTA 2 sería más
reutilizable que la PROPUESTA 1.
11.- (1,25 ptos.) En la solución propuesta en el ejercicio 7, si hay varios usuarios ejecutando el
caso de uso RESERVAR LABORATORIO, esto es, varios objetos de la clase ReservarLab en
ejecución y uno de ellos reserva una hora libre del laboratorio, los demás usuarios NO verán
reflejado este hecho en sus interfaces de usuario a no ser que creen nuevos objetos de
ReservarLab. Proponer una solución a dicho problema.
Descargar