Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

32
Retos en la Adopción de la Práctica del Refactoring Alfredo Chávez Vázquez

Transcript of Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Page 1: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Retos en la Adopción de la Práctica del Refactoring

Alfredo Chávez Vázquez

Page 2: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Vámonos por partes:

� Empecemos por el principio� Refactoring y el ciclo de vida del software� Razones para refactorizar: code smells.� ¿Hacia dónde dirigirse?� ¿Porqué Pépe no refactoriza?� Bibliografía

Page 3: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

ADVERTENCIA

¡Objetos adelante!

Page 4: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Empecemos por el principio

� ¿Qué es el refactoring?� Lo el refactoring NO es� Terminología:

�¿Verbo o sustantivo?

�¿“refactorizar” o “refactorar”?

� Los principios� ¿Cuándo hacer refactoring?

Page 5: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

¿Qué es el Refactoring?

� Definición:

�Un cambio hecho a la estructura interna del software para hacerlo más fácil de entender y más barato de modificar, sin modificar su comportamiento observable.

--Martin Fowler

Page 6: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Lo el refactoring NO es

� Optimización de código.� “Limpieza” de código.� Reescritura o reconstrucción.� Reducir el volumen de código (aunque a

veces sucede)

Page 7: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Terminología

� Sustantivo:�Cada una de las modificaciones hechas al

código fuente que cumplen con la definición.

� Verbo:�El acto de aplicar uno o varios refactorings al

código fuente.

Page 8: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Terminología (cont.)

� Re-factorizar: ����� Implica una asociación con el concepto de

“factorizar”: Descomponer un polinomio en el producto de otros de menor grado.

� Re-factorar: ����� Implica una asociación con “factura”: Acción y

efecto de hacer.

Page 9: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Los principios del refactoring

� La prioridad es mantener el comportamiento actual.

� Comenzar con un objetivo en mente.� Siempre proceder en pasos pequeños y

controlados (baby steps)� Nunca refactorizar y arreglar/agregar/

modificar el código al mismo tiempo (las “dos cachuchas”)

Page 10: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

¿Cuándo refactorizar?

� La regla de tres de Don Roberts:1. La primera vez que hagas algo, solo hazlo.

2. La segunda vez que hagas algo similar, “sóbate” por duplicar, pero sigue adelante.

3. La tercera vez que encuentres algosimilar:

¡Strike 3! ¡Refactoriza!

Page 11: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

El refactoring y el ciclo de vida

De sencillo… a complicado… a monstruo!

Page 12: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Refactoring y el ciclo de vida del software� Mito: “un proyecto de software bien administrado lleva a cabo un

desarrollo metódico de requerimientos y define una lista estable de las responsabilidades del programa. El diseño sigue los requerimientos, y se hace con cuidado para que la codificación pueda proceder de forma lineal, de principio a fin, lo que implica que la mayor parte del código sepuede escribir, probar y olvidar de una sola vez...”

Todo software exitoso cambia.

�Fred P. Brooks Jr.

Page 13: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

El problema de fondo

� La “evolución” del software tiende a ser tomada como un “mal necesario”.

� Nunca es posible saber tanto al comienzo del desarrollo como se llega a saber después.

� El objetivo en la mente de la mayoría de los desarrolladores es “haz que funcione”.

� La mayoría de los desarrolladores no ven fácilmente su propio código con ojo crítico.

Page 14: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

… o desde otro punto de vista

� Prisa� Apatía� Ignorancia� Ambición� Flojera� Orgullo

Page 15: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

La regla cardinal de la evolución de software� La evolución siempre debe conducir a una

mejora en la estructura interna del software.--Steve McConnel

� No hay software tan grande, enredado o complejo que el mantenimiento no pueda empeorarlo--Gerald Weinberg

Page 16: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

El argumento económico

� Entre 60% y 80% del costo total de un proyecto de software ocurre después de que la primera versión es liberada.

� El software difícil de leer es difícil de modificar.

� El software que incluye lógica condicional compleja es difícil de modificar.

� El software que tiene lógica duplicada es difícil de modificar.

� El software que requiere funcionalidad adicional que requiere modificar el código de producción es difícil de extender.

� Por lo tanto, el impacto de la calidad del código fuente sobre el costo/beneficio de un proyecto es directo y a largo plazo.

Fuente: “Frequently Forgotten Fundamental Facts about Software Engineering”

--Robert L. Glass

Page 17: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Razones para refactorizar:“Code Smells”� Los que engordan

� Los redundantes� Los que paralizan

