You are on page 1of 44

1. Diseo 2. Codificacin 3.

Pruebas
Tarea 18 a 19
Mgr. Indira Camacho del Castillo UMSS: Cochabamba - Bolivia

Mejorando el cdigo existente

x2 1

(x + 1)(x 1),

La refactorizacin es un aspecto importante de la

programacin extrema.
La refactorizacin es un concepto tan importante que

ha sido identificado como una de las ms importantes innovaciones en el campo del software segn David A. Wheeler.

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

4 De refactorizacin.com

Si el software fuera un edificio, se parecera mas a uno de la izquierda o de la derecha?

De refactorizacin.com
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Refactorizacin

Cambios

De refactorizacin.com

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

Cmo podramos describir este software?


Este software padece:

Cdigo mutante Diseo roto


Ms antiguo el cdigo y mas grande, estos sntomas son ms evidentes
De refactorizacin.com
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Por qu nuestro software sufre degeneracin?


Hay que cumplir con la fecha de entrega comprometida,

es LA PRIORIDAD NUMERO UNO!

De refactorizacin.com
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

...
Difcil de hacer una estimacin confiable Difcil de cumplir con lo planeado Aparecen los bugs Difcil de solucionar los bugs Aparecen Expertos o Dueos de cdigo

! Es un circulo vicioso
El proyecto adquiere deuda tecnologica
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

De refactorizacin.com
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Porque pasa esto?


Software es complejo Hay diferentes modos de manejar la complejidad:

proceso, encapsulacin, componentes, los frameworks, reutilizacin etc. Sin embargo, hay que empezar manejando complejidad en el nivel de cdigo.

De refactorizacin.com
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

10

Antes, nuestras prioridades eran tener un cdigo rpido, pequeo (ocupa poca memoria), optimizado, utilizando los algoritmos mas eficaces etc... Hoy en da el enfoque es en cdigo como tal, este cdigo tiene que ser simple
De refactorizacin.com
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

11

Cmo es un cdigo simple?


Funciona bien
Comunica lo que esta haciendo No tiene duplicacin Tiene un nmero menos posible de clases y mtodos

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

De refactorizacin.com
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

12

Cules son los beneficios?


El cdigo es ms fcil de cambiar, evolucionar o arreglar

Es ms fcil desarrollar de un modo iterativo e incremental.


El cdigo es mas fcil de leer (entender) Es ms fcil hacerlo bien desde la primera, as estamos programando mas rpido
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

13

Cmo en esto nos puede apoyar la Refactorizacin?

Definicin:
"Refactorizar un software es modificar su estructura interna con el objeto de que sea ms fcil 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 cdigo internamente sin alterar su funcionalidad externa. En general, con motivos de mejorar el diseo y obtener un cdigo ms simple. Refactorizacin ensea tcnicas para descubrir el cdigo de mala calidad y tcnicas para cambiarlo.

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

14

Refactorizacin ?
Un ejemplo de una refactorizacin trivial es cambiar el

nombre de una variable para que sea ms significativo, como una sola letra 't' a 'tiempo'.
Una refactorizacin ms compleja es transformar el

trozo dentro de un bloque en una subrutina.


Una refactorizacin todava ms compleja es

remplazar una sentencia condicional if por polimorfismo.

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

15

Identificar puntos dbiles de cdigo


Es difcil definir si cdigo es malo o bueno, o cuando

deberamos cambiarlo
Difcil de imponer las mtricas Por eso se habla de los Olores malos en el cdigo

(Bad Smells - Kent Beck)

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

16

Cdigo duplicado

Olor No. 1!

Cierto Cdigo tiene que estar en un lugar y en ningn otro ms Hay que eliminar el cdigo duplicado, tecnicas: Extraer mtodo ,Extraer mtodo + Subir Campo (clases hermanas), Extraer Clase (clases no relacionadas)

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

17

Mtodos largos

Olor No. 2!

Programas con mtodos mas cortos, tienen vida mas larga Mtodos cortos traen beneficios de indireccin: compartir lgica, intento claro, cambio aislado

Comentarios son muchas veces indicadores de distancia semntica, podemos reemplazar comentario con mtodo cuyo nombre tiene mismo significado.
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

18

Clase grande

Olor No. 3!

La clase est haciendo demasiado


Extraer Clase, Extraer Subclase

Hay que empezar eliminando cdigo duplicado y podemos terminar sin necesidad de extraer clase

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

19

