A menudo, los parches / listas de cambios "complicados" son los que hacen muchas cosas diferentes a la vez. Hay código nuevo, código eliminado, código refactorizado, código movido, pruebas ampliadas; hace que sea difícil ver el panorama general.
Una pista común es que el parche es enorme pero su descripción es pequeña: "Implementar $ FOO".
Una forma razonable de manejar un parche de este tipo es pedir que se rompa en una serie de piezas más pequeñas y autónomas. Del mismo modo que el principio de responsabilidad única dice que una función debe hacer solo una cosa, un parche también debe enfocarse en una sola cosa.
Por ejemplo, los primeros parches pueden contener refactorizaciones puramente mecánicas que no hacen cambios funcionales, y luego los parches finales pueden centrarse en la implementación real y las pruebas de $ FOO con menos distracciones y arenques rojos.
Para la funcionalidad que requiere mucho código nuevo, el nuevo código a menudo se puede introducir en fragmentos comprobables que no cambian el comportamiento del producto hasta que el último parche de la serie realmente llama al nuevo código (un cambio de marca).
En cuanto a hacer esto con tacto, generalmente lo considero mi problema y luego pido ayuda del autor: "Tengo problemas para seguir todo lo que está sucediendo aquí. ¿Podría dividir este parche en pasos más pequeños para ayudarme a comprender cómo encaja todo esto?" ¿juntos?" A veces es necesario hacer sugerencias específicas para los pasos más pequeños.
Un parche tan grande como "Implementar $ FOO" se convierte en una serie de parches como:
- Presente una nueva versión de Frobnicate que requiere un par de iteradores porque voy a necesitar llamarlo con secuencias que no sean vectores para implementar $ FOO.
- Cambie todas las llamadas existentes de Frobnicate para usar la nueva versión.
- Eliminar el viejo Frobnicate.
- Frobnicate estaba haciendo demasiado. Factorice el paso de refrumple en su propio método y agregue pruebas para eso.
- Introducir Zerzify, con pruebas. Todavía no se usa, pero lo necesitaré por $ FOO.
- Implemente $ FOO en términos de Zerzify y el nuevo Frobnicate.
Tenga en cuenta que los pasos 1-5 no hacen cambios funcionales en el producto. Son triviales de revisar, lo que incluye garantizar que tenga todas las pruebas correctas. Incluso si el paso 6 sigue siendo "complicado", al menos se centra en $ FOO. Y el registro naturalmente le da una idea mucho mejor de cómo se implementó $ FOO (y por qué se cambió Frobnicate).