Refactoring
Refactoring
Tabla de contenidos
Introducción: un ejemplo de refactoring
Principios en refactoring
Definiciones y orígenes
¿Por qué y cuando refactorizar?
Problemas con las refactorizaciones
Misceláneo:
Herramientas
Metodologías ágiles
Definición de nuevas refactorizaciones (Big – Low)
Conclusiones
Bibliografía
Fowler, Refactoring: Improving the Design of Existing Code, AddisonWesley, 1999
1
Refactorización - Refactoring
Introducción
Definición
Refactoring son una serie de pequeñas transformaciones, cada uno de
las cuales cambia la estructura interna del programa sin cambiar su
comportamiento externo.
Verificación del comportamiento externo
Testing – Prueba
Análisis formal decódigo dirigido por herramientas
Refactoring
Se parte de código existente y con el diseño subyacente en él
Limpia el código para minimizar el coste de los cambios
Mejora el diseño del código una vez que este ha sido escrito
2
Refactorización - Refactoring
Introducción: un ejemplo de refactoring
Contexto
Calculo e impresión de los alquileres en un Videoclub
Elcoste del alquiler depende del tiempo de alquiler y tipo de película.
Tipos de películas: regular, children, new-release.
El coste de alquiler también depende de los puntos de frecuencia en el
alquiler que dependen del tipo de película.
Movie
priceCode: int
Rental
1
daysRented: int
Customer
1
statement()
3
Refactorización - Refactoring
Class Movie
publicclass Movie {
public static final int
public static final int
public static final int
CHILDRENS = 2;
REGULAR = 0;
NEW_RELEASE = 1;
private String _title;
private int _priceCode;
public Movie(String title, int priceCode) {
_title = title;
_priceCode = priceCode;
}
public int getPriceCode() {
return _priceCode;
}
public void setPriceCode(int arg) {
_priceCode = arg;
}public String getTitle () {
return _title;
}
}
4
Refactorización - Refactoring
Class Rental
public class Rental {
private Movie _movie;
private int _daysRented;
public Rental(Movie movie, int daysRented) {
_movie = movie;
_daysRented = daysRented;
}
public int getDaysRented() {
return _daysRented;
}
public Movie getMovie() {
return _movie;
}
}
5Refactorización - Refactoring
Class Customer
public class Customer {
private String _name;
private Vector _rentals = new Vector();
public Customer (String name)
{
_name = name;
};
public void addRental(Rental arg) {
_rentals.addElement(arg);
}
public String getName ()
{
return _name;
};
public String statement()…
1
6
Refactorización - Refactoring
Customer.statement()
public Stringstatement() {
1
double totalAmount = 0;
int frequentRenterPoints = 0;
Enumeration rentals = _rentals.elements();
String result = "Rental Record for " + getName() + "\n";
while (rentals.hasMoreElements()) {
double thisAmount = 0;
Rental each = (Rental) rentals.nextElement();
//determine amounts for each line
switch (each.getMovie().getPriceCode()) {
case Movie.REGULAR:
thisAmount +=2;
if (each.getDaysRented() > 2)
thisAmount += (each.getDaysRented() - 2) * 1.5;
break;
case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS:
thisAmount += 1.5;
if (each.getDaysRented() > 3)
thisAmount += (each.getDaysRented() - 3) * 1.5;
break;
}…
2
7
Refactorización - Refactoring
Customer.statement()
2
// add frequent renterpoints
frequentRenterPoints ++;
// add bonus for a two day new release rental
if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
each.getDaysRented() > 1)
frequentRenterPoints ++;
//show figures for this rental
result += "\t" + each.getMovie().getTitle()+ "\t" +
String.valueOf(thisAmount) + "\n";
totalAmount += thisAmount;
}
//add footer lines
result += "Amount owed is " +...
Regístrate para leer el documento completo.