refactorización mejorando el diseño del código existente © 2003 refactorización.com. todos...
TRANSCRIPT
![Page 1: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/1.jpg)
Refactorización
Mejorando el diseño del código existente
© 2003 refactorización.com. Todos derechos reservados.
![Page 2: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/2.jpg)
2
![Page 3: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/3.jpg)
3
¿Si su software fuera un edificio, se parecería mas a uno de la izquierda o de la derecha?
![Page 4: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/4.jpg)
4
Cambios
Refactorización
![Page 5: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/5.jpg)
5
¿Cómo podríamos describir este software?
Este software padece: “Código mutante” “Diseño roto”Mas antiguo el código y mas grande,estos síntomas son mas evidentes
![Page 6: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/6.jpg)
6
¿Porque nuestro software sufre degeneración? Hay que cumplir con la fecha de
entrega comprometida, es LA PRIORIDAD NUMERO UNO!
![Page 7: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/7.jpg)
7
... 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
!Es un circulo vicioso¡
El proyecto adquiere “deuda tecnologica”
![Page 8: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/8.jpg)
8
¿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.
![Page 9: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/9.jpg)
9
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
![Page 10: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/10.jpg)
10
¿Cómo es un código simple? Funciona bien Comunica lo que esta haciendo No tiene duplicación Tiene un numero menos posible de
clases y métodos
![Page 11: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/11.jpg)
11
¿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
![Page 12: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/12.jpg)
12
¿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.
Refactorización enseña tecnicas para descubrir el código de mala calidad y tecnicas para cambiarlo.
![Page 13: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/13.jpg)
13
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)
![Page 14: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/14.jpg)
14
Código duplicado
¡Olor No. 1!
Cierto Código tiene que estar en un lugar y en ningun otro más
Ha que eliminar el código duplicado, tecnicas: Extraer método ,Extraer método + Subir Campo (clases hermanas), Extraer Clase (clases no relacionadas)
![Page 15: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/15.jpg)
15
Métodos largos Programas con métodos mas cortos, tienen vida mas larga
métodos cortos traen beneficios de indirección: Compartir logica, Intento claro, Cambio Aislado
Comentarios son muchas veces indicadores de distancia semantica, podemos reemplazar comentario con método cuyo nombre tiene mismo significado.
![Page 16: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/16.jpg)
16
Clase grande
La clase esta haciendo demaciado
“Extraer Clase”, “Extraer Subclase”
Hay que empezar eliminando código duplicado y podemos terminar sin necesidad de extraer clase
![Page 17: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/17.jpg)
17
Lista de parámetros larga
No siempre hay que pasar toda la información al método, a veces podemos preguntar otro objeto
![Page 18: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/18.jpg)
18
Cambio divergente
Una clase propensa a cambios por motivos diversos
“Extraer Clase”
![Page 19: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/19.jpg)
19
Cirugía de la escopeta
Opuesto al Cambio divergente – un tipo de cambio requiere muchas (pequeñas) modificaciones a clases diversas
“Mover método” , “Mover campo”, “Alinear Clase”
![Page 20: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/20.jpg)
20
Envidia de las funcionalidades métodos de una clase mas interesados en datos de otra clase que en los datos suyos
Muchas llamadas a propiedades de otra clase
“Mover método”
Algunos patrones van en contra de esta regla: “Estrategia” y “Visitante”
![Page 21: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/21.jpg)
21
Los “Switch” Lo tipico de un software Orientado a Objetos es el uso minimo de los “switch”(o case, o switch escondido).
El problema es la duplicación, el mismo “switch” en lugares diferentes
Terminar con “Reemplazar Condicional con Polimorfismo”
![Page 22: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/22.jpg)
22
Obsesión con los primitivos
Los tipos primitivos son “ladrillos” de software
En un lenguaje OO es facil crear un tipo que no se diferencia de otro que nos provee la plataforma
“Reemplazar Valor del Dato con Objeto”, “Reemplazar Codigo de Tipo con Enum”
![Page 23: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/23.jpg)
23
Comentarios “Comentarios mienten, el código no”
No pueden reemplazar falta de código mal escrito
Despues de una refactorización meticulosa, lo mas probable que los comentarios sean inecesarios
“Renombrar método”
![Page 24: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/24.jpg)
24
Hay mas ... “Grupos de datos”
“Jerarquias de herencia paralelas”
“Cadenas de mensajes”
“Intimidad inapropiada”
“Intermediario”
“Legado rechazado”
“Generalización especulada”
Etc...
![Page 25: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/25.jpg)
25
Las Refactorizaciones Técnicas detalladas de
transformaciones del código Formato común: Motivación,
Mecanismo y Ejemplo Pueden ser en nivel de un objeto,
entre dos objetos, entre grupos de objetos y en escala grande
![Page 26: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/26.jpg)
26
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
![Page 27: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/27.jpg)
27
Códigovoid imprimirDebe()
{
imprimirEncabezado();
//print details
Console.Out.WriteLine("Nombre: " + nombre);
Console.Out.WriteLine("Monto: " + debe());
}
void imprimirDebe()
{
imprimirEncabezado();
imprimirDetalle(debe());
}
void imprimirDetalle(double valor) {
Console.Out.WriteLine("Nombre: " + nombre);
Console.Out.WriteLine("Monto: " + valor);
}
![Page 28: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/28.jpg)
28
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
![Page 29: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/29.jpg)
29
Código
double precioBase = pedido.precioBase();
return (precioBase > 1000);
return(pedido.precioBase()>1000);
![Page 30: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/30.jpg)
30
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.
![Page 31: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/31.jpg)
31
Códigodouble 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;}
![Page 32: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/32.jpg)
32
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 parametros originales, se copia el método original con nombre calcular() y se procede a refactorizar
¡Ahora es facil aplicar “Extrer método”!
![Page 33: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/33.jpg)
33
Códigoclass Pedido{
double precio(int numeroItems){
double precioBasePrimario;
double precioBaseSecundario;
int valorX = numeroItems * delta();
//computo largo...
}
}
return new CalculaPrecio(this, numeroItems).calcular();
![Page 34: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/34.jpg)
34
Mover método y Mover Campo Dos refactorizaciónes esenciales ¿Donde pertenecen las
responsabilidades? El método se ocupa mas por la otra
clase o bien utiliza mas la otra clase A veces es más facil mover un
grupo de métodos y campos juntos
![Page 35: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/35.jpg)
35
Ejemplo
![Page 36: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/36.jpg)
36
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
![Page 37: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/37.jpg)
37
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;
![Page 38: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/38.jpg)
38
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?
![Page 39: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/39.jpg)
39
Ejemplo
![Page 40: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/40.jpg)
40
Alinear Clase Clase no esta haciendo mucho Inverso al “Extraer Clase”
![Page 41: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/41.jpg)
41
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”
![Page 42: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/42.jpg)
42
... “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”
![Page 43: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/43.jpg)
43
... “Bajar método” “Bajar campo” “Extraer subclase” “Extraer Interfaz “Separar dominio de presentación” “Convertir diseño estructurado a
objetos” “Extrer jerarquía” ...
![Page 44: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/44.jpg)
44
¿Como y cuando refactorizar?
Hay que refactorizar cuando: Estamos agregando una función Estamos solucionando un “bug” Estamos haciendo revisión de
código
![Page 45: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/45.jpg)
45
...
Es necesario tener un arnés de pruebas en plazo
Se refactoriza paso a paso: refactorización minima, ejecución de pruebas
Herramientas para crear y ejecutar pruebas unitarias: Nunit y CSUnit etc
Es mas rápido refactorizar utilizando algunas herramientas de refactorización: Flywheel, C# Refactory etc.
Proxima versión de Visual Studio (“Whidbey”) va a apoyar ciertas refactorizaciones en C#
![Page 46: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/46.jpg)
46
Visual Studio “Whidbey”
![Page 47: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/47.jpg)
47
¿Cuándo no deberíamos refactorizar? Es mas facil hacerlo de nuevo Una señal importante: El código no
funciona Demasiado cerca de la fecha de
entrega comprometida
![Page 48: Refactorización Mejorando el diseño del código existente © 2003 refactorización.com. Todos derechos reservados](https://reader033.vdocuments.co/reader033/viewer/2022061216/54a79ac5497959eb6d8b49d0/html5/thumbnails/48.jpg)
48
¿Donde obtener mas información? www.refactoring.com www.refactorizacion.com Libro de Martin Fowler
“Refactoring” Programación ágil