如何在Scala中扁平化箭头代码
如何在Scala中扁平化箭头代码
我知道错误代码是一种应该避免的反模式。
这个链接:
https://blog.codinghorror.com/flattening-arrow-code/
给出了几种修复方法。然而,在Scala中似乎不适用。特别是当我想在方法开始时根据某个条件提前返回,因为Scala不鼓励使用"return"关键字。
有没有一种优雅的方式允许我在Scala中做以下操作?
def someFunction(): Try[MyDataType] = { if(某个条件不满足){ // 退出函数 } // 进行实际工作 }
问题的出现的原因是代码中存在过多的嵌套箭头(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)的。
通过使用单子流程控制,可以将原本嵌套的箭头代码转换为更易读和易维护的结构,提高代码的可读性和可维护性。该方法可以减少代码的复杂度,使代码更易于理解和调试。