Sollten Sie vorhandenen Code umgestalten, der in einem Projekt mit neuen Funktionen nicht fehlerhaft ist?

11

Angesichts eines kleinen Projekts, das darauf abzielt, der Anwendung neue Funktionen hinzuzufügen, berühren die eingeführten Änderungen vorhandenen Code, wobei diese in bestimmten Bereichen aktualisiert werden. Während der Implementierung habe ich festgestellt, dass einige dieser Codes, die aktualisiert wurden, Kandidaten für das Refactoring haben.

Ist dies ein angemessener Zeitpunkt für eine Umgestaltung, für die wiederum Regressionstests für die betroffenen Komponenten erforderlich wären (wodurch möglicherweise ein Umfang eingeführt wird, der ursprünglich nicht Teil des Projekts war)? Oder sollte ich die Funktionalität verschieben, vervollständigen und möglicherweise ein separates Projekt für das Refactoring haben (obwohl ich etwas zögerlich bin, da Geschäftsbenutzer ein Projekt, das keine Funktionalität hinzufügt, möglicherweise nicht vollständig sponsern, es sei denn, sie legen Wert auf die Wartbarkeit des Codes ...)?

Carlos Jaime C. De Leon
quelle
2
Haben Sie die Tests durchgeführt, mit denen Sie das gewünschte Refactoring durchführen können?
2
Sie haben es selbst beantwortet. Die Clients kümmern sich nicht um die Wartbarkeit des Codes, es sei denn, der Code selbst ist lieferbar. Sie kümmern sich um Geld und Zeit und setzen Qualität als gegeben voraus. Qualität, Zeit und Kosten stehen in direktem Zusammenhang mit der technischen Verschuldung, aber auch im Verhältnis zu dem, was sie zu akzeptieren bereit sind. Wenn Sie das Refactoring NICHT einbeziehen, wird sich die Wartbarkeit des Codes verschlechtern und die technische Verschuldung wird unvermindert in die Höhe schnellen.
maple_shaft

Antworten:

17

Absolut.

Refactoring sollte für ein funktionierendes und "passierendes" Projekt durchgeführt werden. Wenn alle Ihre Tests (auf Geräte-, System- und Akzeptanzstufe) bestanden sind, wissen Sie, dass Ihr Produkt die Anforderungen erfüllt. Wenn Sie den Refactor durchführen, können Sie weiterhin bestätigen, dass alle Tests weiterhin bestanden werden. Wenn ein Test fehlschlägt, haben Sie etwas falsch gemacht und müssen es korrigieren. Wenn Sie fehlgeschlagene Tests haben, sollten Sie diese vor dem Refactoring korrigieren, damit Sie immer sicherstellen können, dass Ihr Refactoring die Funktionalität des Systems nicht verändert.

Dies ist auch ein perfekter Zeitpunkt für das Refactoring, vorausgesetzt, Sie haben die Zeit und die Ressourcen, um das Refactoring durchzuführen und dennoch pünktlich und budgetgerecht zu liefern. Durch das Refactoring wird es einfacher, Ihr System zu verstehen und zu warten. Wenn Sie also noch mehr neue Funktionen hinzufügen, wird es einfacher. Sie müssen gegen Code Rot und Software-Entropie kämpfen .

Wie Joel Etherton in den Kommentaren hervorhebt , müssen Sie den Umfang des Refactorings verwalten. Konzentrieren Sie sich auf das Refactoring der Teile des Systems, denen Sie in Kürze Features hinzufügen werden, und führen Sie Refactorings durch, die das Arbeiten mit oder das Hinzufügen der neuen Features erleichtern. Mithilfe von statischen Analysen, Metriktools und Codeüberprüfungen können Sie Bereiche identifizieren, die am kritischsten sind. Sie möchten keine Fristen verpassen, weil Sie das Refactoring durchgeführt haben - Sie müssen dem Kunden weiterhin einen Mehrwert bieten.

Sie erwähnen, dass der Kunde beim Refactoring keinen Wert sieht. In der Regel kümmert sich der Kunde nicht um die Qualität des Codes, sondern um das Produkt. Refactoring erleichtert es Ihnen, eine hohe Produktqualität aufrechtzuerhalten und weiterhin ein Produkt zu liefern, das den sich ändernden Anforderungen des Kunden entspricht. Versuchen Sie, die Zeit für das Refactoring in Ihren Zeitplan aufzunehmen (der Kunde möchte X-Funktionen in Y-Tagen, versuchen Sie festzustellen, ob Sie keine Y + Z-Tage oder XN-Features erhalten, damit Sie Zeit für Design, Refactoring und Implementierung aufwenden können), wenn Sie dies möchten können.

