2009-03-05 13 views
10

Angenommen, Sie haben ein Programm, das derzeit so funktioniert, wie es soll. Die Anwendung hat einen sehr schlechten Code hinter sich, verbraucht viel Speicher, ist nicht skalierbar und würde umfangreiche Neuschreibungen benötigen, um Änderungen in der Funktionalität zu implementieren.An welchem ​​Punkt lohnt sich das Refactoring nicht?

An welchem ​​Punkt wird das Refactoring weniger logisch als ein Total Rebuild?

Antwort

10

Joel schrieb einen schönen Aufsatz über dieses Thema sehr:

Things You Should Never Do, Part 1

Der Schlüssel Lektion, die ich von diesem bekam ist, dass, obwohl der alte Code ist schrecklich, Augen und Sinn für Ästhetik weh tut, ist es eine ziemlich gute Chance, dass eine Menge dieses Codes undokumentierte Fehler und Probleme patchen. Dh, es ist eine Menge von Domänenwissen darin eingebettet und es wird schwierig oder unmöglich für Sie, es zu replizieren. Sie werden ständig gegen Unterlassungen stoßen.

Ein Buch, das ich sehr nützlich fand, ist Working Effectively With Legacy Code von Michael C. Feathers. Es bietet Strategien und Methoden, um sogar wirklich hässlichen Legacy-Code zu erreichen.

+0

Fred Brooks sagte zu "bauen einen wegwerfen" - aber er verwendete keine agilen Techniken, und jede Funktionalität, die hinzugefügt wurde, wurde dokumentiert und verstanden, und so war es möglich, ohne Verlust neu zu schreiben. – 13ren

+0

Nicht zu vergessen, dass es IMMER viel mehr Details gibt, die Sie implementieren müssen, an die Sie beim Skizzieren des großen Projekts nicht gedacht haben. –

0

Wenn Sie mehr Zeit mit dem Refactoring verbringen, als Code tatsächlich zu schreiben.

0

Eine Option wäre, Komponententests zu schreiben, um die vorhandene Anwendung abzudecken und dann zu beginnen, sie nach und nach zu refaktorieren, indem Sie die Komponententests verwenden, um sicherzustellen, dass alles wie zuvor funktioniert.

In einer idealen Welt, die Sie bereits Unit-Tests für das Programm haben würden, aber Ihre Kommentare über die Qualität der App Ich vermute, Sie ...

nicht
1

An der Stelle, wo die Software gegeben tut nicht, was es tun soll. Refactoring (Ändern des Codes ohne Änderung der Funktionalität) ist nur dann sinnvoll, wenn die Funktionalität "wie vorgesehen" ist.

3

Nun, die einfachste Antwort ist, wenn es länger dauern wird, um zu refaktorieren als zu rekonstruieren, dann sollten Sie einfach neu aufbauen.

Wenn es sich um ein persönliches Projekt handelt, dann möchten Sie es vielleicht trotzdem neu aufbauen, da Sie wahrscheinlich mehr von Neuem lernen als von Refactoring, und das ist ein großes Ziel von persönlichen Projekten.

In einer professionellen zeitlich begrenzten Umgebung sollten Sie auf jeden Fall mit den Kosten beginnen, die dem Unternehmen auf die Dauer am geringsten sind (für die gleiche Auszahlung), was bedeutet, dass Sie wählen müssen, was weniger Zeit in Anspruch nimmt.

Natürlich kann es ein wenig komplizierter als das sein. Wenn andere Personen an Funktionen arbeiten können, während das Refactoring durchgeführt wird, ist dies möglicherweise die bessere Wahl, wenn alle darauf warten, dass eine komplett neue Version erstellt wird. In diesem Fall dauert der Wiederaufbau weniger Zeit als nur hätte das Refactoring genommen, aber Sie müssen das gesamte Projekt und alle Mitwirkenden des Projekts berücksichtigen.

1

ich mit solchen Anwendungen in der Vergangenheit gearbeitet haben. Der beste Ansatz, den ich gefunden habe, ist ein schrittweiser Ansatz: Wenn Sie an dem Code arbeiten, finden Sie Dinge, die mehrere Male erledigt wurden, gruppieren Sie sie in Funktionen. Halten Sie ein Notizbuch (Sie wissen, ein echtes, mit Papier und einem Stift oder Stift), so dass Sie Ihren Fortschritt markieren können. Verwenden Sie das in Kombination mit Ihrem VCS, nicht statt dessen. Das Notizbuch kann verwendet werden, um einen Überblick über die neuen Funktionen zu geben, die Sie als Teil des Refactorings erstellt haben, und das VCS füllt natürlich die Lücken für die Details aus.

Im Laufe der Zeit haben Sie eine Menge Code an geeigneteren Orten konsolidiert. Code-Duplizierung in diesem Zeitraum wird fast unmöglich sein, also tun Sie es so gut wie Sie können, bis Sie einen Punkt erreicht haben, wo Sie den Refactoring-Prozess starten, die gesamte Codebasis auditieren und weiterarbeiten können es als Ganzes.

