Refactoring auf einen Blick
- Was?
- Interne Codestruktur verbessern, ohne das Verhalten zu ändern
- Wann?
- Dritter Schritt im TDD-Zyklus (Red → Green → Refactor)
- Voraussetzung
- Automatisierte Tests als Sicherheitsnetz
- Klassiker
- Martin Fowler: „Refactoring" (1999, 2. Auflage 2018)
Warum ist Refactoring überlebenswichtig für Software?
Jede Zeile Code, die du schreibst, macht die nächste Änderung entweder leichter oder schwerer. Ohne Refactoring häuft sich technische Schuld an — wie Zinsen auf einen Kredit, den niemand zurückzahlt.
Am Anfang geht alles schnell. Neue Features in Stunden, Änderungen in Minuten. Aber ohne regelmäßiges Aufräumen wächst die Komplexität. Irgendwann dauert jede kleine Änderung Tage, weil niemand mehr versteht, was der Code eigentlich tut. Refactoring hält die Kurve flach.
- Lesbarkeit: Code wird öfter gelesen als geschrieben. Refactoring macht ihn für dein zukünftiges Ich verständlich.
- Wartbarkeit: Sauberer Code lässt sich leichter ändern, erweitern und debuggen.
- Geschwindigkeit: Teams, die regelmäßig refactoren, liefern langfristig schneller — weil sie weniger Altlasten mitschleppen.
Welche Refactoring-Techniken solltest du kennen?
Martin Fowler hat in seinem Standardwerk über 60 Refactoring-Techniken katalogisiert. Die wichtigsten für den Alltag:
- Rename (Umbenennen): Eine Variable von
xintotalPriceumzubenennen dauert Sekunden — und spart Stunden beim Lesen. - Extract Method: Eine lange Funktion in mehrere kurze aufteilen. Jede Funktion macht genau eine Sache.
- Remove Duplication: Gleicher Code an zwei Stellen? Zusammenfassen. Duplizierung ist der Feind wartbarer Software.
- Simplify Conditionals: Verschachtelte if-else-Kaskaden durch Guard Clauses oder Polymorphie ersetzen.
- Move Method: Eine Methode in die Klasse verschieben, zu der sie inhaltlich gehört.
Wie arbeiten Refactoring und TDD zusammen?
Refactoring ohne Tests ist wie Trapez ohne Netz: möglich, aber riskant. TDD liefert genau das Sicherheitsnetz, das du brauchst.
Im TDD-Zyklus ist Refactoring der dritte Schritt (Red → Green → Refactor). Nachdem der Test grün ist, räumst du auf — und lässt die Tests nach jeder Änderung laufen. Solange sie grün bleiben, weißt du: Das Verhalten ist unverändert, nur die Struktur ist besser geworden.
Diese Kombination macht mutiges Refactoring möglich. Du kannst eine ganze Klasse umstrukturieren, ohne Angst zu haben, etwas kaputt zu machen. Die Tests sind dein Kompass.
Wann solltest du nicht refactoren?
Refactoring ist kein Selbstzweck. In diesen Situationen ist Vorsicht geboten:
- Kurz vor dem Release: Zwei Tage vor dem Go-Live eine zentrale Klasse umbauen? Schlechte Idee. Refactoring gehört in den regulären Entwicklungszyklus.
- Ohne Tests: Wenn keine automatisierten Tests existieren, schreib zuerst Tests — dann refactore. Reihenfolge ist entscheidend.
- Wenn der Code weggeworfen wird: Ein Prototyp, der nach der Demo in den Müll wandert, braucht kein Refactoring.
- Um des Refactorings willen: „Der Code ist hässlich, aber er funktioniert und ändert sich nie." In dem Fall: Lass ihn in Ruhe.
Die Faustregel: Refactore Code, den du gerade anfasst. Nicht Code, der seit zwei Jahren stabil läuft und nie geändert wird. Deine Zeit ist begrenzt — investiere sie dort, wo sie den größten Hebel hat.