Nunca había oído hablar del término 'Aplicación de Estrangulador' - Me gusta. Siempre que sea posible, este sería siempre un buen enfoque, ciertamente minimiza el riesgo y es bastante pragmático, fragmentando el edificio grande pieza por pieza.
Cuando eso no funciona en mi experiencia es cuando se necesitan cambios razonablemente significativos de inmediato, cambios que requerirán un poco de refactorización (o una gran cantidad de piratería). En esa situación, a menudo descubrí que los cambios que debía hacer estaban en el corazón de la gran bola de barro y no había otra opción que ensuciarme: incluso lo que debería haber sido mantenimiento estándar o cambios menores de mejora eran simplemente horribles y refactor importante fue la mejor opción.
Para esos casos, yo iría con dividir y conquistar - el primer objetivo que siempre pretendo es la capacidad de prueba, una vez que tiene que todo el resto es mucho más fácil. De hecho, ese es a menudo uno de los principales factores que tengo para refactorizar lejos de la gran bola de lodo: ese tipo de código a menudo es casi imposible de probar, con suerte hay ejemplos de entradas y salidas de IU, pero a veces incluso eso falta .
Así que cuando me enfrento al código donde todo está agrupado en la UI, generalmente empiezo por factorizar unidades discretas de funcionalidad en clases y métodos, y luego presiono esas partes de código en un dominio o capa de servicio. Hacerlo poco a poco reduce en gran medida las posibilidades de romper algo y facilita la localización del código de corte cuando las cosas van mal.
Ejecuta los casos de prueba que tengas disponibles al final de cada cambio y asegúrate de que sigues cumpliendo con algún tipo de línea base.
Si escribe buenas pruebas unitarias sobre la marcha, puede comenzar a reducir la escala del problema y he descubierto que pronto es práctico adoptar el enfoque de estrangulamiento, con pruebas unitarias decentes o al menos el marco adecuado para permitir la escritura de pruebas de unidades decentes se vuelve mucho más práctico para reemplazar gradualmente partes de la funcionalidad.