Tarea 18Refactorizacion

Download Report

Transcript Tarea 18Refactorizacion

1. Diseño
2. Codificación
3. Pruebas
Tarea 18 a 19
Mgr. Indira Camacho del Castillo
UMSS: Cochabamba - Bolivia
Mejorando el código existente
x2 − 1
 (x + 1)(x − 1),
 La refactorización es un aspecto importante de la
programación extrema.
 La refactorización es un concepto tan importante que
ha sido identificado como una de las más importantes
innovaciones en el campo del software según David A.
Wheeler.
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
3
4
De refactorización.com
¿Si el software fuera un edificio, se
parecería mas a uno de la izquierda o de
la derecha?
De refactorización.com
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
5
Refactorización
Cambios
De refactorización.com
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
6
¿Cómo podríamos describir
este software?
Este software padece:
 “Código mutante”
 “Diseño roto”
Más antiguo el código y mas grande,
estos síntomas son más evidentes
De refactorización.com
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
7
¿Por qué nuestro software
sufre degeneración?
 Hay que cumplir con la fecha de entrega comprometida,
es LA PRIORIDAD NUMERO UNO!
De refactorización.com
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
8
...
 Difícil de hacer una estimación confiable
 Difícil de cumplir con lo planeado
 Aparecen los “bugs”
 Difícil de solucionar los “bugs”
 Aparecen “Expertos” o “Dueños” de código
! Es un circulo vicioso ¡
El proyecto adquiere “deuda tecnologica”
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
De refactorización.com
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
9
¿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.
De refactorización.com
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
10


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
De refactorización.com
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
11
¿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
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
De refactorización.com
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
12
¿Cuáles son los beneficios?
 El código es más fácil de cambiar, evolucionar o
arreglar
 Es más fácil desarrollar de un modo iterativo e
incremental.
 El código es mas fácil de leer (entender)
 Es más fácil hacerlo bien desde la primera, así
estamos programando mas rápido
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
13
¿Cómo en esto nos puede apoyar la
Refactorización?
Definición:
"Refactorizar un software es modificar su estructura
interna con el objeto de que sea más fácil de entender y
de modificar a futuro, tal que el comportamiento
observable del software al ejecutarse no se vea
afectado." (Martin Fowler).
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 más simple.
Refactorización enseña técnicas para descubrir el código de mala calidad y técnicas
para cambiarlo.
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
14
¿ Refactorización ?
 Un ejemplo de una refactorización trivial es cambiar el
nombre de una variable para que sea más significativo,
como una sola letra 't' a 'tiempo'.
 Una refactorización más compleja es transformar el
trozo dentro de un bloque en una subrutina.
 Una refactorización todavía más compleja es
remplazar una sentencia condicional if por
polimorfismo.
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
15
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 se habla de los “Olores malos” en el código
(“Bad Smells” - Kent Beck)
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
16
Código duplicado
¡Olor No. 1!
Cierto Código tiene que estar en un
lugar y en ningún otro más

Hay que eliminar el código duplicado,
tecnicas: Extraer método ,Extraer método
+ Subir Campo (clases hermanas),
Extraer Clase (clases no relacionadas)

Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
17
Métodos largos
¡Olor No. 2!
Programas con métodos mas cortos,
tienen vida mas larga

Métodos cortos traen beneficios de
indirección: compartir lógica, intento
claro, cambio aislado

Comentarios son muchas veces indicadores de
distancia semántica, podemos reemplazar comentario
con método cuyo nombre tiene mismo significado.
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
18
Clase grande
¡Olor No. 3!

La clase está haciendo demasiado

“Extraer Clase”, “Extraer Subclase”
Hay que empezar eliminando código duplicado y podemos
terminar sin necesidad de extraer clase
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
19
y muchos más …
“Grupos de datos”
 “Jerarquías de herencia paralelas”
 “Cadenas de mensajes”
 “Intimidad inapropiada”
 “Intermediario”
 “Legado rechazado”
 “Generalización especulada”
Etc...

Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
Comentarios

“Comentarios mienten, el código no”
No pueden reemplazar falta de código mal
escrito

Después de una refactorización
meticulosa, lo mas probable que los
comentarios sean innecesarios


“Renombrar método”
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
21
Refactorizando: Extraer
método
 Tenemos un fragmento de código que es posible
agrupar
 Vamos a transformar el fragmento a un método nuevo
