2. 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
3. Diseño Diseñando puedo pensar muy rápido, pero mi razonamiento está lleno de agujeritos. http://www.flickr.com/photos/hackerchick/4547529858/
4. Malos olores Si apesta, hay que cambiarlo. La abuela Beck, sobre la crianza de bebes. http://www.flickr.com/photos/brian-burke/266468336/
5. Código duplicado El principio de todos los males Refactorings: Extraer método Extraer clase Subir campo Método plantilla
6. 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
7. Clase muy grande Otro clásico Refactorings: Extraer Clase Extraer Subclase Extraer Interfaz Reemplazar valor de datos con Objeto
8. Lista de parámetros muy larga Un vicio popular Refactorings: Reemplazar parámetro con Método Introducir Objeto parámetro Preservar Objeto completo
10. Cirugía con escopeta Los cambios afectan por doquier Refactorings: Mover método Mover campo Clase en una línea
11. Envidia de características Clases que usan más los miembros ajenos que los propios Refactorings: Mover método Mover campo Extraer método
12. Datos en yunta Grupitos inseparables Refactorings: Extraer clase Introducir Objeto parámetro Preservar Objeto completo
13. 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
14. 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
15. 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
16. Clase vaga Clases que no cubren su costo Refactorings: Clase en una línea Colapsar jerarquía
17. 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
18. Campo temporal Los campos (o variables locales) deben justificarse Refactorings: Extraer clase Introducir objeto nulo
19. Cadenas de mensajes Demasiados saltos sin una buena razón Refactoring: Esconder delegado
20. Intermediario Métodos que todo lo delegan Refactorings: Quitar Intermediario Método en una línea Reemplazar delegación con herencia
21. 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
22. Clases alternativas con interfaces diferentes Quiebres en el polimorfismo y probables fallas de jerarquías Refactorings: Renombrar método Mover método
23. Biblioteca de clases incompleta Extendiendo clases sin tener las fuentes Refactorings: Introducir método foráneo Introducir extensión local
25. Comentarios No, no está mal poner comentarios, pero… Refactorings: Extraer método Introducir aserción
26. 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.
27. Herramientas de Refactoring Refactoring Browser (Smalltalk) Eclipse (Java) Visual Studio / MonoDevelop (básicas) ReSharper / Code Rush
Refactoring (verbo) – Refactoring (sustantivo)ObjetivosMejorar el diseño del softwareHacer que el código sea más entendibleAyuda a encontrar bugs ocultosAumentar la productividad (¡en serio!)
En lugar de diseñar, bosquejar y hacer refactoring.Aumentar niveles de indirecciónCompartir más la lógicaExplicar por separado intención de implementaciónAislar los cambiosEsconder lógica condicionalQuitar indirección parásita (¡fuera!)
Los olores en el código son síntomas evidentes de que la hora del refactoring llegó.Martin Fowler y Kent Beck catalogaron una cierta cantidad de olores y los refactoring apropiados para remediarlos.