La refactorización es, y debería ser, un proceso continuo. No es suficiente simplemente cumplir los requisitos con una implementación funcional y probada que todavía está un poco incompleta.
"Haz que funcione, luego haz que funcione mejor" .
No recuerdo dónde leí esa cita, pero esta es la clave para aplicar bien la refactorización, y lo considero poco profesional para hacer lo contrario.
La refactorización continua es como limpiar los derrames mientras cocina y limpiar los platos después de haber comido. La refactorización dirigida es como encontrar una cocina sucia, pero solo tener tiempo para lavar uno o dos vasos sucios. ¿Prefieres vivir con una cocina continuamente sucia o prefieres mantener las cosas limpias a medida que avanzas?
Obtiene el código para trabajar, luego refactoriza su código para asegurarse de que tiene la mejor implementación que pueda usar. Si está haciendo algo familiar, puede ser que implemente el mejor código la primera vez, sin embargo, lleva un momento verificar dos veces su trabajo para estar seguro. Si parece que podría mejorar su código, entonces intente refactorizar para asegurarse de que su código sea al menos tan simple y limpio como pueda hacerlo. Esto significa que está reduciendo la cantidad de deuda técnica que deja atrás, y hace que sea más fácil de leer y refactorizar la próxima vez que deba tratar el código. Este es el valor central detrás del mantra TDD "Red-Green-Refactor", excepto que en TDD refactoriza principalmente para eliminar la duplicación, también vale la pena revisar otros elementos que podrían ser refactorizados, como clases grandes, métodos largos,
Si se enfrenta a un rediseño importante, entonces tal vez pueda posponerlo por un tiempo, especialmente si se está quedando sin tiempo en su agenda. Sin embargo, esto siempre que la funcionalidad de su código no se vea comprometida, y también siempre que la implementación continúe cumpliendo con los requisitos. Este tipo de situación debería ser algo raro, y puede ayudar a garantizar que sea aún más raro si está refactorizando continuamente a medida que avanza. Sin embargo, aún más importante es que no puede arriesgarse a dejar sus cambios importantes durante demasiado tiempo, de lo contrario terminará creando una carga de trabajo aún más grande que podría ser mucho más costosa de arreglar o podría resultar en un costo aún más costoso fracaso del proyecto
Tengo la impresión de que muchas personas tienden a confundir las definiciones de Refactorización y Reingeniería . Los dos términos describen estrategias para manejar situaciones muy diferentes. Si desea rediseñar, se compromete a realizar un cambio drástico que alterará el comportamiento de un sistema. Esto invalidará algunas pruebas y también requerirá nuevas pruebas. Cuando refactoriza, se asegura de que su sistema continúe comportándose exactamenteigual que antes del cambio, sin embargo, también se asegura de que su código tenga longevidad y que sea más fácil de mantener con el tiempo. No está "proxenetizando" su código por el mero hecho de hacerlo, se está comprometiendo con un estándar profesional de código limpio que reducirá el riesgo de falla y garantizará que su código siga siendo un placer trabajar con él y con un estándar profesional .
Volviendo a la analogía de las ventanas rotas, si rompe la ventana, debe repararla de inmediato. Si no se ha dado cuenta de que una ventana está rota, debe decidir el costo si deja la ventana rota. Ahora, repita las dos oraciones anteriores, pero sustituya Bug por ventana. Terminas necesitando una estrategia diferente. Si ha creado un error mientras codifica, lo arregla de inmediato, o ve si los cambios requerirán un esfuerzo de reingeniería, y toma una decisión comercial sobre cuándo será mejor solucionar el problema. Por lo tanto, no refactoriza para solucionar un problema, refactoriza para asegurarse de que sea más fácil encontrar y solucionar problemas. No me importa lo increíble que creas que es tu código, los sistemas complejos siempre tendrán problemas que deberán abordarse con el tiempo. De esto se trata la deuda técnica, y por qué la refactorización debe ser un proceso continuo a medida que implemente su código , y no dejarla para un tiempo futuro arbitrario.
En resumen, la respuesta de que en raras ocasiones puede ser aceptable diferir los cambios importantes en el código para establecer una fecha límite, sin embargo, no debe considerarse una práctica normal tratar la refactorización como un ejercicio independiente de su trabajo de implementación diario, y ciertamente nunca utilizado como una excusa por equipos que no están familiarizados con el código base como una opción para evitar asegurarse de que su implementación sea tan simple y limpia como puedan hacerlo bajo las circunstancias.