y muchos ms
Grupos de datos Jerarquas de herencia paralelas Cadenas de mensajes Intimidad inapropiada Intermediario Legado rechazado Generalizacin especulada Etc...

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

Comentarios

Comentarios mienten, el cdigo no

No pueden reemplazar falta de cdigo mal escrito Despus de una refactorizacin meticulosa, lo mas probable que los comentarios sean innecesarios

Renombrar mtodo
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

21

Refactorizando: Extraer
agrupar

mtodo

Tenemos un fragmento de cdigo que es posible Vamos a transformar el fragmento a un mtodo nuevo

cuyo nombre va a explicar su proposito

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

22

Cdigo
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&Informtica UMSS: Cochabamba-Bolivia

" + nombre); " + valor);

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

23

Refactorizando:

Variable Temporal en lnea


Motivacin: Variable temporal dificulta aplicar el

Extraer mtodo
Variable temporal fue asignada una vez con una simple

expresin
Vamos a reemplazar todas las referencias con la

expresin

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

24

Cdigo
double precioBase = pedido.precioBase(); return (precioBase > 1000);

return(pedido.precioBase()>1000);

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

25

Refactorizando:

Reemplazar Temporal con la consulta


Una de refactorizaciones vitales antes de Extraer

mtodo
Variable temporal esta guardando resultado de una

expresin.
Extraer la expresin en un mtodo. Remplazar todas

las referencias de la variable con el mtodo.

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

26

Cdigo
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&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

27

Reemplazar mtodo con Mtodo-Objeto

Es un mtodo largo pero es difcil aplicar Extraer mtodo por modo en que se utilizan variables locales El mtodo se transforma en un objeto de tal modo que todas las variables locales sean campos del mismo, constructor recibe objeto y parmetros originales, se copia el mtodo original con nombre calcular() y se procede a refactorizar Ahora es fcil aplicar Extrer mtodo!
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

28

Cdigo
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&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

29

Reemplazar Numero Magico con Constante Simbolica


Un literal tiene significado especial
Una de las enfermedades mas antiguas en

computacin Si en un momento hay que cambiar el numero, el esfuerzo necesario puede ser enorme Cdigo difcil de leer

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

30

Cdigo
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&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera 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 Debera estar la clase nueva expuesta a los clientes?

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

32

Ejemplo

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

33
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

33

Alinear Clase

Clase no esta haciendo mucho Inverso al Extraer Clase

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

34

Hay mucho mas...


Duplicar datos obervados (MVC) Encapsular coleccin Reemplazar cdigo de tipo con enumeracin Reemplazar cdigo de tipo con subclase Reemplazar cdigo de tipo con Estado/ Estrategia
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

35

...

Descomponer condicional Reemplazar condicional con polimorfismo Introducir Objeto Nulo Reemplazar mtodo constructor con la factora Reemplazar cdigo de error con la Excepcin Subir Mtodo Subir Campo
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

36

...

Bajar mtodo Bajar campo Extraer subclase Extraer Interfaz Separar dominio de presentacin Convertir diseo estructurado a objetos Extrer jerarqua ...
Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

37

Cmo y cundo refactorizar?


Hay que refactorizar cuando: Estamos agregando una funcin Estamos solucionando un bug Estamos haciendo revisin de cdigo

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

38

...

Es necesario tener un arns de pruebas en plazo

Se refactoriza paso a paso: refactorizacin mnima, ejecucin de pruebas Herramientas para crear y ejecutar pruebas unitarias: Nunit y CSUnit etc

Es ms rpido refactorizar utilizando algunas herramientas de refactorizacin: Flywheel, C# Refactory etc.

Prxima versin de Visual Studio (Whidbey) va a apoyar ciertas refactorizaciones en C#

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo Materia: Ingeniera de Software

39

Visual Studio Whidbey


Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

40

Cundo no deberamos refactorizar?


Es ms fcil hacerlo de nuevo
Una seal importante: El cdigo no funciona Demasiado cerca de la fecha de entrega comprometida

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

41

Donde obtener mas informacin?


www.refactoring.com
www.refactorizacion.com Libro de Martin Fowler Refactoring Programacin gil

Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia

Mgr. Indira Camacho del Castillo

Materia: Ingeniera de Software

42

Sntesis
Cdigo Simple Fault avoidance Entienda sin necesidad de comentarios

Confiable
Carrera de Sistemas&Informtica UMSS: Cochabamba-Bolivia Mgr. Indira Camacho del Castillo

Mantenible
Materia: Ingeniera de Software

43

You might also like