Refactoring ist und sollte ein fortlaufender Prozess sein. Es reicht nicht aus, nur die Anforderungen mit einer funktionierenden und getesteten Implementierung zu erfüllen, die noch ein wenig unvollständig ist.
"Lass es funktionieren, dann lass es besser funktionieren" .
Ich kann mich nicht erinnern, wo ich dieses Zitat gelesen habe, aber dies ist der Schlüssel, um Refactoring gut anzuwenden, und ich halte es für unprofessionell, etwas anderes zu tun.
Kontinuierliches Refactoring ist wie das Aufwischen von verschüttetem Material während des Kochens und das Reinigen des Geschirrs nach dem Essen. Gezieltes Refactoring ist wie das Auffinden einer schmutzigen Küche, hat aber nur die Zeit, ein oder zwei schmutzige Gläser zu waschen. Möchten Sie lieber mit einer durchgehend schmutzigen Küche leben, oder möchten Sie die Dinge lieber sauber halten?
Sie bringen den Code zum Laufen und überarbeiten ihn dann, um sicherzustellen, dass Sie die bestmögliche Implementierung haben, die Sie möglicherweise verwenden können. Wenn Sie etwas Vertrautes tun, kann es sein, dass Sie den besten Code zum ersten Mal implementieren. Es lohnt sich jedoch, einen Moment zu dauern, um Ihre Arbeit zu überprüfen, um sicherzugehen. Wenn es so aussieht, als könnten Sie Ihren Code verbessern, versuchen Sie eine Umgestaltung, um sicherzustellen, dass Ihr Code mindestens so schlank und sauber ist, wie Sie ihn erstellen können. Dies bedeutet, dass Sie den Betrag der technischen Schulden, die Sie hinterlassen, reduzieren und das Lesen und Umgestalten erleichtern, wenn der Code das nächste Mal bearbeitet werden muss. Dies ist der Kernwert hinter dem TDD-Mantra "Red-Green-Refactor", mit der Ausnahme, dass es sich auszahlt, wenn Sie in TDD in erster Linie die Duplizierung entfernen, auch andere Elemente zu überprüfen, die überarbeitet werden könnten, wie große Klassen, lange Methoden,
Wenn Sie vor einem größeren Umbau stehen, können Sie ihn möglicherweise für eine Weile verschieben, insbesondere wenn Sie in Ihrem Zeitplan zu wenig Zeit haben. Dies setzt jedoch voraus, dass die Funktionalität Ihres Codes nicht beeinträchtigt wird und dass die Implementierung weiterhin den Anforderungen entspricht. Diese Art von Situation sollte selten vorkommen, und Sie können dazu beitragen, dass sie noch seltener auftritt, wenn Sie währenddessen kontinuierlich umgestalten. Noch wichtiger ist jedoch, dass Sie nicht riskieren können, größere Änderungen zu lange aufzubewahren. Andernfalls entsteht später eine noch größere Arbeitslast, deren Behebung entweder viel kostspieliger oder sogar noch kostspieliger sein kann Projektfehler.
Ich habe den Eindruck, dass viele Leute dazu neigen, die Definitionen für Refactoring und Re-Engineering zu verwechseln . Die beiden Begriffe beschreiben Strategien zum Umgang mit sehr unterschiedlichen Situationen. Wenn Sie eine Neuentwicklung durchführen möchten, verpflichten Sie sich zu einer drastischen Änderung, die das Verhalten eines Systems verändert. Dies macht einige Tests ungültig und erfordert auch neue Tests. Mit dem Refactor stellen Sie sicher, dass sich Ihr System weiterhin genau verhältWie vor der Änderung stellen Sie jedoch auch sicher, dass Ihr Code eine lange Lebensdauer hat und sich im Laufe der Zeit einfacher warten lässt. Sie "pimpen" Ihren Code nicht für die Hölle, sondern verpflichten sich zu einem professionellen Standard für sauberen Code, der das Risiko von Fehlern verringert und sicherstellt, dass die Arbeit mit Ihrem Code ein Vergnügen bleibt und einen professionellen Standard aufweist .
Zurück zu der Analogie der zerbrochenen Fenster. Wenn Sie das Fenster zerbrechen, sollten Sie es sofort reparieren. Wenn Sie nicht bemerkt haben, dass ein Fenster zerbrochen ist, müssen Sie die Kosten selbst bestimmen, wenn Sie das Fenster zerbrochen lassen. Nun wiederholen Sie die letzten beiden Sätze, aber Ersatz Bug für Fenster. Sie brauchen am Ende eine andere Strategie. Wenn Sie beim Codieren einen Fehler verursacht haben, können Sie diesen sofort beheben oder feststellen, ob die Änderungen einen erneuten Engineering-Aufwand erfordern, und Sie treffen eine kommerzielle Entscheidung, wann das Problem am besten behoben werden kann. Damit Sie ein Problem nicht umgestalten, sondern umgestalten, um sicherzustellen, dass es einfacher ist, Probleme zu finden und zu beheben. Es ist mir egal, wie erstaunlich Sie Ihren Code finden, komplexe Systeme werden immer Probleme haben, die im Laufe der Zeit behoben werden müssen. Das ist es, worum es bei technischen Schulden geht und warum das Refactoring ein fortlaufender Prozess sein muss, während Sie Ihren Code implementieren , und nicht für eine willkürliche zukünftige Zeit.
Kurz gesagt, die Antwort, dass es in seltenen Fällen akzeptabel ist, größere Änderungen am Code aufzuschieben, um eine Frist zu setzen, sollte jedoch nicht als übliche Praxis angesehen werden, Refactoring als eine Übung zu behandeln, die von Ihrer täglichen Implementierungsarbeit unabhängig ist, und mit Sicherheit Niemals als Ausrede von Teams verwendet, die mit der Codebasis nicht vertraut sind, um zu vermeiden, dass ihre Implementierung so schlank und sauber ist, wie sie es unter den gegebenen Umständen möglicherweise schaffen können.