Refactoring

Bild von maniacvector auf Freepik
Was ist Refactoring?
Refactoring ist der Prozess der strukturellen Verbesserung eines Codes, ohne dessen funktionales Verhalten zu verändern. Dabei wird der Code so umgestaltet, dass er lesbarer, effizienter und leichter wartbar wird, ohne die bestehende Funktionalität zu beeinflussen.
1. Ziele von Refactoring
✅ Lesbarkeit verbessern – Der Code wird verständlicher und leichter zu warten.
✅ Wartbarkeit erhöhen – Änderungen oder Erweiterungen können schneller und einfacher vorgenommen werden.
✅ Redundanzen reduzieren – Doppelte oder unnötige Code-Blöcke werden entfernt.
✅ Effizienz steigern – Die Leistung des Codes kann durch Optimierungen verbessert werden.
✅ Fehleranfälligkeit verringern – Ein sauberer Code reduziert das Risiko von Bugs und erleichtert das Debugging.
✅ Technische Schulden abbauen – Langfristig wird die Codequalität verbessert, sodass zukünftige Arbeiten erleichtert werden.
2. Wann sollte Refactoring durchgeführt werden?
🔹 Während der Entwicklung – Beim Schreiben von Code kann Refactoring dazu beitragen, eine bessere Struktur zu schaffen.
🔹 Vor der Implementierung neuer Features – Damit der bestehende Code leicht erweiterbar bleibt.
🔹 Nach der Fehlerbehebung (Bugfixing) – Falls ein Fehler durch schlecht strukturierten Code verursacht wurde.
🔹 Nach Code-Reviews – Wenn Verbesserungsvorschläge zur Code-Qualität gemacht wurden.
🔹 Während Test-Driven Development (TDD) – Nach dem erfolgreichen Bestehen eines Tests wird der Code verbessert.
❌ Kein Refactoring:
Refactoring sollte nicht durchgeführt werden, wenn:
- Der Code bereits gut strukturiert ist.
- Es zeitkritische Deadlines gibt.
- Es keine ausreichenden Tests gibt, um sicherzustellen, dass keine Funktionalität verloren geht.
3. Arten des Refactorings
🔹 1. Code-Duplizierung entfernen
Problem: Mehrere Abschnitte enthalten ähnliche oder gleiche Codeblöcke.
Lösung: Gemeinsam genutzte Codeblöcke werden in Methoden oder Klassen ausgelagert.
Vorher:
int sum1 = a + b + c;
int sum2 = d + e + f;
Nachher:
int sum(int x, int y, int z) {
return x + y + z;
}
🔹 2. Längere Methoden aufteilen (Extract Method)
Problem: Eine Methode ist zu lang und macht mehrere Dinge gleichzeitig.
Lösung: In mehrere kleinere Methoden mit klaren Namen aufteilen.
Vorher:
def process_order(order):
total = 0
for item in order.items:
total += item.price
print(f"Total price: {total}")
print("Processing payment...")
# Code für Zahlung
print("Sending confirmation email...")
Nachher:
def calculate_total(order):
return sum(item.price for item in order.items)
def process_payment():
print("Processing payment...")
def send_confirmation():
print("Sending confirmation email...")
def process_order(order):
total = calculate_total(order)
print(f"Total price: {total}")
process_payment()
send_confirmation()
🔹 3. Magic Numbers & Hardcoded Strings ersetzen (Replace Magic Number with Constant)
Problem: Zahlen oder Zeichenketten sind direkt im Code eingebaut.
Lösung: Verwendung von sprechenden Variablen oder Konstanten.
Vorher:
double area = 3.14159 * radius * radius;
Nachher:
const double PI = 3.14159;
double area = PI * radius * radius;
🔹 4. Kommentar-abhängigen Code verbessern (Self-Explaining Code statt Kommentare)
Problem: Zu viele Kommentare, weil der Code schwer zu verstehen ist.
Lösung: Aussagekräftige Methodennamen oder Variablen statt überflüssiger Kommentare.
Vorher:
// Berechnet die Steuer und addiert sie zum Gesamtpreis
function calc(p, t) {
return p + (p * t);
}
Nachher:
function calculateTotalPrice(price, taxRate) {
return price + (price * taxRate);
}
🔹 5. Große Klassen aufteilen (Extract Class)
Problem: Eine Klasse hat zu viele Verantwortlichkeiten (Violation of Single Responsibility Principle).
Lösung: Aufteilung in mehrere kleinere, spezialisierte Klassen.
Vorher:
class Order {
void processPayment() { /* Zahlungslogik */ }
void sendEmailConfirmation() { /* E-Mail-Versand */ }
void applyDiscount() { /* Rabattberechnung */ }
}
Nachher:
class PaymentProcessor { void processPayment() { /* Zahlungslogik */ } }
class EmailService { void sendEmailConfirmation() { /* E-Mail-Versand */ } }
class DiscountCalculator { void applyDiscount() { /* Rabattberechnung */ } }
4. Refactoring und Test-Driven Development (TDD)
Refactoring ist eng mit Test-Driven Development (TDD) verknüpft:
- Schritt 1: Test schreiben – Ein automatisierter Test wird für eine gewünschte Funktion geschrieben.
- Schritt 2: Code implementieren – Der Code wird so geschrieben, dass er den Test besteht.
- Schritt 3: Refactoring – Der Code wird verbessert, ohne dass sich das Verhalten ändert.
🔹 Warum? Automatisierte Tests helfen sicherzustellen, dass durch das Refactoring keine bestehenden Funktionen unbeabsichtigt geändert werden.
„Möchtest Du zu diesen Begriff oder einem anderen Thema mit uns ins Gespräch kommen?“
5. Vorteile von Refactoring 🚀
✔ Bessere Codequalität: Verständlicher und wartbarer Code.
✔ Weniger Fehleranfälligkeit: Strukturiertes Refactoring reduziert Bugs.
✔ Effizientere Weiterentwicklung: Neue Features lassen sich leichter implementieren.
✔ Bessere Performance: Optimierter Code kann schneller ausgeführt werden.
✔ Technische Schulden abbauen: Langfristig spart man Entwicklungszeit und -kosten.
6. Fazit
Refactoring ist ein essenzieller Bestandteil professioneller Softwareentwicklung. Es hilft, Code lesbarer, wartbarer und effizienter zu machen, indem es unnötige Komplexität reduziert. Durch gezieltes Anwenden von Refactoring-Techniken und das Nutzen von automatisierten Tests kann sichergestellt werden, dass bestehende Funktionalität erhalten bleibt, während der Code verbessert wird.
💡 Merke: „Refactoring ist wie Hausputz – je regelmäßiger man es macht, desto weniger Chaos gibt es später!“
Wir sind darum bemüht die angebotenen Informationen aktuell zu halten und diese in knapper und verständlicher Form darzustellen. Fehler und Irrtümer bleiben aber menschlich und darum vorbehalten. Bei Unstimmigkeiten zu einem Begriff, bitten wir darum dies per E-Mail mit uns zu diskutieren. Bitte nutze hierfür unsere E-Mail: info@jupiterexpress.de« Zurück zum Glossar Index