Spesso, le patch / changelists "complicate" sono quelle che fanno molte cose diverse contemporaneamente. C'è un 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 è chiedergli di essere suddiviso in una serie di pezzi più piccoli e autonomi. Proprio come il principio di responsabilità singola dice 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, e quindi le patch finali possono focalizzarsi sull'effettiva implementazione e test di $ FOO con meno distrazioni e false falsificazioni.
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 mi riguarda con tatto, di solito lo esprimo come mio problema e poi chiedo l'aiuto dell'autore: "Sto avendo problemi a seguire tutto quello che succede qui. Potresti rompere questa patch in piccoli passi per aiutarmi a capire come tutto questo combacia? " 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:
- Introduci una nuova versione di Frobnicate che accetta un paio di iteratori perché dovrò 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. Calcola il passaggio rifleto nel proprio metodo e aggiungi test per questo.
- Introduci Zerzify, con i test. Non ancora usato, ma ne avrò bisogno per $ FOO.
- Implementa $ FOO in termini di Zerzify e del nuovo Frobnicate.
Si noti che i passaggi 1-5 non apportano modifiche funzionali al prodotto. Sono banali da recensire, compreso il fatto di avere tutti i test giusti. Anche se il passaggio 6 è ancora "complicato", almeno è focalizzato su $ FOO. E il log ti dà un'idea migliore di come è stato implementato $ FOO (e perché Frobnicate è stato modificato).