如何在Scala中扁平化箭头代码

15 浏览
0 Comments

如何在Scala中扁平化箭头代码

我知道错误代码是一种应该避免的反模式。

这个链接:

https://blog.codinghorror.com/flattening-arrow-code/

给出了几种修复方法。然而,在Scala中似乎不适用。特别是当我想在方法开始时根据某个条件提前返回,因为Scala不鼓励使用"return"关键字。

有没有一种优雅的方式允许我在Scala中做以下操作?

def someFunction(): Try[MyDataType] = {
  if(某个条件不满足){
    // 退出函数
  }
  // 进行实际工作
}

0
0 Comments

问题的出现的原因是代码中存在过多的嵌套箭头(arrow code),导致代码的可读性和可维护性变差。为了解决这个问题,可以使用单子(monadic)流程控制来简化代码结构。

例如,可以将代码划分为可以封装在块中的合理大小的功能单元,并使用单子流程控制来实现所需的结果。下面是一种实现方式:

def funcA(x: Thing): Either[FailState, NextThing] = ...
def funcB(x: NextThing): Either[FailState, NextNextThing] = ...
for{
  next <- funcA(thing)
  nextNext <- funcB(next)
  ...
} yield finalCalculation(stuff)

这种方式会在for推导式中的某个函数返回Left值时立即中断执行,因为Either现在是正确偏向(properly right biased)的。

通过使用单子流程控制,可以将原本嵌套的箭头代码转换为更易读和易维护的结构,提高代码的可读性和可维护性。该方法可以减少代码的复杂度,使代码更易于理解和调试。

0