Spesso, patch / liste di modifiche "complicate" sono quelle che fanno molte cose diverse contemporaneamente. C'è nuovo codice, codice cancellato, codice refactored, codice spostato, test espansi; rende difficile vedere il quadro generale.
Un indizio comune è che la patch è enorme ma la sua descrizione è minuscola: "Implementa $ FOO".
Un modo ragionevole per gestire una tale patch è chiedere che sia suddiviso in una serie di pezzi più piccoli e autonomi. Proprio come il principio della responsabilità singola afferma che una funzione dovrebbe fare solo una cosa, una patch dovrebbe concentrarsi anche su una sola cosa.
Ad esempio, le prime patch potrebbero contenere refactoring puramente meccanici che non apportano modifiche funzionali, quindi le patch finali possono concentrarsi sull'attuazione e il test effettivi di $ FOO con meno distrazioni e aringhe rosse.
Per funzionalità che richiedono un sacco di nuovo codice, il nuovo codice può spesso essere introdotto in blocchi testabili che non modificano il comportamento del prodotto fino a quando l'ultima patch della serie non chiama effettivamente il nuovo codice (un flag flip).
Per quanto riguarda ciò, in modo tattico, di solito lo dico come un mio problema e quindi chiedo aiuto all'autore: "Ho problemi a seguire tutto ciò che accade qui. Potresti rompere questa patch in passaggi più piccoli per aiutarmi a capire come tutto si adatta insieme?" Talvolta è necessario fornire suggerimenti specifici per i passaggi più piccoli.
Una patch così grande come "Implement $ FOO" si trasforma in una serie di patch come:
- Introdurre una nuova versione di Frobnicate che richiede un paio di iteratori perché avrò bisogno di chiamarlo con sequenze diverse dal vettore per implementare $ FOO.
- Cambia tutti i chiamanti esistenti di Frobnicate per utilizzare la nuova versione.
- Elimina il vecchio Frobnicate.
- Frobnicate stava facendo troppo. Fattorizza il passo di aggiornamento nel proprio metodo e aggiungi i test per questo.
- Presenta Zerzify, con i test. Non ancora utilizzato, ma ne avrò bisogno per $ FOO.
- Implementa $ FOO in termini di Zerzify e il nuovo Frobnicate.
Si noti che i passaggi 1-5 non apportano modifiche funzionali al prodotto. Sono banali da revisionare, anche assicurandosi di avere tutti i test giusti. Anche se il passaggio 6 è ancora "complicato", almeno si concentra su $ FOO. E il registro ti dà naturalmente un'idea molto migliore di come è stato implementato $ FOO (e perché è stato cambiato Frobnicate).