� Los que acoplan� Los desorientados (a

objetos)

� Comentarios

Page 18: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Los que engordan� Métodos/funciones largos.

� Extraer método, remplazar temporal por query, etc.

� Clases/módulos largos.� Extraer superclase, extraer clase,

remplazar valor por objeto� Listas largas de parámetros.

� Introducir parámetro-objeto, remplazar parámetro por método

� Obsesión primitiva.� Remplazar arreglo por objeto ,

remplazar valor por objeto� Racimos de datos.

� Extraer clase, preservar objeto.

Page 19: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Los redundantes� Clase/módulo perezoso.

� Insertar clase, colapsar jerarquía

� Clase de datos.� Mover método, encapsular campo…

� Código duplicado� Extraer método, extraer clase…

� Código muerto� Extraer método, remover método

� Generalidad especulativa� Colapsar jerarquía, remover

parámetro…

Page 20: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Los que paralizan

� Cambio/evolución divergente.� Extraer método, extraer clase.

� Cirugía con escopeta.� Mover método, mover campo…

� Jerarquías de herencia paralelas.� Mover método, mover campo.

Page 21: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Los que acoplan� Envidia de características.

� Mover método, extraer método…

� Intimidad inapropiada.� Mover método, cambiar herencia por

delegación…

� Cadenas de mensajes.� Ocultar delegado

� El intermediario.� Eliminar intermediario, insertar

método…

Page 22: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Los desorientados (a objetos)� Sentencias “switch”.

� Remplazar condición con polimorfismo, remplazar parámetro con métodos…

� Atributos temporales.� Extraer clase, introducir objeto-nulo…

� Legado indeseable.� Remplazar herencia por delegación.

� Clases alternativas con interfaces incompatibles.� Renombrar método, mover método.

Page 23: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Comentarios

¿¡¿¡QUEEEEEEEEEÉ!?!?

�También incluyen #regiones en .NET� Extraer método, renombrar método,

introducir aseveración, introducir objeto-método…

Page 24: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

¿Hacia dónde dirigirse?

“Tal parece que la perfección se alcanza, no cuando no hay nada que añadir, sino

cuando no queda nada que quitar”

-- Antoine de Saint Exupéry

Page 25: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Reglas del diseño simple

1. Pasa todas las pruebas (p.e. cumple los requerimientos).

2. No contiene duplicación.3. Expresa claramente la intensión del

programador.4. Minimiza el número de clases y métodos

para expresar dicha intención.

Page 26: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

¿Porqué Pepe no refactoriza?

� El mito del management.� Bases de datos

�Ver “Refactoring Databases” de Scott Ambler.

� La “propiedad privada” del código.� Interfaces “publicadas”.� Desconocimiento.� Miedo.

Page 27: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

El mito del management

� El management no requiere que justifiquemos cada “for”que escribimos.

� El refactoring debe ser una tarea continua, no discreta.

� Refactorizar un poco, todo el tiempo.

¡Hey tú! Solo acabalo, ¿quieres? Te pago por programar, no limpiar.

code → code → code → clean = code → code → code→¡OUCH!

Page 28: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Bases de datos

� La base de datos ES la arquitectura.

� El código de negocio estáfuertemente acoplado al esquema.

� La migración de datos es ardua y compleja

Page 29: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Propiedad privada del código

� Cada módulo le “pertenece” a un desarrollador.

� Todo el trabajo se detiene si el “dueño” no está disponible.

� Nadie quiere “adoptar” al código sin “dueño”.

Page 30: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Interfaces “publicadas”

� Distinción entre “público” y “publicado”� No se puede saber quiénes y cuantos son

los usuarios del código.� Alternativas:

�Versionamiento de interfases.

Page 31: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Desconocimiento y miedo

� “Si no está roto, no lo arregles”.� Desconocimiento de la técnica de

refactoring.� Desconocimiento de las herramientas

disponibles.� Desconocimiento del código mismo.� Falta de conocimiento y experiencia en

diseño.

Page 32: Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012

Bibliografía

� “Refactoring: Improving the design of existing code” de Martin Fowler.

� “Code Complete, Second Edition” de Steve McConnell.

� “Refactoring Object-Oriented Frameworks”, tesis de doctorado de William F. Opdyke.

� “Smalltalk Best Practice Patterns” de Kent Beck.

� “Refactoring to Patterns” de Joshua Kerievski.

� “AntiPatterns: Refactoring Software, Architectures, and Projects in Crisis” de William J. Brown et al.