Best Practices für das Umbenennen, Umgestalten und Brechen von Änderungen mit Teams

10

Was sind einige Best Practices für das Refactoring und Umbenennen in Teamumgebungen? Ich spreche dies mit ein paar Szenarien an:

  1. Wenn eine Bibliothek, auf die häufig verwiesen wird, überarbeitet wird, um eine grundlegende Änderung an einer Bibliothek oder einem Projekt vorzunehmen, auf die bzw. das verwiesen wird. ZB willkürlich den Namen einer Methode ändern.

  2. Wenn Projekte umbenannt werden und Lösungen mit aktualisierten Verweisen darauf neu erstellt werden müssen.

  3. Wenn die Projektstruktur geändert wird, um "besser organisiert" zu sein, indem Ordner eingeführt und vorhandene Projekte oder Lösungen an neue Speicherorte verschoben werden.

Einige zusätzliche Gedanken / Fragen:

  1. Sollten Veränderungen wie diese von Bedeutung sein oder ist der daraus resultierende Schmerz ein Hinweis darauf, dass die Struktur schief gegangen ist?

  2. Wer sollte die Verantwortung für die Behebung von Fehlern im Zusammenhang mit einer Änderung übernehmen? Wenn ein Entwickler eine wichtige Änderung vornimmt, sollte er dafür verantwortlich sein, in betroffene Projekte einzusteigen und diese zu aktualisieren, oder sollte er andere Entwickler benachrichtigen und sie auffordern, Änderungen vorzunehmen?

  3. Ist dies etwas, das planmäßig durchgeführt werden kann, oder sollte es so häufig wie möglich durchgeführt werden? Wenn ein Refactoring zu lange aufgeschoben wird, wird es immer schwieriger, es zu vereinbaren, aber gleichzeitig an einem Tag in Schritten von 1 Stunde einen Build zu reparieren, da an anderer Stelle Änderungen vorgenommen werden.

  4. Handelt es sich um einen formalen Kommunikationsprozess oder kann es sich um einen organischen Prozess handeln?

David in Dakota
quelle
1
Laden Sie jedem 1 US-Dollar für jedes Mal auf, wenn er den Build bricht ... Sie wären überrascht, wie sehr er unachtsame Fehler eindämmt.
Berin Loritsch
+1, weil Ihr Kommentar 3 ausgezeichnete - und unterschiedliche - Antworten inspiriert hat.
Carl Manaster

Antworten:

13

Jedes der von Ihnen aufgelisteten Szenarien fällt unter die Kategorie "veröffentlichte API / Code". Dies ist schwer umzugestalten, daher sollte man nichts leichtfertig ändern. Vielmehr sollte er die geplanten Änderungen vorab mit allen Beteiligten aushandeln. Es ist mindestens ebenso ein politisches wie ein technisches Problem.

Der Ratschlag Nummer eins von Martin Fowler lautet daher, dass Sie Ihre Schnittstellen (Projektnamen und -strukturen) nicht vorzeitig veröffentlichen .

Wenn dies jedoch bereits geschehen ist und behoben werden muss, ist es wahrscheinlich besser, die erforderlichen Änderungen in möglichst wenigen Schritten vorzunehmen, um die Störung anderer Parteien zu minimieren. Das weicht ziemlich weit vom ursprünglichen Konzept des Refactorings ab, aber aus gutem Grund.

Wenn möglich, sollten Sie auch die neue Methode hinzufügen (während die vorhandene verworfen wird), anstatt die vorhandene umzubenennen. Dies stellt sicher, dass der Clientcode nicht beschädigt wird, und bietet eine Übergangszeit, in der sie ihren Code aktualisieren können, um der neuesten API zu entsprechen. Der Nachteil ist, dass es Ihre API kompliziert. Obwohl der Status nur vorübergehend ist, kann es einige Zeit dauern, bis Sie veraltete API-Methoden sicher entfernen können (im Fall der Java-Klassenbibliothek Jahre).

Péter Török
quelle
Ich kann den (ansonsten guten) Rat von Martin Fowler nicht verwenden, wenn Sie von anderen geschriebenen Code umgestalten. Außerdem sollte der Entwickler, der die Methoden abgelehnt hat, seine Kollegen daran erinnern, die neuen Methoden von Zeit zu Zeit zu verwenden, ohne zu nervig zu sein, um den Übergang zu beschleunigen. Ich habe den Eindruck, dass die veralteten Methoden in der Java-Klassenbibliothek aus Gründen der Abwärtskompatibilität immer vorhanden sind, aber ich kann mich irren.
Blizpasta
@blizpasta, hängt davon ab, wie viele Clients die betreffende API hat. Wenn Sie ein halbes Dutzend in derselben Abteilung haben, kann es unter normalen Umständen einige Diskussionen und Argumente sowie einige Monate dauern, bis der Übergang abgeschlossen ist. Wenn Sie Millionen von Benutzern und Milliarden von LOC Client-Code auf der ganzen Welt haben, werden Sie diese veralteten Methoden höchstwahrscheinlich nie entfernen.
Péter Török
5

Sie können diese Probleme fast immer vermeiden, indem Sie das Refactoring in zwei Schritten durchführen. Führen Sie im ersten Schritt den neuen Code ein und verwerfen Sie den alten Code. Wenn alle Teams auf den neuen Code migriert sind, löschen Sie den alten Code. Ich verwende diese Technik auch, um ein einzelnes Modul schrittweise umzugestalten. Auf diese Weise kann ich die Menge an Code begrenzen, die zwischen Testläufen geändert werden muss.

Kevin Cline
quelle
2
Wenn ich das getan habe, konnte ich oft den alten Code ändern, um den neuen Code aufzurufen. Dies ermöglicht es, eine Stub-Methode zu werden, und stellt den (hoffentlich) verbesserten Code für Clients der alten Methode bereit.
BillThor
4

Beachten Sie, dass dies einer der Hauptgründe für einen Build-Server ist, auf dem Tests ausgeführt werden.

Wenn etwas passiert, das ein bestimmtes Programm beschädigt, wird Ihnen dies so schnell wie möglich mitgeteilt, und Sie können den Täter aufspüren und die Probleme beheben, solange die Details noch aktuell sind.


quelle