Thomas Owens
quelle
1
+1 speziell für den Absatz über den Wert des Refactorings für Kunden.
Marjan Venema
1
Angenommen, Sie verfügen über eine Reihe von Komponententests zur Validierung des Refactorings, ändert dies nichts am beobachteten Verhalten. Bei der Wahl zwischen Refactroring oder Unit-Tests. Fügen Sie zuerst Komponententests hinzu.
Martin York
5
@ Thomas Owens: +1 Ich stimme zu, aber ich möchte auch einen Hinweis zur Vorsicht beim Refactoring hinzufügen. Für das Refactoring ist es sehr einfach, eine Kaskade von Refactoring zu starten, die die tatsächlich erforderliche Arbeit aufblähen und dazu führen kann, dass die Fristen verkürzt werden.
Joel Etherton
@ Joel Das ist ein guter Punkt. Sie müssen den Umfang des Refactorings einschränken, um Fristen einzuhalten.
Thomas Owens
3

Erwägen Sie die Beantwortung der folgenden Fragen, dann fällt es Ihnen leicht, die Entscheidung zu treffen. Die Weisheit "Repariere es nicht, wenn es nicht kaputt ist" ist verlockend, gilt aber nicht immer für die professionelle Arbeit.

0-Gibt es eine Kundenbeschwerde über diesen Code?

1-Ist dies für die Funktionalität der Anwendung erforderlich?

2-Ist der aktuelle Code schädlich?

3-Lohnen sich die Kosten für Änderungen?

4-Könnten Sie sich die Kosten leisten?

5-Ist dies die beste Nutzung Ihrer Fähigkeiten für die Organisation?

6-Würden Ihre Änderungen erfordern, dass Ihr Benutzer die neue Änderung erneut installiert - Könnten Sie dies gegenüber dem Kunden rechtfertigen?

7-Könnten Sie das Risiko einer schlechten Lösung tolerieren?

8-Wirkt sich die Änderung auf anderen Code außerhalb Ihres Projekts aus?

9-Ist dies ein sich entwickelndes Produkt oder ein stabiles Produkt? Wenn es sich weiterentwickelt, könnten Sie die Änderungen in die nächste Version aufnehmen?

Keine Chance
quelle
Du hast meine Gedanken gelesen! Ich habe genau an diese berühmte Regel gedacht: "Repariere sie nicht, wenn sie nicht gebrochen ist", um die Verschiebung des Refactorings zu rechtfertigen!
Carlos Jaime C. De Leon
3

Refactor bald, Refactor oft.

Wenn Sie es sich leisten können (Zeit, Geld usw.), sollten Sie es tun.

Ich sage dies, weil Ihnen manchmal die Zeit ausgeht oder Sie sagen, dass Sie kein Geld für eine Code-Wartungsintervention erhalten oder Ihr Projekt so schnell wie möglich abschließen möchten, und im Allgemeinen, weil das Refactoring Ressourcen benötigt. Abgesehen davon ist es immer ein guter Zeitpunkt für das Refactoring.

Sie möchten einen aktuellen Code, und wenn Sie der Meinung sind, dass Ihr Code tatsächlich einige Änderungen benötigt, insbesondere wenn Sie neue Funktionen hinzufügen, sollten Sie ihn ändern.

Vergessen Sie nicht, dass Sie mit einem Versionskontrollsystem Ihr Projekt tatsächlich in einen neuen Zweig einteilen können, sodass Sie Ihren aktuellen Code überhaupt nicht beeinflussen.

Jose Faeti
quelle
2

Wenn das Refactoring zur Implementierung der neuen Funktionalität benötigt wird, sollte es im Rahmen der neuen Entwicklung durchgeführt und berücksichtigt werden.

Das Duplizieren von Code kostet Sie (sowohl Sie persönlich als auch das Unternehmen) auf lange Sicht mehr, da Änderungen an einem Ort und nicht an einem anderen vorgenommen werden.

Sie benötigen eine Reihe von Tests - entweder automatisierte Komponententests oder Regressionstests, die Sie ausführen können, um zu beweisen, dass Sie keine Probleme mit der vorhandenen Funktionalität eingeführt haben.

Wenn das Refactoring nur ein "nice to do" ist - dh es befindet sich nicht in Code, der direkt von der neuen Funktionalität betroffen ist, dann würde ich es in Ruhe lassen. Sie führen eine Änderung ein, um sie zu ändern.

ChrisF
quelle
0

Es klingt so, als würde das Umgestalten des Codes das Hinzufügen der neuen Funktionen erleichtern. Das ist die Theorie. Nehmen Sie dies in den Umfang der neuen Funktionen auf. Auf diese Weise erhalten Sie eher ein Buy-In von Geschäftsbenutzern. In diesem Fall sollten Sie in der Lage sein, zwingende Argumente vorzubringen und die Zeit für das Refactoring zu rechtfertigen. Hoffentlich werden sie verstehen, dass dies ein notwendiger Teil des Entwicklungsprozesses ist und weniger Einwände hat. Möglicherweise können Sie diesen direkten Nutzen nicht immer nachweisen.

JeffO
quelle