Kotlin:
Refactoring

Wie geht das:

Hier ist ein Kotlin-Schnipsel, der einen häufigen Code-Geruch und seine überarbeitete Version zeigt. Wir beginnen mit einem Code-Stück, das zu viel macht:

fun processOrders(orders: List<Order>) {
    for (order in orders) {
        print("Order ID: ${order.id}")
        // Berechnung der Bestellsumme
        var total = 0.0
        for (item in order.items) {
            total += item.price
        }
        // Rabatt anwenden
        if (order.customer.isVIP) {
            total *= 0.9
        }
        print("Total: $total")
        // Weitere Verarbeitung...
    }
}

Überarbeitet für bessere Lesbarkeit und Trennung der Zuständigkeiten:

fun printOrderSummary(order: Order) {
    print("Order ID: ${order.id}")
    val total = calculateTotal(order)
    print("Total: $total")
}

fun calculateTotal(order: Order): Double {
    var total = order.items.sumOf { it.price }
    return if (order.customer.isVIP) total * 0.9 else total
}

fun processOrders(orders: List<Order>) {
    orders.forEach { printOrderSummary(it) }
}

Keine Beispiel-Ausgabe hier, da wir die Funktionalität nicht verändert haben, aber die Lesbarkeit und Wartbarkeit des Codes wurde enorm verbessert!

Tiefergehende Betrachtung

Refactoring als Konzept gibt es, seit es die Programmierung gibt, aber es hat sich vor allem in den 1990er Jahren als Disziplin durchgesetzt, besonders nachdem Martin Fowler “Refactoring: Improving the Design of Existing Code” im Jahr 1999 veröffentlicht hat. Dieses Buch gab der Praxis einen Namen und definierte eine organisierte Methode für ihre Anwendung, einschließlich eines Katalogs von Refactoring-Techniken.

Refactoring im Vergleich zu Alternativen: Man könnte den Code von Grund auf neu schreiben (riskant und zeitaufwendig) oder einfach additive Änderungen vornehmen (führt zu Softwareaufblähung und potenziellem Technologie-Schulden). Refactoring findet den Sweet Spot – es modernisiert und räumt auf, während es das Risiko gering hält.

Umsetzungstechnisch ist es essenziell, vor dem Beginn des Refactorings einen robusten Satz von Tests zu haben, um sicherzustellen, dass man das Verhalten des Programms nicht versehentlich ändert. Viele moderne IDEs (einschließlich IntelliJ für Kotlin) verfügen über automatisierte Refactoring-Tools zum Umbenennen von Variablen, Extrahieren von Methoden und mehr, was den Prozess beschleunigen und Fehler reduzieren kann.

Siehe auch