Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
-
Upload
alfredo-chavez -
Category
Technology
-
view
134 -
download
0
Transcript of 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
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
ADVERTENCIA
¡Objetos adelante!
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?
¿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
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)
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.
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.
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”)
¿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!
El refactoring y el ciclo de vida
De sencillo… a complicado… a monstruo!
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.
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.
… o desde otro punto de vista
� Prisa� Apatía� Ignorancia� Ambición� Flojera� Orgullo
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
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
Razones para refactorizar:“Code Smells”� Los que engordan
� Los redundantes� Los que paralizan
� Los que acoplan� Los desorientados (a
objetos)
� Comentarios
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.
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…
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.
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…
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.
Comentarios
¿¡¿¡QUEEEEEEEEEÉ!?!?
�También incluyen #regiones en .NET� Extraer método, renombrar método,
introducir aseveración, introducir objeto-método…
¿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
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.
¿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.
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!
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
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”.
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.
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.
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.