
Refactoring: Was ist es und wann ist es am besten, es durchzuführen?
Die Wartung des bestehenden Codes ist ein sehr wichtiger Prozess, der nicht heruntergespielt werden sollte. Leider werden oft mehr Zeit und Ressourcen in die Implementierung neuer Funktionalitäten investiert, auf Kosten der Wartung des aktuellen Codes. Natürlich fragen wir uns manchmal: Warum etwas reparieren, das bereits funktioniert? Welche Vorteile könnte es bringen?
Was ist Refactoring?
Laut Wikipedia handelt es sich um einen Prozess, bei dem Änderungen an einem Projekt oder Programm vorgenommen werden, ohne dass sich die Funktionalität wesentlich ändert. Daher zielt das Refactoring nicht darauf ab, neue Funktionalitäten zu schaffen, sondern die angemessene, qualitativ hochwertige Organisation des Systems zu erhalten.
Versuchen wir nun, diese Definition so zu übersetzen, dass sie jeder verstehen kann. Zu diesem Zweck werde ich den folgenden Satz als Beispiel verwenden: Der Fahrer eines Kraftfahrzeugs, der auf der Straße von einem anderen Fahrzeug überholt wird, sollte bis zum Ende des Überholmanövers nicht schneller werden.
Der Satz ist lang und kompliziert, aber wir können seine Botschaft nach einer Weile verstehen. Andererseits ist der Satz Wir sollten nicht schneller fahren, wenn wir von einem anderen Fahrzeug überholt werden viel kürzer, leichter zu verstehen und liefert uns dennoch wichtige Informationen.
Wir können also dieselben Informationen auf viele verschiedene Arten übermitteln, von denen einige besser und andere schlechter sein werden. Gleiches gilt für die Programmierung. Die Ausführung einer bestimmten Funktionalität kann in Form von Code auf eine bessere oder schlechtere Weise geschrieben werden, aber das Ergebnis bleibt unverändert. Und hier kommen wir zurück zum Code-Refactoring, das nichts anderes ist als das Ändern des Codeinhalts, ohne das Endergebnis zu beeinflussen. Warum also etwas ändern, das funktioniert, und welche Auswirkungen hat es?
Wann sollten wir Refactoring durchführen?
Bevor wir erklären, warum wir etwas ändern sollten, das funktional ist, und welche Ergebnisse eine solche Änderung bringt, schauen wir uns zunächst die Symptome an, die eine Anwendung geben kann, die Refactoring benötigt.
Mangelnde Unterstützung oder das bevorstehende Ende der Unterstützung für das CMS, auf dem die Anwendung basiert
Das Enddatum der Unterstützung für das CMS oder das Framework, auf dem die Anwendung basiert, ist nichts anderes als das Ablaufdatum. Nach diesem Datum sollte die Anwendung nicht mehr verwendet werden. Dies ist sehr wichtig – nicht so sehr in Bezug auf die Leistung der Anwendung, sondern eher auf deren Sicherheit. Schauen wir uns die nachstehende Tabelle mit den Endterminen für die Unterstützung des Laravel-Frameworks an.
Quelle: Laravel.com
Das Interessanteste in dieser Tabelle ist die Spalte Sicherheitsfixes bis. Ihr Titel bedeutet, dass nach dem angegebenen Datum keine Sicherheitspatches mehr implementiert werden, selbst wenn eine Sicherheitslücke entdeckt und gemeldet wird. Dies ist die perfekte Gelegenheit für einen Angreifer, denn wenn er es mit einem bereits nicht mehr unterstützten System zu tun hat, weiß er genau, wo und welche Art von Schwachstellen es gibt, was den Angriff erheblich erleichtert.
Wie viel Zeit und Arbeit Sie aufwenden müssen, um die Anwendung zu aktualisieren, hängt von vielen Faktoren ab. Zum Beispiel bedeutet die Migration von Drupal 7 zu Drupal 8 tatsächlich eine komplette Neugestaltung der Anwendung. Gleiches gilt für einige Versionen von Laravel.
Langsame Ausführung einer Anwendung
Dies ist ein sehr häufiges Phänomen, das mehrere Jahre dauern kann, bis sich Symptome entwickeln. Warum passiert das? Die ursprünglichen Ziele der Designphase der Anwendung berücksichtigen möglicherweise nicht die Leistung der Anwendung im Fall von erhöhtem Datenverkehr auf der Website oder im Fall der Arbeit mit größeren Datenmengen. Diese Daten speichern Informationen, z. B. über die registrierten Benutzer, Beiträge, Kommentare, Anwendungseinstellungen usw. Im Laufe der Zeit werden es immer mehr, und sie verursachen immer mehr Probleme.
Sie sollten jedoch beachten, dass die langsame Ausführung einer Anwendung nicht immer die Notwendigkeit des Refactorings bedeutet. Manchmal sind zur Beschleunigung der Ausführung z. B. Änderungen in der Infrastruktur erforderlich. Aus diesem Grund sollte die Entscheidung, den Code zu refaktorisieren, einer gründlichen Analyse vorausgehen.
Lange Entwicklungszeit
Eine gut geschriebene Anwendung sollte eine relativ einfache Implementierung neuer Funktionalitäten und Änderungen ermöglichen. Damit dies möglich ist, sollte jeder Entwickler bestimmte Regeln beim Schreiben von Code befolgen, wie z. B. DRY oder SOLID. Leider liegt dies weit entfernt von der Realität, und Programmierer müssen oft Code entwickeln, der ursprünglich von Personen erstellt wurde, die diese Regeln nicht kannten. Aufgrund dessen dauert das Hinzufügen der einfachsten Funktionalität manchmal absurd lange.
In einer solchen Situation müssen Sie auch den Code gründlich analysieren und überlegen, ob ein vollständiges Refactoring profitabler wäre als die Weiterentwicklung des aktuellen Codes. Wenn Sie sich für ein Refactoring entscheiden, sollte es als Investition betrachtet werden. Ihre Zeit und Ressourcen bringen nicht sofort Ergebnisse, aber sie ermöglichen es Ihnen, in Zukunft Ressourcen zu sparen.
Häufige Fehler, die oft behoben werden müssen
Dieser Aspekt ist etwas mit dem vorherigen verwandt. Natürlich passieren Fehler jedem Menschen, und manchmal können sie trotz bester Absichten, vieler Tests und eines QA-Teams trotzdem auftreten. Wenn sie jedoch häufiger werden oder die meiste Arbeitszeit der Programmierer mit der Behebung von Fehlern statt mit der Optimierung und Entwicklung der Anwendung verbracht wird, kann dies bedeuten, dass ein Refactoring erforderlich ist.
Wie sieht der Refactoring-Prozess aus?
Wie bereits erwähnt, sollte der Entscheidung für ein Refactoring eine gründliche Analyse vorausgehen. Wie sieht es dann aus, woraus besteht es, und welche Phasen umfasst der Prozess des Refactorings des Codes?
- Kennenlernen der Anwendung, Funktionalitäten und Geschäftslogik. Am Anfang müssen wir den genauen Ablauf der Anwendungsprozesse sowie die von ihr erfüllte Aufgabe kennenlernen.
- Überprüfung der verwendeten Technologien, Frameworks oder CMS in Bezug auf Updates und die Unterstützungsdauer. Internetanwendungen bestehen sehr oft aus zahlreichen Komponenten, Modulen und Paketen, die von Dritten bereitgestellt werden. Sie sollten überprüfen, ob sie noch unterstützt werden oder ob sie aktualisiert werden müssen.
- Analyse des Codes in Bezug auf seine Qualität, Best Practices und Leistung. In diesem Stadium bewerten wir, ob der aktuelle Code nutzbar ist und ob seine Weiterentwicklung nicht problematisch sein wird.
- Identifizieren der Ursachen, die sich negativ auf die Ausführung der Anwendung auswirken. Auf Basis der zuvor gesammelten Informationen analysieren wir die Prozesse, die in der Anwendung stattfinden, und identifizieren die schwächsten Glieder, die die Leistung beeinträchtigen.
- Identifizieren der Lösungen, die die Ausführung der Anwendung verbessern und die Methode ihrer Implementierung bestimmen. Wenn wir die Probleme kennen, unter denen die Anwendung leidet, suchen wir nach Lösungen, die in einem bestimmten Fall funktionieren. Jedes Problem kann auf viele Arten gelöst werden, daher wägen wir sorgfältig alle Vor- und Nachteile ab.
- Schätzung der Kosten, Arbeitszeit und Aufgaben, die durchgeführt werden müssen. Wir schreiben den Aktionsplan in den kleinsten Details nieder, teilen die Aufgaben in Phasen auf und schätzen den Arbeitsaufwand ein, der erforderlich ist, um sie abzuschließen.
- Vorbereitung automatischer Tests. Dank ihnen können wir in jeder Arbeitsphase sicher sein, dass die Anwendung während des gesamten Prozesses stabil läuft und es keine unvorhergesehenen Ausfälle oder andere Probleme geben wird.
- Code-Refactoring – Implementierung der zuvor geplanten Änderungen.
Es ist unmöglich, klar zu definieren, wie das Code-Refactoring selbst ablaufen wird. Es ist ein sehr komplexes Thema, und je nach Situation wird der gesamte Prozess unterschiedlich sein. Das Wichtigste ist jedoch, während des gesamten Refactoring-Prozesses nicht in den Betrieb der Anwendung einzugreifen, damit die Benutzer keine Probleme erfahren.
Behandeln Sie Refactoring als Investition
Manchmal ist es sehr schwierig, den Sinn des Refactorings zu erklären. Es ist auch nicht leicht, jemanden davon zu überzeugen, Geld – manchmal nicht wenig – für einen Prozess auszugeben, der keine sichtbaren Änderungen an der Anwendung bringt. Man sollte jedoch beachten, dass Refactoring als Investition betrachtet werden sollte. Das jetzt ausgegebene Geld bringt keine sofortige Rendite, aber es ermöglicht uns, in Zukunft Ressourcen zu sparen. Darüber hinaus wird unsere Anwendung stabiler, widerstandsfähiger gegen Angriffe sein, und die Implementierung neuer Funktionalitäten oder anderer Änderungen wird viel schneller vonstattengehen.
Haben Sie eine Anwendung oder Website basierend auf PHP oder einem seiner Frameworks (Drupal, Laravel oder Symfony)? Als PHP-Entwicklungsspezialisten können wir ihren Code analysieren und – falls erforderlich – das Refactoring durchführen.