【问题标题】:Writing readable code using vavr Either in Kotlin while performing sequential operations在执行顺序操作时在 Kotlin 中使用 vavr Either 编写可读代码
【发布时间】: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> {}

我查看了 combiningchaining 两个。但是它们似乎都没有简化代码以提高可读性。我还在面向铁路的编程中查看了这个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


【解决方案1】:

您可以像这样一个接一个地嵌套地图,而不是嵌套地图:

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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多