Scala 复杂方法中局部def的良好实践

Scala 复杂方法中局部def的良好实践,scala,readability,Scala,Readability,我将要写一篇很长的文章,预计会超过130行。在Java中,我会编写一个公共方法和几个私有方法来将逻辑分割成更可读的代码段 但是,这些私有方法对于此类中的任何其他方法都没有用处,因此我希望将它们设置为公共方法的本地方法,因为Scala支持这一点。然而,在这种情况下,该方法甚至比没有局部def的方法还要长,而且因为我不需要多次调用这些局部函数,所以它似乎没有用 总而言之,我必须在两者之间做出选择 def method { def localDef1 = { // 20-30

我将要写一篇很长的文章,预计会超过130行。在Java中,我会编写一个公共方法和几个私有方法来将逻辑分割成更可读的代码段

但是,这些私有方法对于此类中的任何其他方法都没有用处,因此我希望将它们设置为公共方法的本地方法,因为Scala支持这一点。然而,在这种情况下,该方法甚至比没有局部def的方法还要长,而且因为我不需要多次调用这些局部函数,所以它似乎没有用

总而言之,我必须在两者之间做出选择

def method {
    def localDef1 = { 
        // 20-30 lines of code
    }
    def localDef2 = { 
        // 20-30 lines of code
    }
    def localDef3 = { 
        // 20-30 lines of code
    }
    // 30-40 lines of code calling localDef[1-3] once each
}


在可读性方面,这样的东西的最佳实践是什么?

这在很大程度上取决于个人编码风格偏好。如果事情变得太大,我倾向于使用
private def
s而不是local
def
s,但其他人可能不同意。@sjrd很好,我想知道是否有一个隐含的、普遍承认的约定。谢谢你的回答因为这些方法太长了,我猜你会想为它们编写测试-所以你必须选择选项2。@ChrisMartin Fair point!我想说的是,几乎总是可以有细粒度的聚焦函数。然后,唯一的挑战是将它们放在正确的位置,这取决于它们正在做什么,它们是否需要依赖项,它们是否保持状态等等。但好的一面是在Scala中,借助
隐式
参数,您可以通过隐式地将内容带到当前上下文来简化公共部分。伴生对象也是放置公共代码的好地方。在FP和Scala中,通过控制抽象进行泛化也是实现可重用性的一种受鼓励的方法。
def method {   
    // 30-40 lines of code calling privateDef[1-3] once each
}
private def privateDef1 = { 
    // 20-30 lines of code
}    
private def privateDef2 = { 
    // 20-30 lines of code
}
private def privateDef3 = { 
    // 20-30 lines of code
}