refactoring
DESCRIPTION
Reunión Virtual Alt.NET Hispano sobre ReTRANSCRIPT
Refactoring
Martín Salías
http://www.flickr.com/photos/yomostro/2972523219/
Cualquier tonto puede escribir código que entienda una computadora.Los buenos programadores escriben código que puedan entender los humanos.
Foto: Miguel Saez – Alt.Net Meeting – Redmond, 2008
Diseño Diseñando puedo pensar muy rápido, pero mi razonamiento está lleno de agujeritos.
http://www.flickr.com/photos/hackerchick/4547529858/
Malos oloresSi apesta, hay que cambiarlo.
http://www.flickr.com/photos/brian-burke/266468336/
La abuela Beck, sobre la crianza de bebes.
Código duplicado
• El principio de todos los males
• Refactorings:– Extraer método– Extraer clase– Subir campo– Método plantilla
Método largo
• Uno de los clásicos
• Refactorings:– Extraer método– Reemplazar temporal por
consulta– Reemplazar método por
Objeto método– Descomponer condición
Clase muy grande
• Otro clásico
• Refactorings:– Extraer Clase– Extraer Subclase– Extraer Interfaz– Reemplazar valor de
datos con Objeto
Lista de parámetros muy larga
• Un vicio popular
• Refactorings:– Reemplazar parámetro
con Método– Introducir Objeto
parámetro– Preservar Objeto
completo
Cambios divergentes
• Falla al buscar responsabilidades
• Refactoring:– Extraer clase
Cirugía con escopeta
• Los cambios afectan por doquier
• Refactorings:– Mover método– Mover campo– Clase en una línea
Envidia de características
• Clases que usan más los miembros ajenos que los propios
• Refactorings:– Mover método– Mover campo– Extraer método
Datos en yunta
• Grupitos inseparables
• Refactorings:– Extraer clase– Introducir Objeto
parámetro– Preservar Objeto
completo
Obsesión primitiva• Desperdiciar los tipos extendidos
• Refactorings:– Reemplazar valor de datos con
Objeto– Extraer clase– Introducir Objeto parámetro– Reemplazar array con objeto– Reemplazar tipo con clase– Reemplazar tipo con subclases– Reemplazar tipos con
estado/estrategia
Sentencias switch
• Desperdiciar el poder del polimorfismo
• Refactorings:– Reemplazar condicional con
polimorfismo– Reemplazar tipo con subclases– Reemplazar tipo con
estado/estrategia– Reemplazar parámetro con
métodos explícitos– Introducir objeto nulo
Jerarquías de herencia paralelas
• Un caso especial de cirugía con escopeta
• Cada vez que se modifica algo en una jerarquía, debemos modificar la otra.
• Refactorings:– Mover método– Mover campo
Clase vaga
• Clases que no cubren su costo
• Refactorings:– Clase en una línea– Colapsar jerarquía
Generalidad especulativa
• No hace falta todavía, pero puede ser que…
• Refactorings:– Colapsar jerarquía– Clase en una línea– Quitar parámetro– Renombrar método
Campo temporal
• Los campos (o variables locales) deben justificarse
• Refactorings:– Extraer clase– Introducir objeto nulo
Cadenas de mensajes
• Demasiados saltos sin una buena razón
• Refactoring:– Esconder delegado
Intermediario
• Métodos que todo lo delegan
• Refactorings:– Quitar Intermediario– Método en una línea– Reemplazar delegación
con herencia
Intimidad inapropiada
• Conociendo otras clases demasiado de cerca
• Refactorings:– Mover método– Mover campo– Cambiar asociación
bidireccional a unidireccional– Reemplazar herencia con
delegación– Esconder delegado
Clases alternativas con interfaces diferentes
• Quiebres en el polimorfismo y probables fallas de jerarquías
• Refactorings:– Renombrar método– Mover método
Biblioteca de clases incompleta
• Extendiendo clases sin tener las fuentes
• Refactorings:– Introducir método
foráneo– Introducir extensión local
Legado rechazado
• Interrumpiendo las leyes de la herencia
• Refactoring:– Reemplazar herencia por
delegación
Comentarios
• No, no está mal poner comentarios, pero…
• Refactorings:– Extraer método– Introducir aserción
Evitando problemas con tests
• Una de las maneras más seguras de hacer refactoring sin romper lo que ya funciona es utilizar Unit Testing.
• Se escribe un test (si no existe previamente) antes de hacer cualquier cambio, y se verifica que siga pasándolo luego del refactoring.
Herramientas de Refactoring
• Refactoring Browser (Smalltalk)
• Eclipse (Java)
• Visual Studio / MonoDevelop (básicas)
• ReSharper / Code Rush
Bibliografía
www.refactoring.com
Joshua KerievskyMartin Fowler William Wake
http://www.flickr.com/photos/-bast-/349497988/