MST
星途 面试题库

面试题:Kotlin构建器模式与DSL结合优化复杂业务逻辑

在一个电商系统中,有一个订单生成模块,订单包含用户信息、商品列表、配送地址、支付方式等多个复杂信息。且订单生成过程有多种业务规则,如满减优惠、会员折扣等。请用Kotlin的构建器模式与DSL结合来优化订单生成的业务逻辑,阐述如何通过这种结合来提高代码的可读性、可维护性,并给出核心代码示例。
26.3万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

1. 构建器模式与DSL结合的优势

提高代码可读性

通过DSL,代码可以以一种更接近自然语言的方式编写,直观地表达订单生成的过程。例如,开发者可以像描述实际业务一样,按顺序指定用户信息、商品列表、配送地址和支付方式等,而无需关注复杂的对象创建细节。

提高代码可维护性

构建器模式将对象的构建过程封装起来,每个部分的构建逻辑可以独立修改和扩展。当业务规则(如满减优惠、会员折扣)发生变化时,只需在构建器的相应方法中进行修改,不会影响到其他部分的代码。DSL进一步增强了这种模块化,使得业务逻辑更加清晰,易于理解和维护。

2. 核心代码示例

// 定义订单数据类
data class Order(
    val userInfo: UserInfo,
    val productList: List<Product>,
    val shippingAddress: String,
    val paymentMethod: String,
    val discount: Double = 0.0
)

data class UserInfo(val name: String, val email: String)
data class Product(val name: String, val price: Double)

// 订单构建器
class OrderBuilder {
    private lateinit var userInfo: UserInfo
    private val productList = mutableListOf<Product>()
    private lateinit var shippingAddress: String
    private lateinit var paymentMethod: String
    private var discount: Double = 0.0

    fun userInfo(block: UserInfo.() -> Unit) {
        userInfo = UserInfo("default", "default@example.com").apply(block)
    }

    fun productList(block: MutableList<Product>.() -> Unit) {
        productList.apply(block)
    }

    fun shippingAddress(address: String) {
        shippingAddress = address
    }

    fun paymentMethod(method: String) {
        paymentMethod = method
    }

    fun applyDiscount(amount: Double) {
        discount = amount
    }

    fun build(): Order {
        return Order(userInfo, productList, shippingAddress, paymentMethod, discount)
    }
}

// DSL扩展函数
fun order(block: OrderBuilder.() -> Unit): Order {
    val builder = OrderBuilder()
    builder.apply(block)
    return builder.build()
}

fun main() {
    val order = order {
        userInfo {
            name = "John Doe"
            email = "john@example.com"
        }
        productList {
            add(Product("Laptop", 1000.0))
            add(Product("Mouse", 50.0))
        }
        shippingAddress = "123, Main St"
        paymentMethod = "Credit Card"
        applyDiscount(100.0)
    }
    println(order)
}

在上述代码中:

  • Order 数据类定义了订单所需的各种信息。
  • OrderBuilder 类负责构建 Order 对象,每个属性都有对应的设置方法。
  • 通过 order 扩展函数,使用DSL风格来调用 OrderBuilder 的方法,使得订单生成的代码更易读和维护。例如,在 main 函数中,以一种类似自然语言的方式创建了一个订单对象。