Java
Java
en el desarrollo de software
Refactorización
Ejemplo: Generación de números primos
¿Cuándo hay que refactorizar?
Algunas refactorizaciones comunes
Pruebas de unidad
JUNIT
Ejemplo: La clase Money
TDD [Test-Driven Development]
Caso práctico: Bolera
Bibliografía
Robert C. Martin:
“Agile Software Development: Principles, Patterns, and Practices”.
Prentice Hall, 2003. ISBN 0-13-597444-5.
Martin Fowler:
“Refactoring: Improving the design of existing code”.
Addison-Wesley, 2000. ISBN 0-201-48567-2.
Kent Beck:
“Test-Driven Development by Example”.
Addison-Wesley, 2003. ISBN 0-321-14653-0
Refactorización
Definición
Refactorización (n)
Cambio realizado a la estructura interna del software
para hacerlo… más fácil de comprender
y más fácil de modificar
sin cambiar su comportamiento observable.
Refactorizar (v)
Reestructurar el software
aplicando una secuencia de refactorizaciones.
/**
* Clase para generar todos los números primos de 1 hasta
* un número máximo especificado por el usuario. Como
* algoritmo se utiliza la criba de Eratóstenes.
* <p>
* Eratóstenes de Cirene (276 a.C., Cirene, Libia – 194
* a.C., Alejandría, Egipto) fue el primer hombre que
* calculó la circunferencia de la Tierra. También
* se le conoce por su trabajo con calendarios que ya
* incluían años bisiestos y por dirigir la mítica
* biblioteca de Alejandría.
* <p>
* El algoritmo es bastante simple: Dado un vector de
* enteros empezando en 2, se tachan todos los múltiplos
* de 2. A continuación, se encuentra el siguiente
* entero no tachado y se tachan todos sus múltiplos. El
* proceso se repite hasta que se pasa de la raíz cuadrada
* del valor máximo. Todos los números que queden sin
* tachar son números primos.
*
* @author Fernando Berzal
* @version 1.0 Enero’2005 (FB)
*/
if (max >= 2) {
// Declaraciones
int dim = max + 1; // Tamaño del array
boolean[] esPrimo = new boolean[dim];
// Inicializar el array
for (i=0; i<dim; i++)
esPrimo[i] = true;
// Criba
for (i=2; i<Math.sqrt(dim)+1; i++) {
if (esPrimo[i]) {
// Eliminar los múltiplos de i
for (j=2*i; j<dim; j+=i)
esPrimo[j] = false;
}
}
return primos;
// Constructor
3. Compilar
(para verificar que no hemos introducido errores sintácticos)
5. Compilar y probar.
8. Compilar y probar.
NOTA:
Si el antiguo método era un método público usado por otros
componentes o aplicaciones y no podemos eliminarlo, el antiguo
método se deja en su lugar (como una llamada al nuevo método)
y se marca como “deprecated” con Javadoc (@deprecated).
6. Compilar y probar.
import junit.framework.*;
/**
* Esta clase genera todos los números primos de 1
* hasta un número máximo especificado por el usuario
* utilizando la criba de Eratóstenes.
* <p>
* Dado un vector de enteros empezando en 2, se tachan
* todos los múltiplos de 2. A continuación, se
* encuentra el siguiente entero no tachado y se
* tachan sus múltiplos. Los números que queden sin
* tachar al final son los números primos entre 1 y N.
*
* @author Fernando Berzal
* @version 3.0 Enero'2005 (FB)
*/
} else {
inicializarCandidatos(max);
eliminarMultiplos();
obtenerCandidatosNoEliminados();
}
}
for ( multiplo=2*i;
multiplo<esPrimo.length;
multiplo+=i )
esPrimo[multiplo] = false;
}
return cuenta;
}
}
import junit.framework.*;
import junit.framework.*;
// Casos de prueba
…
}
Por ejemplo, queremos usar esta clase para generar informes como…
import junit.framework.*;
En este caso, nos hace falta añadir un método add a la clase Money
para poder compilar y ejecutar el caso de prueba…
Assert.assertEquals(m10,m10);
Assert.assertEquals(m20,m20);
Assert.assertTrue(!m10.equals(m20));
Assert.assertTrue(!m20.equals(m10));
Assert.assertTrue(!m10.equals(null));
}
Por ejemplo:
if (getMoneda().equals(dinero.getMoneda()))
convertido = dinero;
else
convertido = Bank.exchange(dinero, getMoneda());
…
Money share = new Money(13,"USD");
Money investment = share.times(200);
Money euros = Bank.exchange(investment,”EUR”);
Tradicionalmente,
las pruebas se realizan a posteriori
En TDD,
las pruebas se preparan antes de comenzar a escribir el código.
Robert C. Martin:
“Agile Software Development: Principles, Patterns, and Practices”.
Prentice Hall, 2003. ISBN 0-13-597444-5.