Wenn Sie nicht genügend Zeit für diesen Prozess haben (was sehr lange dauern wird), dann ist das Neuschreiben von Anfang an mit einem Test-First-Ansatz wahrscheinlich besser.

1

Wenn Sie es sich leisten können, die App komplett neu zu erstellen, müssen Sie die Funktionalität nicht schrittweise verbessern und möchten den vorhandenen Code nicht beibehalten, dann ist das Umschreiben sicherlich eine praktikable Alternative. Auf der anderen Seite können Sie mit Refactoring ein inkrementelles Neuschreiben durchführen, indem Sie die vorhandenen Funktionen langsam durch äquivalente Funktionen ersetzen, die besser geschrieben und effizienter sind.

6

Ein Vorteil des Refactorings gegenüber dem Neuaufbau besteht darin, dass Sie die Inkremente im Kontext des gesamten Systems testen können, um die Entwicklung und das Debugging zu beschleunigen, wenn Sie Schritt für Schritt Refactoring durchführen können.

Alter und implementierter Code, selbst wenn er hässlich und langsam ist, hat den Vorteil, dass er gründlich getestet wurde, und dieser Vorteil geht verloren, wenn Sie bei Null anfangen.

Ein inkrementeller Refactoring-Ansatz hilft auch sicherzustellen, dass immer ein Produkt zur Verfügung steht, das versendet werden kann (und es wird ständig verbessert).

Es gibt einen schönen Artikel im Internet über how Netscape 6 was written from scratch and it was business-wise a bad idea.

1

Wenn die Anwendung sehr klein ist, können Sie sie von Grund auf neu schreiben. Wenn die Anwendung groß ist, tun Sie es nie. Schreibe es nach und nach, ein Schritt nach dem anderen bestätigt, dass du nichts kaputt gemacht hast.

Die Anwendung ist die Spezifikation. Wenn Sie es von Grund auf neu schreiben, werden Sie höchstwahrscheinlich auf viele heimtückische Fehler stoßen, weil "niemand wusste, dass der Aufruf dieser Funktion in diesem sehr speziellen Fall 3 zurückgeben sollte" (undokumentiertes Verhalten ...).

Es macht immer mehr Spaß, von Grund auf neu zu schreiben, so dass Ihr Gehirn Sie dazu bringen könnte, zu denken, dass es die richtige Wahl ist. Sei vorsichtig, es ist höchstwahrscheinlich nicht.

0

Kein Dokument, kein Originalautor, kein Testfall und eine Reihe von verbleibenden Fehlern.

1

Uncle Bob weighs in mit dem folgenden:

Wenn eine ist die richtige Strategie neu zu gestalten?

Ich bin froh, dass Sie diese Frage gestellt haben. Hier ist die Antwort. Niemals.

Schau, du hast das Chaos gemacht, jetzt mach es sauber.

0

Ich hatte nicht viel Glück mit kleinen inkrementellen Änderungen, wenn der Code, den ich vererbe, wirklich schlecht ist. Theoretisch klingt der kleine inkrementelle Ansatz gut, aber in der Praxis endet nur eine bessere, aber immer noch schlecht entworfene Anwendung, von der jeder denkt, dass sie jetzt DEIN Design ist. Wenn die Dinge kaputt gehen, denken die Leute nicht mehr, dass es wegen des vorherigen Codes ist, es wird jetzt DEINE Schuld. Also würde ich nicht das Wort Redesign, Refactor oder irgendetwas anderes verwenden, das zu einem Managertyp bedeutet, dass Sie Sachen auf Ihre Weise ändern, es sei denn, ich würde es wirklich auf meine Art tun. Auch wenn Sie vielleicht Dutzende von Problemen behoben haben, werden alle Probleme, die noch bestanden (aber nicht entdeckt wurden), nun auf Ihre Nacharbeit zurückgeführt. Und seien Sie versichert, dass, wenn der Code schlecht ist, Ihre Fixes viel mehr Fehler aufdecken werden, die vorher einfach ignoriert wurden, weil der Code so schlecht war.

Wenn Sie wirklich wissen, wie man Software-Systeme entwickelt, würde ich ein Redesign des gesamten Systems tun. Wenn Sie nicht wirklich wissen, wie man gute Software entwickelt, dann würde ich sagen, dass Sie mit den kleinen inkrementellen Änderungen bleiben sollten, da Sie sonst mit einer Codebasis enden, die genauso schlecht ist wie das Original.

Ein Fehler, der oft beim Redesign gemacht wird, ist, dass Leute die ursprüngliche Codebasis ignorieren. Redesign muss jedoch nicht bedeuten, den alten Code vollständig zu ignorieren. Der alte Code musste immer noch tun, was Ihr neuer Code tun muss. In vielen Fällen befinden sich die Schritte, die Sie benötigen, bereits im alten Code. Copy and Paste und tweak wirken Wunder beim Redesign von Systemen. Ich habe festgestellt, dass das Redesign und Neuschreiben einer Anwendung und das Entnehmen von Ausschnitten aus dem ursprünglichen Code in vielen Fällen viel schneller und zuverlässiger ist als kleine inkrementelle Änderungen.

Verwandte Themen