cuyo nombre va a explicar su proposito
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
22
Código
void imprimirDebe()
{
imprimirEncabezado();
//print details
Console.Out.WriteLine("Nombre:
Console.Out.WriteLine("Monto:
" + nombre);
" + debe());
}
void imprimirDebe()
{
imprimirEncabezado();
imprimirDetalle(debe());
}
void imprimirDetalle(double valor) {
Console.Out.WriteLine("Nombre:
Console.Out.WriteLine("Monto:
}
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
" + nombre);
" + valor);
Materia: Ingeniería de Software
23
Refactorizando:
Variable Temporal en línea
 Motivación: Variable temporal dificulta aplicar el
“Extraer método”
 Variable temporal fue asignada una vez con una simple
expresión
 Vamos a reemplazar todas las referencias con la
expresión
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
24
Código
double precioBase = pedido.precioBase();
return (precioBase > 1000);
return(pedido.precioBase()>1000);
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
25
Refactorizando:
Reemplazar Temporal con la
consulta
 Una de refactorizaciones vitales antes de “Extraer
método”
 Variable temporal esta guardando resultado de una
expresión.
 Extraer la expresión en un método. Remplazar todas
las referencias de la variable con el método.
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
26
Código
double precioBase = cantidad * valorItem;
if(precioBase > 1000)
return precioBase * 0.95;
else
return precioBase * 0.98;
if(precioBase() > 1000)
return precioBase() * 0.95;
else
return precioBase() * 0.98;
double precioBase(){ return cantidad * valorItem;}
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
27
Reemplazar método con
“Método-Objeto”



Es un método largo pero es difícil aplicar “Extraer
método” por modo en que se utilizan variables
locales
El método se transforma en un objeto de tal
modo que todas las variables locales sean
campos del mismo, constructor recibe objeto y
parámetros originales, se copia el método
original con nombre calcular() y se procede a
refactorizar
¡Ahora es fácil aplicar “Extrer método”!
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
28
Código
class Pedido{
double precio(int numeroItems){
double precioBasePrimario;
double precioBaseSecundario;
int valorX = numeroItems * delta();
//computo largo...
}
}
return new CalculaPrecio(this, numeroItems).calcular();
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
29
Reemplazar Numero Magico
con Constante Simbolica
 Un literal tiene significado especial
 Una de las enfermedades mas antiguas en
computación
 Si en un momento hay que cambiar el numero, el
esfuerzo necesario puede ser enorme
 Código difícil de leer
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
30
Código
double energiaPotencial(double masa, double altura){
return masa * 9.81 * altura;
}
double energiaPotencial(double masa, double altura){
return masa * INTENSIDAD_DE_GRAVEDAD * altura;
}
static const double INTENSIDAD_DE_GRAVEDAD = 9.81;
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
31
Extraer Clase
 Una clase haciendo trabajo de dos
 Crear nueva clase y separar las responsabilidades
 Clase antigua delega trabajo a la nueva o la nueva clase
esta expuesta al cliente
 ¿Debería estar la clase nueva expuesta a los clientes?
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
32
Ejemplo
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
33
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
33
Alinear Clase


Clase no esta haciendo mucho
Inverso al “Extraer Clase”
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
34
Hay mucho mas...





“Duplicar datos obervados” (MVC)
“Encapsular colección”
“Reemplazar código de tipo con
enumeración”
“Reemplazar código de tipo con subclase”
“Reemplazar código de tipo con Estado/
Estrategia”
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
35
...







“Descomponer condicional”
“Reemplazar condicional con
polimorfismo”
“Introducir Objeto Nulo”
“Reemplazar método constructor con la
factoría”
“Reemplazar código de error con la
Excepción”
“Subir Método”
“Subir Campo”
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
36
...








“Bajar método”
“Bajar campo”
“Extraer subclase”
“Extraer Interfaz
“Separar dominio de presentación”
“Convertir diseño estructurado a
objetos”
“Extrer jerarquía”
...
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
37
¿Cómo y cuándo refactorizar?
Hay que refactorizar cuando:
 Estamos agregando una función
 Estamos solucionando un “bug”
 Estamos haciendo revisión de código
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
38
...

Es necesario tener un arnés de pruebas en plazo
Se refactoriza paso a paso: refactorización
mínima, ejecución de pruebas

Herramientas para crear y ejecutar pruebas
unitarias: Nunit y CSUnit etc

Es más rápido refactorizar utilizando algunas
herramientas de refactorización: Flywheel, C#
Refactory etc.

Próxima versión de Visual Studio (“Whidbey”) va
a apoyar ciertas refactorizaciones en C#

Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
39
Visual Studio “Whidbey”
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
40
¿Cuándo no deberíamos
refactorizar?
 Es más fácil hacerlo de nuevo
 Una señal importante: El código no funciona
 Demasiado cerca de la fecha de entrega comprometida
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
41
¿Donde obtener mas
información?
 www.refactoring.com
 www.refactorizacion.com
 Libro de Martin Fowler “Refactoring”
 Programación ágil
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
42
Síntesis
Código Simple
Fault avoidance
Entienda sin necesidad
de comentarios
Confiable
Carrera de Sistemas&Informática UMSS:
Cochabamba-Bolivia
Mantenible
Mgr. Indira Camacho del Castillo
Materia: Ingeniería de Software
43