Kotlin:
Рефакторинг

Как это сделать:

Вот фрагмент кода на Kotlin, демонстрирующий типичный недочет в коде и его рефакторинг. Мы начинаем с блока кода, который выполняет слишком много операций:

fun processOrders(orders: List<Order>) {
    for (order in orders) {
        print("Номер заказа: ${order.id}")
        // Расчет итоговой суммы заказа
        var total = 0.0
        for (item in order.items) {
            total += item.price
        }
        // Применение скидки
        if (order.customer.isVIP) {
            total *= 0.9
        }
        print("Итого: $total")
        // Дополнительная обработка...
    }
}

Рефакторинг для лучшей читаемости и разделения забот:

fun printOrderSummary(order: Order) {
    print("Номер заказа: ${order.id}")
    val total = calculateTotal(order)
    print("Итого: $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) }
}

Здесь нет примера вывода, поскольку мы не изменили функциональность, но читаемость и поддерживаемость кода значительно улучшились!

Глубокое погружение

Рефакторинг как концепция существует с тех пор, как началось программирование, но он действительно набрал обороты как дисциплина в 1990-х годах, особенно после того, как Мартин Фаулер опубликовал “Рефакторинг: Улучшение проекта существующего кода” в 1999 году. Эта книга дала название практике и определила организованный метод ее применения, включая каталог техник рефакторинга.

Сравнивая рефакторинг с альтернативами: можно переписать код с нуля (рискованно и затратно по времени) или просто делать дополнительные изменения (ведет к увеличению объема программного обеспечения и потенциальному техническому долгу). Рефакторинг занимает золотую середину - он модернизирует и очищает, сохраняя при этом риск на низком уровне.

С точки зрения реализации крайне важно иметь надежный набор тестов перед началом рефакторинга, чтобы убедиться, что вы случайно не измените поведение программы. Многие современные среды разработки (включая IntelliJ для Kotlin) имеют автоматизированные инструменты рефакторинга для переименования переменных, выделения методов и многого другого, что может ускорить процесс и уменьшить количество ошибок.

См. также