Refactorizacion
Refactorizacion
Refactorizacion
• Mas estructurado
• Mas legible
• Mas entendible
• Mas extensible
• No necesariamente mas eficiente
• No necesariamente sin errores, pero mas fáciles de localizar
3
¿Porque nuestro software sufre degeneración?
Hay que cumplir con la fecha de entrega comprometida, es LA PRIORIDAD NUMERO UNO!
4
...
Difícil de hacer una estimación confiable
Difícil de cumplir con lo planeado
Aparecen los “bugs” etc.
Difícil de solucionar los “bugs”
Aparecen “Expertos” o “Dueños” de código
5
¿Porque pasa esto?
Software es complejo
Hay diferentes modos de manejar la complejidad: proceso, encapsulación, componentes, los
“frameworks”, reutilización etc.
Sin embargo, hay que empezar manejando complejidad en el nivel de código.
Antes, nuestras prioridades eran tener un código rápido, pequeño (ocupa poca memoria),
optimizado, utilizando los algoritmos mas eficaces etc...
Hoy en día el enfoque es en código como tal, este código tiene que ser simple
6
¿Cómo es un código simple?
Funciona bien
Comunica lo que esta haciendo
No tiene duplicación
Tiene un número menos posible de clases y métodos
7
¿Cuales son los beneficios?
El código es mas fácil de cambiar, evolucionar o arreglar
Es mas fácil desarrollar de un modo iterativo e
incrementando
El código es mas fácil de leer (entender)
Es mas fácil hacerlo bien desde la primera, asi estamos
programando mas rápido
8
¿Cómo en esto nos puede apoyar la
Refactorización?
Refactorizar significa cambiar el código internamente sin alterar su
funcionalidad externa. En general, con motivos de mejorar el diseño
y obtener un código mas simple.
9
Identificar puntos débiles de código
Es difícil definir si código es malo o bueno, o cuando
deberíamos cambiarlo
Difícil de imponer las métricas
Por eso estamos hablando de los “Olores malos” en el
código (“Bad Smells” - Kent Beck)
10
Ciclo de la refactorización
Cómo
Enfoque formalizado
Técnicas o herramientas independientes
Muchos IDE ayudan a la refactorización
Utilizaremos un enfoque OO -- Java
Alcance de la refactorización
QUÉ ES QUÉ NO ES
20
double energiaPotencial(double masa, double altura){
return masa * 9.81 * altura;
}
21
Técnicas de
refactorización
EXTRAER MÉTODO
Extraer método
Ver un cto de líneas de código que tienen una cohesión y se pueden extraer
Función autónoma, cohesiva
y corta:
IMPRIMIR CABECERA FACTURA
Haremos lo mismo que el caso anterior?
El parámetro debe ser tipo Order o tipo Cliente?
Extracción de método
Refactorización en línea
Justo lo contrario de lo anterior
CONFUSO
Divide una variable temporal
Introducir variable explicativa
Sentencia excesivamente compleja
Introducir variable explicativa
Introducir variable explicativa
Quitar asignaciones a parámetros
Muy dependiente del lenguaje y del tipo de datos
Evitar impactos no deseados
Quitar asignaciones a parámetros
Técnicas de
refactorización
MOVER MÉTODOS
A nivel de clases. Moviendo métodos
¿Cuándo se cambia? y a donde?.
Maneja datos de otra clase
ENVIDIA DE CARACTERÍSTICAS
Mover método
1. Revisar método. Donde y quien lo usa. Pensar el nombre
2. Comprobar jerarquía de clases. Subclases y superclases.
3. Crear el método y renombrarlo
4. Copiar el código
5. Reemplazar las llamadas originales
6. Se puede hacer un movimiento parcial. Dejar el método allí y copiar en otra clase
Mover método
De que clase usa más datos?. Ojo siempre que los campos estén en
el sitio correcto
Y si no hay clase donde llevarlo pero no está en su sitio. Crear clase
Enumeraciones
Condiciones múltiples
Campos de tipo
Comportamiento
Basado en tipo
Extraer subclases
Técnicas de
refactorización
MOVER CAMPOS
Mover Campos
Y que pasa si estos métodos usan también el campoUno ?
Movemos el campo
Temporales en línea
Preservar el objeto entero
Parametrizar métodos
Reemplazar parámetro con métodos
Separar la petición de modificador
Parametrizar métodos
Reemplazar parámetro con métodos
Separar la petición del modificador
Técnicas de
refactorización
SUBIR O BAJARA MÉTODOS Y CAMPOS ( PUSH Y POP)
Subir campo o método
Mismo concepto
Bajada de método y campo
Solo una clase usa el método o el campo
Pero es difícil de ver en el código
Refinar jerarquías de clases
Extracción de superclase
Extracción de subclase
Colapsado de la jerarquía justo lo contrario
Extracción de superclase
Abstract
ProblemaATM solo es útil para las cuentas corrientes. Se crea una subclase
que recoja este comportamiento
Colapsado de la jerarquía
Tira la subclase de la superclase o al revés no siempre es la superclase
Tipos de refactorizaciones
Categorías no disjuntas, son clasificaciones para la mejor
comprensión
A nivel de método
El nombre es correcto? Hay código duplicado? Los parámetros tienen sentido?
Hay muchas variables temporales? Es mejor partir el código?...
A nivel de clase
Este método debe estar en esta clases? Hay muchos métodos parecidos