假设我们有一个Order类和一个方法,其中有services个类和方法生成一系列操作

fun doStuff(order: Order): Order {

val orderByServiceA = serviceA.operationA(order: Order)
val orderByServiceB = serviceB.operationB(orderByServiceA: Order)
val orderByServiceC = serviceC.operationC(orderByServiceB: Order)
return orderByServiceC
}

我创建了一个可以由服务实现的公共接口

interface IOrderService {
    fun operation(order: Order): Order
}

因此,上述方法成为

fun doStuff(order: Order): Order {

val orderByServiceA = serviceA.operation(order: Order)
val orderByServiceB = serviceB.operation(orderByServiceA: Order)
val orderByServiceC = serviceC.operation(orderByServiceB: Order)
return orderByServiceC
}

这段代码中有一些重复,所以下一步是使这个函数打开以进行扩展,关闭以进行修改.

fun doStuff(order: Order): Order {

orderServices.forEach { service ->
service.operation(order)
}
...
}

这个解决方案非常好,因为如果我想添加另一个实现operation function的服务,这很容易做到.

但有一个问题..最后一个解决方案中传递的order对象对于所有服务都是相同的,因此提出的解决方案与第一个实现不同.

所以我在这一点上很困惑,因为我想找到一个干净的解决方案..

对完成最后一段代码有什么建议吗?谢谢!

推荐答案

我认为你真的把所有这些模式都复杂化了.你所描述的是...只是一个简单的循环!

fun doStuff(order: Order): Order {
    var curr = order
    for (service in orderServices) {
        curr = service.operation(curr)
    }
    return curr
}

如果您喜欢函数式编程,则可以通过减少/折叠服务列表来更简单地解决该问题:

fun doStuff(order: Order): Order {
    return orderServices.fold(order) { o, svc -> svc.operation(o) }
}

有关fold():https://kotlinlang.org/docs/collection-aggregate.html#fold-and-reduce的更多信息,请参阅文档

Kotlin相关问答推荐

处理合成层次 struct 中的深层按钮以切换视图

捕捉异常是Kotlin协程中的反模式吗?

Kotlin 函数名后面的大括号是什么意思?

Spring Boot Kotlin 数据类未使用 REST 控制器中的默认值初始化

Kotlin 如何使用其 get 函数在内部检索映射值

kotlin 父类具有依赖于抽象变量的变量

如何连接两个 kotlin 流?

Kotlin 条件格式字符串

kotlin 单例异常是好是坏?

奇怪的 cotlin check Not Null 参数错误

OnClickListener 未在 ConstraintLayout 上触发

Kotlin RxJava 可空的错误

Fragment的onDestroy()中是否需要将ViewBinding设置为null?

Kotlin 中多个 init 块的用例?

jetpack compose 将参数传递给 viewModel

Gradle 同步失败:不支持的方法:KotlinPlatformContainer.supports()

为什么我在使用 Jetpack Compose clickable-Modifier 时收到后端内部错误:Exception during IR lowering error?

面临一些未知问题一些后端jvm内部错误

使用导航组件在不同的图形之间导航

在android java类中使用Kotlin扩展