Auch genannt: Refaktorisierung
Refactoring ist eine Technik, mit der die interne Struktur von Software gezielt in kleinen Schritten verbessert wird, ohne ihr nach außen sichtbares Verhalten zu verändern.
Code, der über die Zeit gewachsen ist, wird häufig unübersichtlich, auch wenn er weiterhin korrekt funktioniert. Refactoring räumt diesen Code gewissermaßen auf: Namen werden klarer gewählt, lange Funktionen in kleinere, benannte Teile zerlegt oder doppelter Code zusammengeführt. Entscheidend ist dabei, dass sich an dem, was das Programm von außen tut, nichts ändert – verändert wird ausschließlich, wie der Code intern aufgebaut ist.
Refactoring erfolgt in einer Abfolge kleiner, einzeln für sich genommen unauffälliger Schritte, von denen jeder für sich das beobachtbare Verhalten des Programms unverändert lässt. Automatisierte Tests, die vor und nach jedem Schritt ausgeführt werden, bestätigen dabei, dass sich am Ergebnis nichts geändert hat. Weil jeder einzelne Schritt klein ist, bleibt das Risiko gering, versehentlich einen Fehler einzubauen; die Summe vieler solcher kleinen Schritte kann die Struktur des Codes insgesamt aber deutlich verbessern.
Eine lange Funktion, die mehrere unterschiedliche Aufgaben in einem einzigen Codeblock erledigt, wird in mehrere kleinere, klar benannte Funktionen aufgeteilt. Das Programm liefert anschließend exakt dieselben Ergebnisse wie zuvor, ist für andere Entwicklerinnen und Entwickler aber deutlich leichter zu verstehen.
Refactoring wird eingesetzt, um Code wartbarer und leichter erweiterbar zu machen, bestehende technische Schulden abzubauen und vorhandenen Code gezielt vorzubereiten, bevor eine neue Funktion darauf aufbauend ergänzt wird.
Refactoring ist kein Ersatz für eine vollständige Neuentwicklung und keine andere Bezeichnung für beliebiges „Aufräumen“ von Code; der Begriff bezeichnet gezielt solche Änderungen, die das beobachtbare Verhalten nachweislich unverändert lassen. Fehlen ausreichende automatisierte Tests, lässt sich diese Verhaltenskonstanz jedoch kaum verlässlich überprüfen – ohne eine solche Absicherung besteht die Gefahr, dass sich beim Umbau unbemerkt tatsächliches Fehlverhalten einschleicht.
Nicht zu verwechseln mit Softwaretest: Ein Softwaretest prüft, ob eine Software korrekt funktioniert, während Refactoring die interne Struktur einer bereits funktionierenden Software verbessert, ohne deren Verhalten überhaupt zu verändern – bestehende Tests müssen dabei weiterhin erfolgreich durchlaufen.