【发布时间】:2022-07-25 04:52:10
【问题描述】:
我有以下使用 vavr 用 Kotlin 编写的代码。该函数一个接一个地执行一系列操作,如果其中一个操作失败,则返回错误。如果所有操作都成功,则返回 SuccessObject。左边被假定为错误,右边为成功流程。但是,由于所有 .map() 结构,此函数难以阅读。有没有办法简化这段代码使其更具可读性?
private fun performOperation(param: String): Either<Error, SuccessObject> {
return performValidation(param)
.map {
initiateOperation(param)
.map { result ->
oneMoreValidation(param, result.property)
.map { validationResult ->
updateDatabase(param, validationResult, result)
}
.getOrElseGet { error -> left(error) }
}
.getOrElseGet { error -> left(error) }
}
.getOrElseGet { error -> left(error) }
}
private fun performValidation(param: String): Either<Error, ValidationResponse> {}
private fun initiateOperation(param: String): Either<Error, InitOperationResponse> {}
private fun oneMoreValidation(param: String, property: String): Either<Error, OneMoreValidationResponse> {}
private fun updateDatabase(param: String, property: String, result: InitOperationResponse): Either<Error, SuccessObject> {}
我查看了 combining、chaining 两个。但是它们似乎都没有简化代码以提高可读性。我还在面向铁路的编程中查看了这个blog。但是所有方法都接受相同的参数。任何帮助将不胜感激。
编辑:
正如 VLAZ 和 Hinse 所指出的,.flatMap() 可以缓解这种情况。函数变为:
private fun performOperation(param: String): Either<Error, SuccessObject> {
return performValidation(param)
.flatMap {
initiateOperation(param)
.flatMap { result ->
oneMoreValidation(param, result.property)
.flatMap { validationResult ->
updateDatabase(param, validationResult, result)
}
}
}
}
这绝对是一个改进。但是该功能在缩进和重复使用.flatMap()方面仍然存在混乱。那么这是实现功能的公认方式还是可以改进?
【问题讨论】:
-
Either没有,flatMap()(或等效项)吗? -
是的,Vavr 的 Either 有一个
flatMap,它肯定会消除代码中的部分臃肿。如果您将map调用替换为flatMap,则可以删除所有getOrElseGet调用。 -
是的,没错。但这只是删除了与该函数的作用无关的一半代码。如果有很多操作要执行,它会变成
.flatMap()函数的缩进列表。 -
Vavr 是专门为 java 创建的,它与 Kotlin 配合得很好,但我认为更建议在 Kotlin 中使用 Arrow 而不是 Vavr。但是在您的情况下,这是您的代码组织的问题。在 FP 中,我们倾向于将我们的治疗分解为特定的方法。所以我认为将你的第一个 flatMap 的处理放在一个特定的方法中会更容易
标签: kotlin functional-programming either vavr