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 expandidas; hace que sea difícil ver el panorama general.
Una pista común es que el parche es enorme pero su descripción es minúscula: "Implementar $ FOO".
Una forma razonable de manejar tal parche es pedir que se rompa en una serie de piezas más pequeñas y autónomas. Al igual 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 realizan cambios funcionales, y luego los parches finales pueden enfocarse en la implementación y prueba real de $ FOO con menos distracciones y pistas falsas.
Para una funcionalidad que requiere un montón de código nuevo, el nuevo código a menudo se puede introducir en trozos comprobables que no cambian el comportamiento del producto hasta que el último parche de la serie llama al nuevo código (un giro de bandera).
En cuanto a hacer esto con tacto, generalmente lo menciono como mi problema y luego le pido ayuda al autor: "Tengo problemas para seguir todo lo que sucede aquí. ¿Podría dividir este parche en pasos más pequeños para ayudarme a entender cómo todo esto encaja? " 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 tome un par de iteradores porque voy a necesitar llamarlo con secuencias distintas de vector para implementar $ FOO.
- Cambie todas las personas que llaman de Frobnicate para que usen la nueva versión.
- Eliminar el antiguo Frobnicate.
- Frobnicate estaba haciendo demasiado. Factoriza el paso de refrumple en su propio método y agrega pruebas para eso.
- Presente Zerzify, con pruebas. No se ha utilizado todavía, pero lo necesitaré por $ FOO.
- Implemente $ FOO en términos de Zerzify y el nuevo Frobnicate.
Tenga en cuenta que los pasos 1 a 5 no realizan cambios funcionales en el producto. Son triviales de revisar, incluyendo asegurarse de que tenga todas las pruebas correctas. Incluso si el paso 6 sigue siendo "complicado", al menos se enfoca en $ FOO. Y, naturalmente, el registro le da una mejor idea de cómo se implementó $ FOO (y por qué se cambió Frobnicate).