Condiciones Físicas M.C. Juan Carlos Olivares Rojas Noviembre 2009.
Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.
-
Upload
jose-maria-romero-gimenez -
Category
Documents
-
view
226 -
download
1
Transcript of Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.
![Page 1: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/1.jpg)
Catálogo de Refactorizaciones
M.C. Juan Carlos Olivares Rojas
Marzo 2011
![Page 2: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/2.jpg)
Agenda
• Composición de Métodos • Moviendo Características entre
objetos
• Organización de datos
![Page 3: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/3.jpg)
Agenda
• Simplificación de expresiones condicionales
• Simplificar llamadas a métodos
• Generalización*
• Refactorizaciones mayores*
![Page 4: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/4.jpg)
Com
pete
ncia
Esp
ecífica
•Investigará las técnicas de reestructuración necesarias para corregir los errores de código, y las aplicará en un caso práctico.
![Page 5: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/5.jpg)
Criterios de Evaluación
• 70% Examen práctico
• 30% Desarrollo de portafolio de evidencias (trabajos, tareas y prácticas)
![Page 6: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/6.jpg)
Composición de Métodos
![Page 7: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/7.jpg)
Com
posició
n d
e
Méto
do
• Las categorías de refactoring de la presente unidad están basadas en (Fowler, 1999).
• Esta categoría tiene como objetivo evitar los malos olores producidos por la duplicación de código (métodos grandes, clases envidiosas, etc.).
![Page 8: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/8.jpg)
Com
posició
n d
e
Méto
do
• La clave para solucionar estos problemas es reescribir código, de tal forma que se pueda entender mucho mejor con la menor redundancia posible.
• El primer refactoring es “Extract Method“ visto con anterioridad.
![Page 9: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/9.jpg)
Inline Method
• Problema: existe mucha indirección de código cuando un método llama a otro y este último es muy pequeño o poco representativo.
• Solución: El cuerpo de un método debe ser tan claro como el nombre del mismo.
![Page 10: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/10.jpg)
Inline Method
• Para lograr esto, es necesario poner el cuerpo del método dentro de sus propias llamadas y posteriormente pueda ser eliminado el otro método. como a continuación se muestra.
• Lenguajes como C++ hacen uso de métodos y variables en línea.
![Page 11: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/11.jpg)
Inline Method
![Page 12: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/12.jpg)
Inline Temp
• Problema: cuando una variable es utilizada una sola vez o pocas veces.
• Solución: es conveniente substituirla por el valor de la asignación temporal
![Page 13: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/13.jpg)
Inline Temp
• Se debe tener cuidado de que el manejo en valores en línea sea más simple y claro que el uso de una variable temporal.
![Page 14: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/14.jpg)
Replace Temp with Query
• Problema: una variable temporal se utiliza en diversas partes del programa provocando que se recalcule varias veces
• Solución: reemplazar dicha variable por la invocación de un método.
![Page 15: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/15.jpg)
Replace Temp with Query
![Page 16: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/16.jpg)
Introduce Explaining Variable
• Problema: si se tiene una expresión compleja que se desea reducir su complejidad
• Solución: introduce el resultado de la expresión (o partes de ella) en una variable temporal que explique el propósito..
![Page 17: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/17.jpg)
Introduce Explainig Variable
![Page 18: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/18.jpg)
Sp
lit Tem
pora
ry
Varia
ble
• Problema: cuando se asigna una variable temporal más de una vez, pero no es una variable de control (de ciclo) ni tampoco una variable de alguna colección (estructura).
![Page 19: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/19.jpg)
Sp
lit Tem
pora
ry
Varia
ble
• Solución: se debe fraccionar la variable haciendo una variable diferente para cada asignación.
• ¿POR QUÉ? Utilizar variables temporales más de una vez (para mas de una cosa) es confuso.
![Page 20: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/20.jpg)
Sp
lit Tem
pora
ry
Varia
ble
![Page 21: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/21.jpg)
Rem
ove A
ssigm
en
t to
Para
mete
rs• Problema: se le asigna un
valor a un parámetro y su forma de acceso no es por referencia.
• Solución: utilizar una variable temporal en su lugar
![Page 22: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/22.jpg)
Rem
ove A
ssigm
en
t to
Para
mete
rs
![Page 23: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/23.jpg)
Replace Method with Method Object
• Problema: hay un método largo que usa variables locales de tal forma que no es posible aplicar “Extraer Método”.
• Solución: convertir el método en un objeto, de modo que todas las variables locales sean a tributos de dicho objeto.
![Page 24: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/24.jpg)
Replace Method with Method Object
public class orden{ public double precio(){ double primerPrecioBase; double segundoPrecioBase; double tercerPrecioBase;//CÁLCULO GRANDE….}}
![Page 25: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/25.jpg)
Replace Method with Method Object
![Page 26: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/26.jpg)
Substitute Algorithm
• Problema: se quiere cambiar un algoritmo por otro que es más claro y/o eficiente.
• Solución: cambiar el cuerpo del método por el nuevo algoritmo. De preferencia se deben conservar las interfaces de los métodos
![Page 27: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/27.jpg)
Substitute Algorithm
![Page 28: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/28.jpg)
Substitute Algorithm
• Actividad: del programa criba substituir el algoritmo para mejorar la legibilidad del código.
• Encontrar de manera individual cada número primo desde 1 hasta n
![Page 29: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/29.jpg)
Substitute Algorithm
• Actividad: es importante que las interfaces del método (parámetros, tipo de retorno) queden igual al original.
• Corroborar con pruebas de regresión (pruebas unitarias).
![Page 30: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/30.jpg)
Med
ición
de
Dese
mp
eñ
o• Un algoritmo puede medir
su desempeño de diversas formas.
• La medición depende de exactamente lo que se quiere medir.
• Si se trata de legibilidad de código no es tan sencilli
![Page 31: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/31.jpg)
Med
ición
de
Dese
mp
eñ
o• La legibilidad puede darse
en tener menos líneas de código o en estar más entendible. Esta es una métrica muy subjetiva.
• En general el desempeño de un algoritmo se mide por su complejidad.
![Page 32: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/32.jpg)
Med
ición
de
Dese
mp
eñ
o• La complejidad generalmente
se mide en tiempo de CPU consumido aunque también puede manejarse por otros factores como el espacio de almacenamiento.
• Respecto a la velocidad se puede tomar el tiempo de pared que tarda el algoritmo.
![Page 33: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/33.jpg)
Med
ición
de
dese
mp
eñ
o• El tiempo de pared no es
una métrica muy exacta. Se puede mejorar si se usa el tiempo desde la computadora aunque sigue sin ser exacto.
• Bajo este tipo de métrica, las pruebas unitarias pueden auxiliarnos dado que registran tiempo.
![Page 34: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/34.jpg)
Activ
idad
• Con la misma prueba unitaria, realiza la corrida de los dos algoritmos para generar números aleatorios, ¿cuál fue la más rápida?
• La estadística juega un papel fundamental, por ello, deberás realizar corridas más de cada una y sacar el promedio final
![Page 35: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/35.jpg)
Med
ición
de
Dese
mp
eñ
o• La forma más genérica de
encontrar la complejidad de un algoritmo es a través de un análisis matemático.
• En general los programas de cómputo son lineales, en este caso se maneja una constante C que es el número de líneas totales.
![Page 36: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/36.jpg)
Med
ición
de
Dese
mp
eñ
o• Entre programas lineales, es
más eficiente el que tiene menos líneas de código.
• En general, si se presentan ciclos se maneja un término lineal n. Se pueden tener polinomios más complejos y generalmente la constante C no es tomada en cuenta.
![Page 37: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/37.jpg)
Med
ición
de
Dese
mp
eñ
o• Por ejemplo:
boolean perfecto = false;suma = 0;for(int i=1;i<n-1;i++){ if(n%i==0) suma+=i; }if(suma==n) perfecto = true;
![Page 38: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/38.jpg)
Med
ición
de
Dese
mp
eñ
o• Este algoritmo tiene la
siguiente complejidad:
• Las primeras dos líneas son secuenciales por lo tanto C=2.
• Después se tiene un ciclo que se repite n-1 veces con una instrucción que siempre se repite
![Page 39: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/39.jpg)
Med
ición
de
Dese
mp
eñ
o• Por lo tanto la complejidad es
de (n-1) * 1 = n-1
• Al final se tiene una decisicon incrementandose la constante C, quedando C=3
• Se dice que C es constante por que independiente de los datos siempre se ejecuta.
![Page 40: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/40.jpg)
Med
ición
de
Com
ple
jidad
• La variable n depede de los datos de entrada del algoritmo.
• La complejidad del algoritmo es (n-1)+3 = n+2. Generalmente se desprecia c por lo que la complejidad se maneja como n o simplemente lineal.
![Page 41: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/41.jpg)
Med
ición
de
Dese
mp
eñ
o• En general en los polinomios
de complejidad la parte más importante es el monomio con la mayor grado, así una complejidad de n2+2n+5 se reduce en n2, siendo cuadrático.
• Si se tienen dos algoritmos de n+10 y de 2n+1 se consideran prácticamente iguales.
![Page 42: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/42.jpg)
Med
ición
de
Dese
mp
eñ
o• Es muy común en la
determinación de complejidad manejar tres escenarios de como se comportan los algoritmos en el mejor de los casos, en el peor de los casos y en el caso promedio.
• En general se comparan las curvas de la complejidad de los algoritmos.
![Page 43: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/43.jpg)
Activ
idad
• Determina cual es la complejidad del primer algoritmo (recuerda que si se invocan métodos la complejidad es la suma de la complejidad de los métodos)
• Determina la complejidad del nuevo algoritmo y comparala con el anterior.
![Page 44: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/44.jpg)
Med
ición
de
Dese
mp
eñ
o• En cuestión de espacio
simplemente se revisa la cantidad de variables y su tamaño.
• En este caso hay que contabilizar el tamaño total en bytes de las estructuras de datos utilizadas de ambos algoritmos y compararlas.
![Page 45: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/45.jpg)
Moviendo Características entre Objetos
![Page 46: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/46.jpg)
Moviendo características
• Atacan principalmente el problema de que las responsabilidades de un clase realmente no le pertenecen.
• Se soluciona moviendo el código de una clase a otro.
• El refactoring más sencillo es el ya visto de Move Method.
![Page 47: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/47.jpg)
Move Field
• Problema: un atributo es usado más en otra clase distinta a la que está.
• Solución: mover el atributo a la otra clase.
![Page 48: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/48.jpg)
Extract Class
• Problema: una clase está haciendo lo que deberían hacer dos clases (podría ser una clase grande).
• Solución: crear una nueva clase y colocar la funcionalidad repartida entre las dos clases
![Page 49: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/49.jpg)
Extract Class
![Page 50: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/50.jpg)
Inlin
e C
lass
• Problema: Una clase no está haciendo mucho (perezosa)
• Solución: mover todas sus características en otras clases y borrar dicha clase.
![Page 51: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/51.jpg)
Hid
e D
ele
gate
d
• Problema: una clase cliente llama a la clase delegada de otro objeto, situación que no debe de ocurrir.
• Solución: ocultar el método de la clase delegada así como el orden de las interacciones
![Page 52: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/52.jpg)
Hid
e D
ele
gate
• ¿Qué hay de malo en esto?
![Page 53: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/53.jpg)
Hid
e D
ele
gate
• Solución
![Page 54: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/54.jpg)
Remove Middleman
• Problema: se tiene una clase intermedia que hace más difiícil de entender la delegación de responsabilidades (lo contrario al problema anterior).
• Solución: quitar la clase intermedia y hacer la delegaciónde forma directa
![Page 55: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/55.jpg)
Remove middleman
![Page 56: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/56.jpg)
Intro
d. Fo
reig
n M
eth
od
• Problema: una clase servidora necesita de un método adicional, pero no podemos modificar la clase
• Solución: crear un método en la clase cliente con una instancia de la clase servidora como primer argumento
![Page 57: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/57.jpg)
Intro
d. Fo
reig
n M
eth
od
• Date newStart = new Date (previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
• Date newStart = nextDay(previousEnd);
• private static Date nextDay(Date arg) { return new Date (arg.getYear(),arg.getMonth(), arg.getDate() + 1);}
![Page 58: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/58.jpg)
Intro
d. Lo
cal E
xte
nsio
n
• Problema: una clase servidora necesita de múltiples métodos pero no podemos modificar la clase.
• Solución: crear una nueva clase que contenga estos métodos. Hacer de esta una subclase, clase de extensión o Wrapper de la original.
![Page 59: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/59.jpg)
Intro
d. Lo
cal E
xte
nsio
n
![Page 60: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/60.jpg)
Organización de Datos
![Page 61: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/61.jpg)
Organización de Datos
• Se propone una serie de lineamientos enfocados al correcto uso de la información de un objeto, como puede ser el encapsulamiento de atributos, el reemplazo de referencias por valores, el reemplazo de estructuras por objetos, etc.
![Page 62: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/62.jpg)
Self Encapsulated Field
• Problema: se accede directamente un campo, pero el acoplamiento con éste se torna poco manejable
• Solución: crear métodos de get y set para manipular los campos y utilizar solo ésos métodos para acceder a los campos.
![Page 63: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/63.jpg)
Self Encapsulated Field
![Page 64: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/64.jpg)
Rep
l. Data
Val w
ith O
bj.
• Replace Data Value with Object
• Problema: se necesita algún dato adicional o complementario
• Solución: el dato se vuelve un objeto.
![Page 65: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/65.jpg)
Rep
l. Data
Val w
ith O
bj.
![Page 66: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/66.jpg)
Change Value to Reference
• Problema: se tiene una clase con muchas instancias iguales que se desea reemplazar con un objeto simple.
• Solución: cambiar el objeto por una referencia al objeto
![Page 67: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/67.jpg)
Change Value to Reference
![Page 68: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/68.jpg)
Change Value to Reference
class Customer { public Customer (String name)
{}_name = name;}
public String getName() {return _name;}
private final String _name;}
![Page 69: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/69.jpg)
Change Value to Reference
class Order... public Order (String customerName)
{_customer = new Customer(customerName);}
public void setCustomer(String customerName) {_customer = new Customer(customerName);}
public String getCustomerName() {return _customer.getName(); private Customer _customer;}
![Page 70: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/70.jpg)
Change Value to Reference
• Y el siguiente código cliente:
private static int numberOfOrdersFor(Collection orders, String customer) {
int result = 0;Iterator iter = orders.iterator();
![Page 71: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/71.jpg)
Change Value to Reference
while (iter.hasNext()) {Order each = (Order) iter.next(); if
(each.getCustomerName().equals(customer)) result++;
}}return result;}
![Page 72: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/72.jpg)
Change Value to Reference
• ¿qué hay de malo en el código?
• Siempre se crea un nuevo cliente cada vez que se usa el código.
• Se debe cambiar el código para devolver una referencia en caso de que exista. Ocupa de ver más refactorings.
![Page 73: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/73.jpg)
Change Reference to Value
• Problema: se tiene una referencia a objeto que es pequeña, inmutable y fácil de manejar
• Solución: cambiar la referencia por el valor de un objeto
![Page 74: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/74.jpg)
Change Reference to Value
![Page 75: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/75.jpg)
Sintactic Sugar
![Page 76: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/76.jpg)
Azúcar Sintáctico
• Es una facilidad dada por los desarrolladores del lenguaje para escribir menos. El ejemplo más sencillo es el operador ++, C++ es equivalente a C=C+1
• Ciclo for (implementación while)
![Page 77: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/77.jpg)
Azúcar Sintáctico
• IF como operador ternario ?:
• Goto en java, etiquetas:
public static void imprimir(String ... cadenas) {
for (String cadena : cadenas) System.out.println(cadena); } }
![Page 78: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/78.jpg)
Azúcar Sintáctico
• Boxing automático de Datos Primitivos a Objetos: Integer a int
• Anotaciones: @deprecated• Arreglos Triangulares
• Uso de objetos y métodos Thread-safe
![Page 79: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/79.jpg)
Replace Array with Object
• Problema: se tiene un arreglo con valores de diferente elementos.
• Solución: crear un objeto con propiedades de cada valor.
![Page 80: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/80.jpg)
Replace Array with Object
• Ejemplo:
• String[] row = new String[3]; row [0] = "Liverpool";
• row [1] = "15";
• Performance row = new Performance();
• row.setName("Liverpool"); • row.setWins("15");
![Page 81: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/81.jpg)
Otro
s con
ocid
os
• Replace Magic Number with symbolic Constant
• Encapsulated Field
![Page 82: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/82.jpg)
Lab
ora
torio
• Del código proporcionado realizar lo siguiente:
• Determinar malas prácticas de programación.
• Indicar que refactoring de los vistos en el catálogo se aplicó en el código.
![Page 83: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/83.jpg)
Lab
ora
torio
• Es opcional pero ampliamente recomendable la utilización de pruebas unitarias.
• El programa deberá realizar las mismas funciones que el original.
• Podrá realizarse en parejas.
![Page 84: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/84.jpg)
Siete Pecados Capitales en el Diseño de Lenguajes
Tomadoen parte del artículo: “Seven Deadly Sins of Introductory Programming Language Design” de Linda McIver y Damian Conway. Department of Computer Science Monash University, Victoria, Australia
![Page 85: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/85.jpg)
1. M
en
os e
s Más
• No se debe de abusar de la simplicidad.
• Por ejemplo lenguajes como LISP solo tienen un tipo de datos: la lista. Esto hace que el lenguaje sea simple pero difícil de manejar para el programador.
![Page 86: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/86.jpg)
1. M
en
os e
s Más
• Este pecado se puede ver en los lenguajes interpretados donde sólo hay un tipo de datos genérico, el cual puede convertirse en múltiples tipos dependiendo del contexto.
• La estructura de un programa debe de ser simple.
![Page 87: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/87.jpg)
2. M
ás e
s Más
• Los lenguajes deben de ser lo más versátiles y poderosos. C es de propósito general con un enfoque hacia abajo nivel.
• En general los programas deben de ser funcionales y brindar “experiencias” a los usuarios.
![Page 88: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/88.jpg)
3. T
ram
pa G
ram
atica
l• Los lenguajes deben tener
sinónimos semánticos para simplificar su uso (llamado Azúcar sintáctico). Por ejemplo para acceder al segundo valor de un arreglo en C se tienen las siguientes formas: array[1] *(array+1) 1[array] *++array
• Las aplicaciones deberán manejar formas alternas de utilizarse.
![Page 89: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/89.jpg)
4. D
ep
en
den
cia d
el
Hard
ware
• Los lenguajes no deben de depender tanto del hardware para poder funcionar.
• Las aplicaciones deben de poder correr en cualquier tipo de arquitectura sin ningún problema.
![Page 90: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/90.jpg)
5. C
om
patib
ilidad
hacia
a tra
ás
• Los compiladores por razones de compatibilidad deben de soportar las versiones anteriores de los lenguajes, esto hace más pesado e ineficiente el proceso de compilación.
• Se recomienda que las aplicaciones nuevas no dependan de las anteriores.
![Page 91: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/91.jpg)
6. In
telig
en
cia E
xce
siva
• El lenguaje debe ser simple de manejar.
• Las aplicaciones deben ser fácilmente manipulables por los usuarios.
![Page 92: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/92.jpg)
7. V
iola
ción
de
Exp
ecta
tivas
• Las instrucciones deben de realizar una sola cosa. En muchas ocasiones el comportamiento depende del contexto de la aplicación.
• Por ejemplo, algunos lenguajes utilizan el operador = para asignación y para igualdad.
![Page 93: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/93.jpg)
7. V
iola
ción
de
Exp
ecta
tivas
• En general las aplicaciones deben de realizar una acción en concreto.
![Page 94: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/94.jpg)
• Cuando se devuelvan colecciones (estructuras de datos) se debe de proteger la obtención de las mismas a través de un objeto no cambiante. Esto con la finalidad que a partir de un método get no se pueda modificar la colección.
Encapsular Colección
![Page 95: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/95.jpg)
• ¿Cómo implementarla?
• Sino se tiene alguna interfaz para no modificar estructura de datos se deberá construir un objeto nuevo.
Encapsular Colección
![Page 96: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/96.jpg)
Reem
p. C
od
. Tip
os p
or
clase
• Problema: Se da cuando una clase tiene atributos numéricos repetitivos que no afectan su comportamiento.
• Solución: La solución es reemplazar los números por una clase
![Page 97: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/97.jpg)
• .Reemp. Cod. Tipos por clase
![Page 98: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/98.jpg)
• Cuando se tiene atributos de código que afectan al comportamiento de la clase se deberá reemplazar por sublcases:
Reemp. Cod. Tipos por subclase
![Page 99: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/99.jpg)
• En algunas ocasiones no se puede realizar generalización al momento de reemplazar el atributo repetitivo por lo que se recomienda utilizar el patrón Strategy o un objeto Estado:
Reemp. Cod. Tipo por Estrategia
![Page 100: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/100.jpg)
Patró
n E
strate
gia
• Permite tener una interfaz común hacia diversas implementaciones de un problema.
• Este patrón es útil cuando un problema puede resolverse por diversos algoritmos o estrategias.
![Page 101: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/101.jpg)
Patró
n e
strate
gia
![Page 102: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/102.jpg)
• Problema: se tienen subclases que sólo varían en los datos que devuelven los métodos que se consideran constantes. Aunque son muy útiles, no exhiben un comportamiento distinto, por lo que habrá que eliminar la generalización.
• Solución: subir tanto el atributo como el método a la clase padre y eliminar las subclases.
Reemp. Subclases con campos
![Page 103: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/103.jpg)
Reemp. Subclases con campos
![Page 104: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/104.jpg)
Simplificación de Expresiones Condicionales
![Page 105: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/105.jpg)
Descompose Conditional
• Problema: se tiene una condicional compleja.
• Solución: se extraen métodos para la condición y para las acciones de falso y verdadero.
![Page 106: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/106.jpg)
Descompose Conditional
![Page 107: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/107.jpg)
Con
solid
ate
Con
ditio
nal
Exp
ressio
n• Existe una serie de
condicionales que se pueden unificar.
![Page 108: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/108.jpg)
Con
solid
ate
Du
plica
te
Con
ditio
nal Fra
gm
en
ts
• Problema: Se repite el mismo fragmento de código en todas las ramas.
• Solución: Sacarlo de la expresión
![Page 109: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/109.jpg)
Con
solid
ate
Du
plica
te
Con
ditio
nal Fra
gm
en
ts
![Page 110: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/110.jpg)
Remove Control Flag
• ¿Cuál es el problema con el siguiente código?
![Page 111: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/111.jpg)
Remove Control Flag
• Problema: una variable está actuando como un indicador de control para una serie de expresiones lógicas.
• Solución: sustituir por breaks o returns
![Page 112: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/112.jpg)
Remove Control Flag
![Page 113: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/113.jpg)
Remove Control Flag
• En el código anterior found sirve de variable de control y además guarda el resultado. Si se aplica el refactoring se obtiene:
void checkSecurity(String[ ] people){
String found = foundMiscreant(people); someLaterCode(found);
}
![Page 114: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/114.jpg)
Remove Control Flag
![Page 115: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/115.jpg)
• En la década de 1980’s los Sistemas de Información se desarrollaban con UI basadas en Texto.
• En la década de 1990’s los desarrollos fueron “visuales”.
• La década de 2000 se caracterizó por el desarrollo Web.
Patrón MVC
![Page 116: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/116.jpg)
• En la década de 2010 se caracterizará probablemente por el desarrollo móvil y ubicuo.
• Si estas aplicaciones no se desarrollan de forma especial, se tendría que realizar la aplicación desde el inicio.
• Para solucionar este problema existe el patrón de diseño Modelo-Vista-Controlador.
Patrón MVC
![Page 117: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/117.jpg)
Patrón MVC
![Page 118: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/118.jpg)
• Modelo: lógica de datos. Si es java se trata de que sean beans.
• Vista: interfaz de usuario
• Controlador: liga tanto a la vista como al el controlador. Responde generalmente al manejo de eventos.
• Es mala recomendación dejar embebido en la interfaz código de lógica de programa.
Patrón MVC
![Page 119: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/119.jpg)
Patrón MVC
• Es una variante del principio de separación de interfaces.
• En un desarrollo Web, la vista es la página en HTML, el modelo es la Base de Datos y el Controlador es el código que interactúa para hacer el manejo de entradas/salidas y manda llamar al proceso.
![Page 120: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/120.jpg)
Patrón MVC
• Existen diversas implementaciones de este patrón, no hay ninguna estandarizada como tal. Puede haber un modelo con varias vistas y controladores.
• Existen muchos frameworks que trabajan con este principio de forma nativa (Struts, Codeigniter, Ruby on Rails).
![Page 121: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/121.jpg)
Patrón MVC
• El Flujo de control es el siguiente:
1.El usuario realiza una acción en la interfaz
2.El controlador trata el evento de entrada. Previamente se ha registrado.
![Page 122: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/122.jpg)
Patrón MVC
• 3.El controlador notifica al modelo la acción del usuario, lo que puede implicar un cambio del estado del modelo (si no es una mera consulta)
• 4.Se genera una nueva vista. La vista toma los datos del modelo. El modelo no tiene conocimiento directo de la vista
![Page 123: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/123.jpg)
Patrón MVC
• 5.La interfaz de usuario espera otra interacción del usuario, que comenzará otro nuevo ciclo
![Page 124: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/124.jpg)
Patrón MVC
![Page 125: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/125.jpg)
Patrón MVC
public class ProgramaDeConversión {
public static void main(String[] args) {
ConversorEurosPesetas modelo = new ConversorEurosPesetas();
vista = new VentanaConversor();
![Page 126: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/126.jpg)
Patrón MVC
ControlConversor control = new ControlConversor (vista, modelo);
vistavista.setControlador(control);
vista.arranca();}}
![Page 127: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/127.jpg)
• Problema: un método tiene un comportamiento condicional que obscurece el flujo del programa.
• Solución: implementar “clausulas guardianas” para los casos especiales.
Replace Conditional with Guard Clauses
![Page 128: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/128.jpg)
Replace Conditional with Guard Clauses
![Page 129: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/129.jpg)
Rep
lace
Con
ditio
nal
with
Polim
orfism
• Problema: Una sentencia condicional realiza una acción dependiendo del tipo de objeto instanciado.
• Solución: mover cada parte de la condicional a un método de una subclase. La clase padre debe de ser de preferencia abstracta.
![Page 130: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/130.jpg)
Rep
lace
Con
ditio
nal
with
Polim
orfism
![Page 131: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/131.jpg)
• State es un patrón que resuelve la problemática de que el comportamiento de un objeto depende de su estado, y sus métodos contienen la lógica de casos que reflejan las acciones condicionales dependiendo del estado.
• Solución: cree clases de estado para cada estado que implementan una interfaz común.
Patrón Estado
![Page 132: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/132.jpg)
• Utiliza una superclase abstracta (clase de estado), la cual contiene métodos que describen los comportamientos para los estados de un objeto.
• Se maneja una clase de contexto que es la que sirve de interfaz al cliente.
Patrón Estado
![Page 133: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/133.jpg)
Patrón Estado
![Page 134: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/134.jpg)
Simplificar llamadas a métodos
![Page 135: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/135.jpg)
• Estos refactorings tratan de mejorar la legibilidad del uso de los métodos. Algunos refactorings ya se han visto como
• Rename method
Ref. mejorar Simplicidad Método
![Page 136: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/136.jpg)
• Problema: El método necesita que se le pase más información.
• Solución: agregar un parámetro. Si se necesita el método anterior se necesitará realizar polimorfismo.
• En la medida de lo posible hay que evitar el tener una lista de parámetros muy grande.
• También existe Remove Parameter
Add Parameter
![Page 137: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/137.jpg)
• Malor olor: un método devuelve un valor pero también cambia el estado de un objeto.
• Desodorante: crear dos métodos uno para la consulta y otro para el modificador.
Separate query from Modifier
![Page 138: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/138.jpg)
• Malor olor: varios métodos hacen lo mismo pero con diferentes parámetros.
• Desodorante: crear un método que use un parámetro para los diferentes valores.
Parametizer Method
![Page 139: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/139.jpg)
Actividad
• De la biblioteca Vector utilizarla como modelo y desarrollar un programa aplicando el Patrón MVC.
• Considerar dos vistas: una gráfica y una textual que deberán poderse seleccionar al inicio del programa como argumento en CLI.
![Page 140: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/140.jpg)
Actividad
• java AppVector [text]
• La aplicación debe de funcionar con los 5 métodos definidos en la biblioteca.
• El día de hoy se entrega el modelado arquitectónico de la aplicación.
![Page 141: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/141.jpg)
• Malor olor: un método ejecuta distinto código dependiendo de un valor enumerado.
• Desodorante: crear un método separado para cada valor del parámetro.
• Es más claro tener el método switch.turnOn() que switch.setOn(true)
Repl. Param. with Explicit Meth.
![Page 142: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/142.jpg)
Repl. Param. with Explicit Meth.
![Page 143: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/143.jpg)
Rep
lace
Para
mete
r w
ith M
eth
od
• Problema: si un objeto llama a un método que después pasa el resultado obtenido como parámetro para otro método y finalmente el método receptor puede también invocar al primer método, entonces se tiene que eliminar el parámetro y dejar que el receptor invoque directamente al otro método para así ahorrarnos pasos.
![Page 144: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/144.jpg)
Rep
lace
Para
mete
r w
ith M
eth
od
![Page 145: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/145.jpg)
Intro
du
ce P
ara
mete
r O
bje
ct• Problema: un grupo de
parámetros que de manera natural van juntos, representan un problema
• Solución: hay que reemplazarlos con un objeto
![Page 146: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/146.jpg)
Intro
du
ce P
ara
mete
r O
bje
ct
![Page 147: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/147.jpg)
Remove Setting Method
• Problema: el tiempo de creación de un atributo debería estar fijo y nunca alterado.
• Solución: remover los métodos set.
![Page 148: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/148.jpg)
Remove Setting Method
![Page 149: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/149.jpg)
Hide Method
• Problema: un método no está siendo utilizado por ninguna otra clase
• Solución: el método deberá ser privado.
![Page 150: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/150.jpg)
Hide Method
![Page 151: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/151.jpg)
Replace Error Code With Exception
• Cuando un método devuelve un código especial para indicar un error, lo recomendable es hacer el uso de una excepción
![Page 152: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/152.jpg)
Replace Error Code With Exception
![Page 153: Catálogo de Refactorizaciones M.C. Juan Carlos Olivares Rojas Marzo 2011.](https://reader036.fdocuments.net/reader036/viewer/2022062301/5665b47a1a28abb57c91d262/html5/thumbnails/153.jpg)
Du
das