Oft sind "komplizierte" Patches / Änderungslisten solche, die viele verschiedene Dinge gleichzeitig tun. Es gibt neuen Code, gelöschten Code, überarbeiteten Code, verschobenen Code und erweiterte Tests. es macht es schwer, das große Ganze zu sehen.
Ein häufiger Hinweis ist, dass der Patch riesig ist, seine Beschreibung jedoch winzig ist: "Implementiere $ FOO."
Ein vernünftiger Weg, mit einem solchen Patch umzugehen, besteht darin, zu verlangen, dass er in eine Reihe kleinerer, in sich geschlossener Teile zerlegt wird. So wie das Prinzip der Einzelverantwortung besagt, dass eine Funktion nur eine Sache tun sollte, sollte sich ein Patch auch nur auf eine Sache konzentrieren.
Beispielsweise können die ersten Patches rein mechanische Refactorings enthalten, die keine funktionalen Änderungen vornehmen, und die endgültigen Patches können sich auf die tatsächliche Implementierung und das Testen von $ FOO mit weniger Ablenkungen und Red Herings konzentrieren.
Für Funktionen, die viel neuen Code erfordern, kann der neue Code häufig in testbaren Blöcken eingefügt werden, die das Verhalten des Produkts erst ändern, wenn der letzte Patch in der Serie den neuen Code tatsächlich aufruft (ein Flag-Flip).
Um dies taktvoll zu tun, formuliere ich es normalerweise als mein Problem und bitte den Autor um Hilfe: "Ich habe Probleme, alles zu verfolgen, was hier vor sich geht. Könnten Sie diesen Patch in kleinere Schritte aufteilen, um mir zu helfen, zu verstehen, wie das alles passt zusammen?" Manchmal müssen spezielle Vorschläge für die kleineren Schritte gemacht werden.
So ein großer Patch wie "Implement $ FOO" verwandelt sich in eine Reihe von Patches wie:
- Stellen Sie eine neue Version von Frobnicate vor, die zwei Iteratoren benötigt, da ich sie mit anderen Sequenzen als vector aufrufen muss, um $ FOO zu implementieren.
- Wechseln Sie alle vorhandenen Anrufer von Frobnicate, um die neue Version zu verwenden.
- Lösche das alte Frobnikat.
- Frobnicate tat zu viel. Ziehe den Refrumple-Schritt in seine eigene Methode ein und füge Tests dazu hinzu.
- Führen Sie Zerzify mit Tests ein. Noch nicht benutzt, aber ich brauche es für $ FOO.
- Implementiere $ FOO in Bezug auf Zerzify und das neue Frobnikat.
Beachten Sie, dass die Schritte 1 bis 5 keine funktionalen Änderungen am Produkt vornehmen. Sie sind einfach zu überprüfen, einschließlich der Sicherstellung, dass Sie alle richtigen Tests haben. Auch wenn Schritt 6 immer noch "kompliziert" ist, konzentriert er sich zumindest auf $ FOO. Und das Protokoll gibt Ihnen natürlich eine viel bessere Vorstellung davon, wie $ FOO implementiert wurde (und warum Frobnicate geändert wurde).