gpt4 book ai didi

kotlin - 通过顺序多米诺骨牌操作列表管理对象的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-05 08:28:55 24 4
gpt4 key购买 nike

假设我们有一个 Order 类和一个方法,其中一些服务进行一系列操作

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)

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
}

此代码中存在某种重复,因此下一步是使此功能对扩展开放,对修改关闭。我将 IOrderService 的所有实例添加到一个列表中,因此函数会像

fun doStuff(order: Order): Order {

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

这个解决方案非常好,因为如果我想添加另一个实现操作功能的服务,这很容易做到。

但是有一个问题.. 在最后一个解决方案中传递的订单对象对于所有服务都是相同的,所以提出的解决方案与第一个实现不同。每个服务都需要根据之前的结果

操作函数

所以我在这一点上很困惑,因为我想找到一个干净的解决方案..我在考虑一些设计模式,例如 Observer(但这是一对多的解决方案,事实并非如此)Memento 模式(但我可能会继续使用顺序操作列表),发布订阅...但我认为这些都不是正确的选择。这就像多米诺骨牌,其中对象被传递给第一个服务,结果传递给第二个服务,等等,当然还有 doStuff 方法返回的最终结果。

有什么建议可以完成最后一段代码吗?非常感谢!

最佳答案

我认为您确实将所有这些模式复杂化了。你描述的是...只是一个简单的循环!

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 - 通过顺序多米诺骨牌操作列表管理对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73057568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com