videoclub
Alquiler de películas en un vídeo-club
Adaptado de “ Refactoring” © Martin Fowler, 2000
Supongamos que tenemos que desarrollar una aplicació n que gestione los alquileres de DVDs en un vídeo-club.
Inicialmente, nuestro diagrama de clases sería similar al siguiente:
public class DVD
{
// Constantes simbólicas
public static final int INFANTIL = 2; publicstatic final int NORMAL = 0; public static final int NOVEDAD = 1;
// Variables de instancia
private
String
_titulo;
private
int
_tipo;
// Constructor
public DVD (String titulo, int tipo)
{
_titulo = titulo; _tipo = tipo;
}
OOP - Caso práctico: Vídeo-club - 1 - © Fernando Berzal
// Acceso a las variables de instancia
public int getTipo()
{
return _tipo;
}
public void setTipo (int tipo){
_tipo = tipo;
}
public String getTitulo ()
{
return _titulo;
}
}
public class Alquiler
{
private DVD _dvd; private int _tiempo;
public Alquiler (DVD dvd, int tiempo)
{
_dvd = dvd; _tiempo = tiempo;
}
public int getTiempo()
{
return _tiempo;
}
public DVD getDVD()
{
return _dvd;
}
}
OOP - Caso práctico: Vídeo-club - 2 - © Fernando Berzal
import java.util.Vector;public class Cliente
{
// Variables de instancia
private String _nombre;
private Vector _alquileres =new Vector();
// Constructor
public Cliente (String nombre)
{
_nombre = nombre;
}
// Acceso a las variables de instancia
public String getNombre()
{
return _nombre;
}
// Registrar alquiler
public void nuevoAlquiler (Alquiler alquiler)
{
_alquileres.add(alquiler);
}
// Emitir uninforme del cliente
public String informe()
{
double total;
double importe;
int puntos;
int i;
Alquiler alquiler;
String salida;
total = 0; puntos = 0;
salida = "Informe para " + getNombre() + "\n";
OOP - Caso práctico: Vídeo-club - 3 - © Fernando Berzal
// Recorrido del vector de alquileres
for (i=0; i<_alquileres.size(); i++) {
importe = 0;
alquiler = (Alquiler) _alquileres.get(i);// Importe del alquiler
switch (alquiler.getDVD().getTipo()) {
case DVD.NORMAL: importe += 2;
if (alquiler.getTiempo()>2)
importe += (alquiler.getTiempo()-2)*1.5; break;
case DVD.NOVEDAD:
importe += alquiler.getTiempo() * 3; break;
case DVD.INFANTIL: importe += 1.5;
if (alquiler.getTiempo()>3)
importe += (alquiler.getTiempo()-3)*1.5; break;
}
// Programa de puntos
puntos++;
if ((alquiler.getDVD().getTipo()==DVD.NOVEDAD)
&& (alquiler.getTiempo()>1) )
puntos++; // Bonificación
// Mostrar detalles del alquiler
salida += "\t" + alquiler.getDVD().getTitulo()
"\t" + String.valueOf(importe) + " \n";
Acumular total
total += importe;
}
OOP - Caso práctico: Vídeo-club - 4 - © Fernando Berzal
// Pie del informe
salida += "IMPORTE TOTAL = "
+ String.valueOf(total) + "\n";
salida += "Dispone de "
+ String.valueOf(puntos) + " puntos\n";
return salida;
}
}
Paso 1: Extraer método de informe()
El método informe es excesivamente largo…
public class Cliente…
public double precio (Alquiler alquiler)
{
double importe = 0;
switch (alquiler.getDVD().getTipo()) {
case DVD.NORMAL: importe += 2;
if (alquiler.getTiempo()>2)
importe +=(alquiler.getTiempo()-2)*1.5; break;
case DVD.NOVEDAD:
importe += alquiler.getTiempo() * 3; break;
case DVD.INFANTIL: importe += 1.5;
if (alquiler.getTiempo()>3)
importe += (alquiler.getTiempo()-3)*1.5; break;
}
return importe;
}
OOP - Caso práctico: Vídeo-club - 5 - © Fernando Berzal
public String informe()
{
double total;
double importe;
int puntos;
int i;
Alquiler alquiler;
String salida;
total = 0;puntos = 0;
salida = "Informe para " + getNombre() + "\n";
for (i=0; i<_alquileres.size(); i++) {
alquiler = (Alquiler) _alquileres.get(i); importe = precio(alquiler);
// Programa de puntos
puntos++;
if ((alquiler.getDVD().getTipo()==DVD.NOVEDAD)
&& (alquiler.getTiempo()>1))
puntos++; // Bonificación
// Mostrar detalles del alquiler
salida += "\t" + alquiler.getDVD().getTitulo()
"\t"...
Regístrate para leer el documento completo.